1 / 30

Междупроцесни комуникации

Междупроцесни комуникации. гл. ас. Моника Филипова ФМИ, Катедра Изчислителни системи. Аспекти при комуникация между процеси (Inter process communication или IPC) Предаване на данни между процесите Гарантиране на коректно взаимодействие на процесите Видове взаимодействия между процеси

lester-luna
Télécharger la présentation

Междупроцесни комуникации

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Междупроцесни комуникации гл. ас. Моника ФилиповаФМИ, Катедра Изчислителни системи

  2. Аспекти при комуникация между процеси (Inter process communication или IPC) • Предаване на данни между процесите • Гарантиране на коректно взаимодействие на процесите • Видове взаимодействия между процеси Процеси, конкуриращи се за общ ресурс Пример. Процеси P и Q, използващи обща променлива counter. Процес PПроцес Q 1.Чете counter в локална променлива pa. 2.Чете counter в локална променлива pb. 3. pb = pb + 2 4. Записва pb в counter. 5. pa = pa + 1 6. Записва pa в counter. • Проблемът се нарича състезание (race condition), а решението му -взаимно изключване (mutual exclusion).

  3. Процеси, извършващи обща работа • Производител-Потребител (Producer-Consumer) • Читатели-Писатели (Readers and Writers) • Задачата за обядващите философи (Dining Philosophers) • За коректното взаимодействие на процесите е необходима синхронизация (synchronization). • Механизми на ОС за решаване на IPC проблемите • Обща памет (Shared memory) • Семафори (Semaphores) • Съобщения (Message passing)

  4. Съдържание • Взаимно изключване чрез обща памет • Алгоритъм на Декер • Алгоритъм на Питерсон • Семафори • Взаимно изключване чрез семафори • Синхронизация чрез семафори • Съобщения • Адресиране на съобщенията • Буфериране на съобщенията

  5. Взаимно изключванеMutual exclusion Решение чрез обща памет

  6. Критичен участък (critical section) • Тази част от програмата, в която се осъществява достъп до обща памет или се вършат неща, които могат да доведат до състезание Дейкстра нарича критичен участък. • Процес е в критичния си участък, ако е започнал и не е завършил изпълнението му, независимо от състоянието си. Условия за избягване на състезанието • Във всеки момент най-много един процес може да се намира в критичния си участък. • Никой процес да не остава в критичния си участък безкрайно дълго. • Никой процес, намиращ се вън от критичния си участък, да не пречи на друг процес да влезе в своя критичен участък. • Решението не бива да се основава на предположения за относителните скорости на процесите.

  7. Алгоритъм с редуване на процесите #define TRUE 1 shared int turn=0;

  8. Алгоритъм на Декер shared int wants0=FALSE, wants1=FALSE; shared int turn=0;

  9. Алгоритъм на Питерсон shared int turn=0; shared int interested[2] = {FALSE, FALSE}; enter_region(int process) { int other; other = 1 - process; interested[process] = TRUE; turn = process; while (turn==process && interested[other]==TRUE); } leave_region(int process) { interested[process] = FALSE; }

  10. Недостатъци на алгоритмите за взаимно изключване • взаимно изключване само на два процеса • активно чакане (busy waiting)

  11. Семафори Взаимно изключване и синхронизация чрез семафори

  12. Семафорът е обект, който има • брояч - цяло неотрицателно число • списък на процеси в състояние блокиран по семафора • Операции над семафор • Инициализация semaphore s = n; • Операция провери - P(s)илиdown(s) P(s){ if ( s > 0 ) s = s - 1; else блокира процеса, изпълняващ P по семафора s; } • Операция увеличи - V(s)илиup(s) V(s){ if (има блокирани по семафора s процеси) събужда един процес; else s = s + 1; }

  13. Взаимно изключване на n процеса #define TRUE 1 semaphore mutex=1;

  14. Синхронизация чрез семафори • Операторите S1 в процеса P1 да се изпълнят преди S2 в P2 semaphore s=0;

  15. Производител - Потребител shared buffer buf; /* общ буфер с капацитет N елемента */ semaphore mutex=1; /* за взаимно изключване */ semaphore empty=N; /* броисвободните елементи в буфера */ semaphore full=0; /* броизапълненитеелементи в буфера*/

  16. Читатели - Писатели shared int rcount=0;/* бройпроцеси-читатели, коиточетат */ semaphore mutex=1;/* управлявадостъпадо rcount */ semaphore db=1;/* управлявадостъпадобазата данни */

  17. Задача за обядващите философи • Философът мисли или се храни • Нужни са му 2 вилици за да се храни • Взима вилиците една по една • Как да се избегне дедлок или "гладна смърт"?

  18. Задача за обядващите философи (първи вариант) #define N 5 /* броя на философите */ philosopher(int i) /* i е номер на философа */ { while(TRUE) { think(); take_fork(i); /* взима лявата вилица, като чака докато тя стане свободна */ take_fork((i+1)%N); /*взима дясната вилица, като също чака */ eat(); put_fork(i); /* връща лявата вилица */ put_fork((i+1)%N); /* връща дясната вилица */ } }

  19. Задача за обядващите философи (втори вариант) #define N 5 #define LEFT (i-1)%N /* номер на левия съсед на i */ #define RIGHT (i+1)%N /* номер на десния съсед на i */ #define THINKING 0 /* философът мисли */ #define HUNGRY 1 /* опитва се да вземе вилици */ #define EATING 2 /* философът се храни */ shared int state[N]={0,0,0,0,0}; /* състояния */ semaphoremutex=1; /* взаимно изключване на state[N]*/ semaphore s[N]={0,0,0,0,0}; /* по един на философ */ philosopher(int i) { while(TRUE) { think(); take_forks(i); eat(); put_forks(i); } }

  20. test(int i) { if(state[i]==HUNGRY&&state[LEFT]!=EATING&&state[RIGHT]!=EATING) { state[i] = EATING; V(s[i]); } }

  21. Методи за междупроцесни комуникации • Чрез обща памет и семафори • Двата аспекта на комуникацията - предаването на данните и синхронизацията, се решават с различни механизми. • Отговорността за комуникацията е на програмиста. • Този метод не е безопасен. • Чрез съобщения • Двата аспекта на комуникацията се решават от механизма. • Отговорността за комуникацията е на ОС. • Този метод е по-безопасен.

  22. Съобщения Междупроцесни комуникации чрез съобщения

  23. Между процесите се установява комуникационна връзка. • Процесите обменят събщения чрез примитиви: send(destination, message) receive(source, message) 1. Как се установява комуникационна връзка между процесите? 2. Може ли една комуникационна връзка да свързва повече от два процеса? 3. Колко комуникационни връзки може да има между два процеса? 4. Еднопосочна или двупосочна е комуникационната връзка? 5. Какво е капацитет на комуникационната връзка? 6. Има ли някакви изисквания за размер и/или структура на съобщенията предавани по определена комуникационна връзка?

  24. Адресиране на съобщенията • Директна комуникация Всеки процес именува явно другия процес в примитива. Процес P Процес Q send(Q, message);receive(P, message); 1. Комуникационната връзка се установява автоматично между двойката процеси, но всеки от тях трябва да знае идентификатора на другия. 2. Комуникационната връзка свързва точно два процеса. 3. Между всяка двойка процеси може да има само една комуникационна връзка. 4. Комуникационната връзка е двупосочна. • Асиметричен вариант на директна комуникация receive(ANY, message);

  25. Адресиране на съобщенията • Косвена комуникация Съобщения се изпращат в иполучават от специален обект: • пощенска кутия (mailbox) • опашка на съобщенията (message queue) Процес P Процес Q send(A, message);receive(A, message); 1. Комуникационната връзка се установява между процесите когато те използват обща пощенска кутия. 2. Комуникационната връзка може да свързва и повече от два процеса. 3. Между два процеса може да съществува повече от една комуникационна връзка. 4. Комуникационната връзка може да е еднопосочна или двупосочна.

  26. Буфериране на съобщенията • Съобщения без буфериране Процесите изпращач и получател се синхронизират в момента на предаване на всяко съобщение. Предаване на съобщения по метода на рандеву. • Съобщения с автоматично буфериране Определен брой (обем) изпратени и още неполучени съобщения временно се съхраняват в комуникационната връзка. • След като изпълни send, изпращачът не може да знае дали съобщението му е получено.

  27. Примери за реализации на съобщения UNIX System V • Косвена комуникация - опашка на съобщенията • Автоматично буфериране • Структура на съобщение struct msgbuf { long mtype;/* тип на съобщение*/ char mtext[N];/* текст на съобщение */}; • Опашка на съобщениясе създава с примитив msgget. • Процесът-собственик на опашката определя правата на другите процеси. • Опашка се унищожава явно с примитивmsgctl. • Съобщение се изпраща или получава с примитивите msgsndи msgrcv. • Няколко потока за предаване на съобщения в рамките на една опашка (двупосочна комуникационна връзка).

  28. Примери за реализации на съобщения MINIX • Директна комуникация • Без буфериране • Събщения с фиксирана дължина UNIX, MINIX, LINUX • Програмен канал (pipe) – комуникация между "родствени" процеси • FIFO файл - комуникация между "независими" процеси Чрез програмен канал се предава неформатиран поток от байтове, т.е. няма граници между "съобщенията".

  29. Пример. Производител-Потребител чрез съобщения #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <signal.h> struct msgb{ long mtype; char mtext[256]; }; int mid; void cleanup() { if ( msgctl(mid, IPC_RMID, 0) == -1 ) { perror( "Msgctl failed"); exit(1); } printf("MQ destroyed\n"); exit(0); }

  30. main(void) { struct msgb msg; int i, j, buf; if (( mid=msgget(24, IPC_CREAT|0666)) == -1 ) { perror("Msgget failed"); exit(1); } signal(SIGINT, cleanup); if ( fork() ) { /* parent - consumer */ for ( i=0; ; i++ ) { msgrcv(mid, &msg, 256,1,0); buf = *((int*)msg.mtext); buf *= 2; printf("Consumer: %d\n", buf); } } else { /* child - producer */ signal(SIGINT, SIG_DFL); for (i=0; ; i++) { for ( j=0; j<100000; j++ ); msg.mtype = 1; *(int*)msg.mtext = i; msgsnd(mid, &msg,sizeof(int), 0);} } }

More Related