Організація обчислювальних процесів в паралельних системах

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

ВУЗ:
Національний університет Львівська політехніка
Інститут:
IKTA
Факультет:
EOM
Кафедра:
EOM

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

Рік:
2014
Тип роботи:
Розрахункова робота
Предмет:
Організація обчислювальних процесів у паралельних системах
Група:
KCMm

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» Кафедра ЕОМ  Лабораторна робота №1 З дисципліни: «Організація обчислювальних процесів в паралельних системах» На тему: «Паралельні асинхронні процеси в ОС UNIX» Мета роботи: Засвоїти основи паралельних обчислень. Завдання: Написати батьківську програму (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 число секунд. Лістинг програми : Chld.c #include<stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> int main(intargc, char **argv) { //породити новий дочірній процес intiChldPid=fork(); printf("fork executed\n"); char * s; inti=0; intinum; int status; intiNextNum; char by tearr[10]; intiMyPid=getpid(); intiParentPid = getppid(); //визначити місце процесу в ієрархії процесів if ((argc==1)&&(iChldPid!=0)) { printf("-Child Parent is working.\n"); printf("-Child Parent: My PID = %d Child PID = %d\n",iMyPid,iChldPid); } else if ((argc>1)&&(iChldPid==0)) { inum=atoi(argv[1]); iNextNum=inum+1; printf("--iNextNum: %d\n",iNextNum); printf("--Child %d: iMyPID = %d iParent PID = %d iChild PID = %d\n",inum,iMyPid,iParentPid,iChldPid); } else if ((argc==1)&&(iChldPid==0)) { printf("---First Child is running\n"); inum=0; iNextNum=1; printf("---First Child %d: iMyPID = %d iParent PID = %d iChild PID = %d\n",inum,iMyPid,iParentPid,iChldPid); } //замінити дочірній процес switch (iChldPid) { case -1://помилка у батька fprintf(stderr,"Can't fork for a child.\n"); exit(1); case 0://синівський процес if (inum<10) { sprintf(bytearr,"%d",iNextNum); //printf("Byte arr : %s\n",bytearr); fflush(stdout); intiErrFlag = execl("./chld","*chld",bytearr,0);//тут завантаж проги в дочірній процес if (iErrFlag == -1) { printf("Can't execute the external child. Reported by Child %d.\n",inum); exit(inum+10); } } break; default: waitpid(iChldPid,&status,0); printf("Parent :Childs exit code is:%d.\n",(status&0xff00)>>8); exit(0); } } Prnt.c #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<sys/wait.h> void main(intargc, char** argv ) { intiChldPid=fork(); intstatus; printf("ParentForkexecuted\n"); intiMyPid=getpid(); intiParPid=getppid(); switch (iChldPid) { case -1: fprintf(stderr,"Cantforkfor a child\n"); exit(1); case 0: fflush(stdout); intiErrFlag = execl("./chld","*chld",0); if (iErrFlag == -1) { printf("Can'texecutetheexternalchild. ReportedbyParent\n"); exit(1); } break; default: waitpid(iChldPid,&status,0); printf("Childexitcodeis: %d\n",(status&0xff00)>>8); exit(0); } return; } Результати виконання : ParentForkexecuted ParentForkexecuted forkexecuted ---First Childisrunning ---First Child 0: iMyPID = 4256 iParent PID = 4255 iChild PID = 0 forkexecuted -Child Parentisworking. -Child Parent: My PID = 4255 Child PID = 4256 forkexecuted --iNextNum: 2 --Child 1: iMyPID = 4257 iParent PID = 4256 iChild PID = 0 forkexecuted forkexecuted --iNextNum: 3 --Child 2: iMyPID = 4258 iParent PID = 4257 iChild PID = 0 forkexecuted forkexecuted --iNextNum: 4 --Child 3: iMyPID = 4259 iParent PID = 4258 iChild PID = 0 forkexecuted forkexecuted --iNextNum: 5 --Child 4: iMyPID = 4260 iParent PID = 4259 iChild PID = 0 forkexecuted forkexecuted --iNextNum: 6 --Child 5: iMyPID = 4261 iParent PID = 4260 iChild PID = 0 forkexecuted forkexecuted --iNextNum: 7 --Child 6: iMyPID = 4262 iParent PID = 4261 iChild PID = 0 forkexecuted forkexecuted --iNextNum: 8 --Child 7: iMyPID = 4263 iParent PID = 4262 iChild PID = 0 forkexecuted forkexecuted --iNextNum: 9 --Child 8: iMyPID = 4264 iParent PID = 4263 iChild PID = 0 forkexecuted --iNextNum: 10 --Child 9: iMyPID = 4265 iParent PID = 4264 iChild PID = 0 forkexecuted --iNextNum: 11 --Child 10: iMyPID = 4266 iParent PID = 4265 iChild PID = 0 forkexecuted Parent :Childsexitcodeis:60. forkexecuted Parent :Childsexitcodeis:0. forkexecuted Parent :Childsexitcodeis:0. Parent :Childsexitcodeis:0. Parent :Childsexitcodeis:0. Parent :Childsexitcodeis:0. Parent :Childsexitcodeis:0. Parent :Childsexitcodeis:0. Parent :Childsexitcodeis:0. Parent :Childsexitcodeis:0. Parent :Childsexitcodeis:0. Childexitcodeis: 0 Висновок: при виконанні даної лабораторної роботи я ознайомився з механізмом паралельної роботи в ОС UNIX, та навчився створювати паралельні процеси.
Антиботан аватар за замовчуванням

08.08.2014 14:08-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

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

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

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

Admin

26.02.2023 12:38

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