DevioLabавтоматичне керування капіталом
ПРАЦЮЄ 24/7
КРИПТОВАЛЮТИ · АКЦІЇ · 10 БІРЖ

Портфель, який керується автоматично

DevioLab підбирає стратегії, відстежує ринки та автоматизує купівлю і продаж активів. Кількість доступних криптовалют, акцій і торгових можливостей зростає щодня.

10підключених біржCrypto + Stocksв одному портфелі24/7автоматичний контроль

Паралельні асинхронні процеси в ОС UNIX

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Інститут комп’ютерних наук та інформаційних технологій
Факультет:
Комп’ютерні науки
Кафедра:
Кафедра електронних обчислювальних машин

Інформація про роботу

Рік:
2016
Тип роботи:
Лабораторна робота
Предмет:
Організація обчислювальних процесів у паралельних системах
Група:
КН-1
Коротко про документ

Про що ця робота

У лабораторній роботі досліджено концепцію паралельних процесів в операційній системі UNIX. Розроблено та протестовано програми на мові C для створення батьківського та дочірніх процесів за допомогою системних викликів fork та exec.

У роботі розглядаються

  • Операційна система UNIX
  • Паралельні процеси
  • Системний виклик fork
  • Системний виклик exec
  • Контекст процесу
  • Ідентифікатор процесу PID
  • Керування процесами в C

Зміст і розділи

  1. Мета роботи
  2. Завдання
  3. Теоретичні відомості
  4. Лістинг програми : child.c
  5. parent.c
  6. Результати виконання
  7. Висновок
Для кого:Студенти технічних спеціальностей вищих навчальних закладів, що вивчають операційні системи та паралельні обчислення.
Викладачі:Бочкарьов

Ключові поняття

процесконтекст процесуPIDPPIDforkexecсистемний викликбатьківський процесдочірній процесexitsleep

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» Кафедра ЕОМ  Лабораторна робота №1 З дисципліни: «Організація обчислювальних процесів в паралельних системах» На тему: «Паралельні асинхронні процеси в ОС UNIX» Львів-2016 Мета роботи: Засвоїти основи паралельних обчислень. Завдання: Написати батьківську програму (parent.c) яка буде запускати синівський процес, який в свою чергу буде запускати ще один синівський (по відношенню до нього) процес і так далі. В результаті повинно запуститися ланцюжок з N синівських процесів, кожен з яких повинен знати свою глибину у дереві процесів. Теоретичні відомості Уся побудова операційної системи UNІX заснована на використанні концепції процесів. Контекст процесу складається з контексту користувача і контексту ядра. Під контекстом користувача розуміють код і дані, розташовані в адресному просторі процесу. Під поняттям "контекст ядра" поєднуються системний контекст і реєстровий контекст. Ми будемо виділяти в контексті ядра стек ядра, що використовується при роботі процесу в режимі ядра (kernel mode), і дані ядра, які зберігаються в структурах, що є аналогом блоку керування процесом - PCB. В дані ядра входять: ідентифікатор користувача - UІD, груповий ідентифікатор користувача - GІD, ідентифікатор процесу - PІD, ідентифікатор батьківського процесу - PPІD. Кожен процес в операційній системі отримує унікальний ідентифікаційний номер - PІD (process іdentіfіcator). При створенні нового процесу операційна система намагається привласнити йому вільний номер більший, ніж у процесу, створеного перед ним. Якщо таких вільних номерів не виявляється (наприклад, ми досягли максимально можливого номера для процесу), то операційна система вибирає мінімальний номер із усіх вільних номерів. В операційній системі UNІX усі процеси, крім одного, що створюється при старті операційної системи, можуть бути породжені тільки іншими процесами. Як прабатька всіх інших процесів у подібних UNІX системах можуть виступати процеси з номерами 1 чи 0. Системний виклик fork приводить до створення нового процесу (породженого процесу) – майже точної копії процесу, що зробив виклик (батьківського процесу). У породженого процесу в порівнянні з батьківським змінюються значення наступних параметрів: - ідентифікатор процесу (pid); - ідентифікатор батьківського процесу (ppid); - час, що залишився до одержання сигналу SІGALRM; - сигнали, що очікували доставки батьківському процесу, не будуть доставлятися породженому процесу. При успішному завершенні породженому процесу повертається 0, а батьківському процесу повертається ідентифікатор породженого процесу. У випадку помилки батьківському процесу повертається -1, не створюється нового процесу і змінній err noприсвоюється код помилки. Усі форми системного виклику exec заміщують процес, що викликав, новим процесом, який завантажується зі звичайного виконавчого файлу. Якщо системний виклик exec закінчився успішно, то він не може повернути керування, тому що процес, що викликав, уже замінений новим процесом. Повернення із системного виклику exec свідчить про помилку. У такому випадку результат дорівнює -1, а змінній err noприсвоюється код помилки. Системний виклик getpіd повертає ідентифікатор поточного процесу. Системний виклик getppіd повертає ідентифікатор батьківського процесу. Системний виклик ехіt завершує процес, що звернувся до нього Виклик sleep. Виконання процесу припиняється на задане аргументом seconds число секунд. Лістинг програми : Child.c #include <unistd.h> #include <stdio.h> #include <stdlib.h> #define SLEEP_TIME 5 #define ITERATION_NUM 7 void main(void) { int i = 0; int mPid = getpid(); int pPid = getppid(); printf("Child: My PID = %d, My parent's PID = %d\n\n", mPid, pPid); for(i; i < ITERATION_NUM; i++) { printf("CHILD now is working.\n"); sleep(SLEEP_TIME); //for(j=0;j<1000000;j++); } exit(0); } Parent.c #include <unistd.h> #include <sys/wait.h> #include <stdio.h> #define SLEEP_TIME 5 #define ITERATION_NUM 7 void main(void) { int i = 0; int errFlag; int cPid = fork(); int mPid = getpid(); int pPid = getppid(); switch(cPid) { case -1: fprintf(stderr,"Can't fork for a child.\n"); exit(1); case 0: errFlag = execl("./child","child",0); if(errFlag == -1) { printf(stderr, "Can't execute the external child.\n"); exit(1); } break; default: printf("Parent: My Pid = %d, " "Parent Pid = %d, " "Child Pid = %d\n", mPid, pPid, cPid); for(i; i < ITERATION_NUM; i++) { printf("PARENT now is working.\n"); sleep(SLEEP_TIME); //for(j=0;j<1000000;j++); } int status; wait(&status); printf("Parent: Child exit code is %d.\n",(status&0xff00)>>8); exit(0); } } Результати виконання :  Висновок: при виконанні даної лабораторної роботи я ознайомився з механізмом паралельної роботи в ОС UNIX, та навчився створювати паралельні процеси.
Допоможи студентському архіву

Ми допомогли тобі — допоможи наступному студенту

Файл ще не обрано

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!