Semafory Autorzy : Michał Winciorek Łukasz Jackowicz
Pojęcia wstępne proces procesy współbieżne (rys a i b)
Procesy mogą ze sobą współpracować lub współzawodniczyć. komunikacja synchronizacja program współbieżny - składa się z kilku sekwencyjnych procesów, w których wykonywanie poszczególnych instrukcji może być przeplatane, lecz same procesy muszą się ze sobą komunikować by synchronizować działanie bądź wymieniać dane.
Blokada i zagłodzenie zasób dzielony sekcja krytyczna blokada – wstrzymana grupa procesów, oczekujących na zdarzenie, które może zapoczątkować tylko jakiś inny proces z tej grupy ang. deadlock
Semafor zagłodzenie – nieskończone wstrzymywanie procesu przez wykonywanie innych, współbieżnych do niego procesów Semafor stanowi mechanizm synchronizacji procesów, przeciwdziała wystąpieniu zjawisk blokady i zagłodzenia definicja semafora ogólnego S – zmienna całkowita, nieujemna, o nadanej pewnej wartości początkowej
dozwolone operacje na semaforach Czekaj(S). Jeśli S>0 to S:=S-1, Jeśli nie to wstrzymaj wykonanie procesu. Taki proces nazywamy wstrzymanym przez semafor S. Sygnalizuj(S) Jeśli są procesy wstrzymane przez ten semafor, to wznów jeden z nich, Jeśli nie to S:=S+1. własności semafora Czekaj(S) i Sygnalizuj(S) to operacje atomowe Niezmienniki : a) S >= 0 b) S = S0 + #Sygnały - #Oczekiwania
rodzaje semaforów : uwagi i wnioski Sygnalizuj(S) musi wznowić wstrzymany wcześniej proces ... ... ale który rodzaje semaforów : Semafor z kolejką oczekujących procesów – FIFO Semafor z aktywnym czekaniem - wartość S jest sprawdzana w pętli aktywnego czekania Czekaj(S): Loop If S>0 then S:=S-1; exit; endif; End Loop; Silnie i słabo uczciwy semafor. uwagi i wnioski
Wzajemne wykluczanie Problem : zsynchronizowanie N procesów, z których każdy w nieskończonej pętli na przemian zajmuje się „własnymi sprawami” i wykonuje sekcję krytyczną, w taki sposób, aby wykonywanie sekcji krytycznych jakichkolwiek dwóch lub więcej procesów nie pokrywało się w czasie. Problem występujący w rzeczywistych systemach w związku z przydzielaniem zasobów komputera wielu procesom. sposób rozwiązania przy użyciu semafora z kolejką oczekujących procesów Oznaczenia : e(s) – wartość zmiennej semaforowej e0(s)– wartość początkowa zm. semaforowej, jej wartość zależy od rozwiązywanego problemu, określa krotność zasobu f(s) – kolejka procesów czekających na dostęp do zasobu P(s) – procedura wejścia, wykonywana dla każdego procesu zgłaszającego chęć skorzystania z zasobu V(s) – procedura wyjścia, zwalniająca niepotrzebny danemu procesowi zasób, wykonywana dla każdego procesu, który kończy użytkowanie zasobu
implementacja procedur P(s) : begin e(s):=e(s)-1 if e(s) < 0 then stan(R):=zawieszony R do kolejki f(s) end else R zajmuje zasób V(s) : begin e(s):=e(s)+1 if e(s) <= 0 then wyprowadź Q z kolejki f(s) stan(Q):=aktywny end Ug. R to proces pytający o dostęp do zasobu
Problem obiadujących filozofów Założenia: Filozof je tylko wtedy gdy ma dwa widelce, przy czym nie może podnieść na raz dwóch widelców. Dwóch filozofów nie może jeść jednocześnie tym samym widelcem Nie można wyróżniać żadnego z filozofów Żaden z filozofów nie zajmuje się tylko jedzeniem, po skończonym posiłku zapada w medytacje
Rozwiązanie: Można przyjąć, że każdy widelec jest semaforem. Filozof próbując podnieść widelec wykonuje operacje czekaj w stosunku do semafora. Odkładając widelec wykonuje natomiast operacje sygnalizuj. Zatem dzielone dane to : var pałeczka: arrey[0..4] of semafor; przy czym wszystkie elementy tablicy pałeczka mają na początku wartość 1. Repeat czekaj(pałeczka[i]); czekaj(pałeczka[i + 1mod 5]); jedzenie sygnalizuj(pałeczka[i]); sygnalizuj(pałeczka[i + 1mod 5]); myślenie Until false;
Problem pięciu obiadujących filozofów jest uznawany za klasyczne zagadnienie synchronizacji, z uwagi na to, że stanowi przykład szerokiej klasy problemów sterowania współbieżnością. Jest prostym odzwierciedleniem konieczność przydzielania wielu zasobów do wielu procesów w sposób grożący zakleszczeniem i zagłodzeniem. Sposoby rozwiązania problemu zakleszczenia: pozwolić zasiadać do stołu co najwyżej czterem filozofom naraz pozwolić filozofowi na podnoszenie widelców tylko wtedy, gdy są oba dostępne (tego zabiegu należy dokonać w sekcji krytycznej) zastosować rozwiązanie asymetryczne, tzn. filozof o numerze nieparzystym podnosi najpierw widelec po lewej stronie, a potem sięga na prawo, podczas gdy filozof parzysty rozpoczyna od widelca znajdującego się po jego prawej stronie a potem zwraca się ku lewej stronie.