c Wies law P laczek 18 5 Semafory 5.1 Poj ecia ogólne Semafor pierwszymechanizmsynchronizacyjnywj ezykach wysokiego poziomu (Dijkstra 1965). semaphore semaphore S; Operacje na semaforze: abstrakcyjny typ danych; zmienna S jest semaforem. podniesienie (zwolnienie) semafora: V (hol. vrijmaken) opuszczenie (zaj ecie) semafora: P (hol. passeren). Poniżej podajemy tzw. definicje praktyczne postawowych rodzajów semaforów. (i) Semafor ogólny (licz acy) S zmienna ca lkowita nieujemna. P (S): jeśli S>0 to S := S 1 w przeciwnym razie wstrzymaj dzia lanie procesu wykonuj acego t eoperacj e. V (S): jeśli s aprocesywstrzymanewwynikuoperacjiopuszczaniasemaforas to wznów jeden z nich w przeciwnym razie S := S +1. (ii) Semafor binarny S =0/1 (false/true). Operacje: PB(S) VB(S). Uwaga: Semafor binarny nie pami eta liczby wykonanych operacji VB; czasem przyjmuje si e że VB(S =1)! b l ad! (iii) Semafor dwustronnie ograniczony 0 apple S apple N PD(S) VD(S) opuszczanie podnoszenie symetryczne tzn. VD(S = N) dzia lajakpd(s =0). (iv) Semafor uogólniony Zmiana S odowoln aliczb enaturaln a n. PG(S n): jeśli S n tos := S n wprzeciwnymraziewstrzymajdzia lanie procesu wykonuj acego t eoperacj e. VG(S n): jeśli s aprocesywstrzymanewwynikuwykonywaniaoperacjipg(s m) przy czym m apple S + n towznówjedenznichis := S m + n wprzeciwnym razie S := S +1.
c Wies law P laczek 19 PRZYK LAD: Wzajemne wykluczanie Zadanie zsynchronizowania procesów wymagaj acych wy l acznego dost epu do pewnego zasobu dzielonego (fragment procesu w którym korzysta on z zasobu dzielonego nazywa si e sekcj a krytyczn a tego procesu). binary semaphore S = 1; /* Semafor binarny do synchronizacji procesow */ /* Proces P_i */ do { /* Wlasne sprawy */ PB(S); /* Sekcja krytyczna */ VB(S); /* Reszta */ } while (1); 5.2 Semafory w Uniksie: System V 5.2.1 Podstawowe w lasności Operacje P i V typu: P (S n) iv (S n) tzn. semafor uogólniony. Operacja Z(S): Wstrzymanie dzia lania procesu do momentu aż S b edzie równe zeru. Wykonanie Z(S) nie zmienia wartości semafora. Jeśli S =0towznawianes a wszystkie procesy wstrzymane przez Z(S).! Jest to tzw. bariera mechanizmsynchronizacyjnystosowanycz esto dla w atków w procesorach graficznych (GPU). Nieblokuj ace operacje P i Z: np i nz Jeśli proces nie może natychmiast wykonać ż adanej operacji to rezygnuje z jej wykonania a odpowiednia funkcja sygnalizuje o porażce. Jednoczesne (wektorowe) operacje semaforowe: W Uniksie można wykonywać jednocześnie operacje na wielu semaforach przy czym każda z nich może być inna. a) Jeśli żadna z operacji nie jest operacj anieblokuj ac a to wykonanie operacji jednoczesnej zakończy si edopierowtedygdyb edzie można wykonać wszystkie operacje sk ladowe. b) Jeżeli chociaż jedn azoperacjisk ladowychjestoperacjanieblokuj aca (np lub nz) to ca la operacja jest również nieblokuj aca. Przy czym jeżeli chociaż jedna z operacji sk ladowych nie może być wykonana natychmiast to żadna z operacji nie jest wykonywana a odpowiednia funkcja sygnalizuje o porażce.
c Wies law P laczek 20! Zapis przyk lady: [V(S1)P(S23)Z(S3)] operacja blokuj aca [np(s1)z(s2)v(s32)] operacja nieblokuj aca Funkcje na semaforach: V alue(s) wartość semafora S; W aitp (S) liczba procesów czekaj acych pod semaforem S na wykonanie operacji P ; W aitz(s) liczba procesów czekaj acych pod semaforem S na wykonanie operacji Z. 5.2.2 Realizacja Wj ezyku C (C++) trzeba w l aczyć pliki nag lówkowe: #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> 1. Zbiory semaforów W Uniksie można tworzyć zbiory semaforów. W każdym zbiorze semafory s aponumerowane kolejnymi liczbami ca lkowitymi nieujemnymi (tzn. 0 1...n). Operacje jednoczesne na kilku semaforach można wykonywać tylko na semaforach należ acych do tego samego zbioru. Do tworzenia lub odwo lywania si e do zbioru semaforów potrzebny jest tzw. klucz b ed acy liczb aca lkowit a. Jak tworzyć jednoznaczne klucze?! Np. przy pomocy funkcji ftok: Pliki w l aczane <sys/types.h> <sys/ipc.h> Prototyp key t ftok(const char *path int id); wartość Wartość klucza 1 Nie path ścieżkowanazwaistniej acego pliku dost epnego procesowi id zwyklepojedynczyznakktóryjednoznacznieidentyfikujeprojekt. Dzia lanie: Woparciuopath i id funkcja ftok zwraca ca lkowitoliczbowy klucz którymoże być użyty do tworzenia lub odwo lywania si edozbiorusemaforów. Np. key t key; key = ftok("." A );
c Wies law P laczek 21 Użyteczne komendy: ipcs -s podaje informacj ent.aktywnychsemaforów(patrzman ipcs); ipcs -sl podaje informacj ent.ograniczeńsystemowychdt.semaforów; ipcrm sem semid usuwa zbiór semaforów o numerze semid. 2. Tworzenie (uzyskiwanie dost epu do) zbioru semaforów: semget Pliki w l aczane <sys/types.h> <sys/ipc.h> <sys/sem.h> Prototyp int semget(key t key int nsems int semflg); wartość Identyfikator semafora 1 Tak key klucz do zbioru semaforów (różne procesy które chc akorzystaćztego samego zbioru musz aużyćtegosamegoklucza); nsems liczba semaforów w zbiorze; semflg flaga określaj aca sposób wykonania funkcji i prawa dost epu do semaforów: IPC CREAT utworzenie zbioru semaforów jeśli nie istnieje lub uzyskanie dost epu do istniej acego już zbioru IPC EXCL użyta w po l aczeniu z IPC CREAT zwraca b l ad jeżeli dla danego klucza istnieje już zbiór semaforów Prawa dost epu podobnie jak dla plików np. 0666: możliwość wykonywania wszystkich operacji przez wszystkie procesy (prawo czytania możliwośćodczytustanusemafora prawo pisania możliwość zmiany wartości semafora). Powyższe znaczniki można l aczyć ze sob a sum a bitow a np. IPC CREAT 0666. PRZYK LAD: key t key; int semid; key = ftok("." A ); semid = semget(key3ipc CREAT 0666)! Utworzenie zbioru 3 semaforów dla klucza key (lub uzyskanie dost epu do zbioru jeżeli takowy już istnieje) i przypisanie zmiennej semid identyfikatora tego zbioru. 3. Sterowanie semaforami: semctl semid identyfikator zbioru semaforów (zwracany przez semget) semnum numer semafora w zbiorze cmd kod polecenia arg parametry polecenia.
c Wies law P laczek 22 Pliki w l aczane Prototyp <sys/types.h> <sys/ipc.h> <sys/sem.h> int semctl(int semid int semnum int cmd /* union semun arg */...); wartość 0lubwartośćż adana przez cmd 1 Tak #ifdef _SEM_SEMUN_UNDEFINED union semun { int val; /* wartosc dla SETVAL */ struct semid_ds *buf; /* bufor dla IPC_STAT IPC_SET */ unsigned short *array; /* tablica dla GETALL SETALL */ struct seminfo * buf; /* bufor dla IPC_INFO (specyfika Linuksa) */ }; #endif Wstarszychwersjachbibliotekiglibc unia semun by la zdefiniowana w pliku nag lówkowym <sys/sem.h> alewnowych stosuj acych si edostandarduposix.1-2001 wymagana jest definicja tej unii przez użytkownika. Tam gdzie unia semun jest niedost epna zdefiniowane jest makro SEM SEMUN UNDEFINED. Dlategoprzydefiniowaniu tej unii w swoim programie dobrze jest zastosować dyrektyw epreprocesora jak w powyższym przyk ladzie. Polecenia cmd (ważniejsze): SETVAL zainicjowanie semafora o numerze semnum wartości aprzekazan aprzypomocy zmiennej arg.val SETALL zainicjowanie wszystkich semaforów w zbiorze wartościami przekazanymi przy pomocy tablicy arg.array GETVAL odczytanie wartości semafora o numerze semnum GETNCNT odczytanie liczby procesów czekaj acych na podniesienie semafora o numerze semnum (wstrzymanych przez P (S)) GETZCNT odczytanie liczby procesów czekaj acych na opuszczenie semafora o numerze semnum (wstrzymanych przez Z(S)) IPC RMID usuni ecie danego zbioru semaforów. 4. Operacje na semaforach: semop Pliki w l aczane <sys/types.h> <sys/ipc.h> <sys/sem.h> Prototyp int semop(int semid struct sembuf *sops size t nsops); wartość 0 1 Tak
c Wies law P laczek 23 semid identyfikator zbioru semaforów sops wskaźnik do tablicy struktur określaj acej operacje na zbiorze semaforów nsops liczba semaforów (elementów tablicy) na których ma być wykonana operacja. struct sembuf { ushort sem_num; /* numer semafora w zbiorze */ short sem_op; /* rodzaj operacji na semaforze */ ushort sem_flg; /* znacznik operacji */ }; Operacje: Znaczniki: 8 < > 0: operacja V(sem num sem op) sem op < 0: operacja P(sem num sem op) : =0: operacja Z(sem num). 0 : operacja blokuj aca sem flg = IPC NOWAIT : operacja nieblokuj aca. Powyższe znaczniki można l aczyć sum abitow azeznacznikiemsem UNDO. Jeżeli znacznik ten jest ustawiony to system utrzymuje dodatkowo dla procesu specjalny licznik undo wktórymzapami etywane s aoperacjewykonywaneprzeztenproces na danym semaforze. Daje to systemowi możliwość cofni ecia operacji semaforowych wykonanych przez proces który zakończy l si eniepowodzeniem. Mechanizmten pozwala unikać zakleszczeń powodowanych przez niew laściwe zakończenie procesu korzystaj acego z semaforów. Niektóre przyczyny porażki: (i) Przynajmniej jedna z operacji sk ladowych operacji wektorowej jest nieblokuj aca aoperacjiniemożnawykonaćnatychmiast. (ii) Operacja V (S) spowodowa labyprzekroczeniegórnegoograniczeniawartościsemafora. Wnowszychwersjachsystemówuniksowych(np.wLinuksieodwersjij adra 2.6) dost epne s asemaforydlaprocesówiw atków standardu POSIX. Maj aoneprostszyiwygodniejszy interfejs niż semafory Systemu V ale s aodnichmniejuniwersalneis labiej rozpowszechnione. Szczegó ly na ich temat można znaleźć w man sem overview.
c Wies law P laczek 24 ĆWICZENIE 6: Wzajemne Wykluczanie dla Procesów: Semafory Przy pomocy semaforów Systemu V UNIX zaimplementować zadanie wzajemnego wykluczania dla procesów. Czas operacji na wspólnym zasobie symulować używaj ac np. funkcji sleep. Dla demonstracji poprawności dzia lania programu użyć odpowiednich komunikatów wypisywanych przez poszczególne procesy przed w trakcie i po sekcji krytycznej oraz funkcji podaj acych stan semafora i liczb e procesów pod nim czekaj acych. Pami etać o zainicjowaniu semafora odpowiedni awartości a zaraz po jego utworzeniu. Stworzyć w lasn a bibliotek e prostych w użyciu funkcji do: tworzenia uzyskiwania dost epu inicjowania sterowania operowania i usuwania semaforów (korzystaj acych z odpowiednich funkcji systemowych ale ukrywaj acych ich szczegó ly techniczne). Napisać specjalny program do powielania procesów realizuj acych wzajemne wykluczanie w oparciu o funkcje fork i exec (nazw e programu do inicjowania procesów oraz liczb e procesów można przekazywać przez argumenty programu powielacza ). Program ten powinien na pocz atku utworzyć i zainicjować semafor a na końcu go usun ać (kiedy wszystkie jego procesy potomne zakończ aswojedzia lanie).