Synchronizacja procesów Problem sekcji krytycznej. Sprzętowe środki synchronizacji. Semafory. Klasyczne problemy synchronizacji. Monitory. Bariery. Przykłady synchronizacji procesów: Solaris, Windows XP/Vista/7/8/10, Linux. Zakleszczenia. Wiesław Płaczek Systemy Operacyjne: Wykład 5 1
Problem sekcji krytycznej Weźmy n procesów rywalizujących o dostęp do wspólnych (dzielonych) danych. Każdy proces ma segment kodu zwany sekcją krytyczną (critical section), w którym może korzystać ze wspólnych danych. Problem: Należy zapewnić, że kiedy jeden proces wykonuje sekcję krytyczną, wówczas żaden inny proces nie jest dopuszczany do wykonywania swojej sekcji krytycznej. Ø Wykonywanie sekcji krytycznej powinno podlegać wzajemnemu wykluczaniu (mutual exclusion). Wiesław Płaczek Systemy Operacyjne: Wykład 5 2
Struktura typowego procesu do { sekcja wejściowa sekcja krytyczna sekcja wyjściowa reszta } while (1); Wiesław Płaczek Systemy Operacyjne: Wykład 5 3
Warunki sekcji krytycznej 1. Wzajemne wykluczanie: Jeśli jeden proces wykonuje swoją sekcję krytyczną, to żaden inny proces nie działa w sekcji krytycznej. 2. Postęp: Jeżeli żaden proces nie wykonuje swojej sekcji krytycznej oraz istnieją procesy, które chcą wejść do swoich sekcji krytycznych, to tylko procesy nie wykonujące swoich reszt mogą rywalizować o wejście do sekcji krytycznej i wybór ten nie może być odwlekany w nieskończoność. 3. Ograniczone czekanie: Między chwilą zgłoszenia przez proces chęci wejścia do swojej sekcji krytycznej a chwilą uzyskania na to pozwolenie musi istnieć wartość graniczna liczby wejść innych procesów do sekcji krytycznych. ü ü Zakładamy, że każdy proces jest wykonywany z niezerową szybkością. Nie robimy założenia co do względnej szybkości n procesów. Wiesław Płaczek Systemy Operacyjne: Wykład 5 4
Rozwiązanie dla dwu procesów (algorytm Petersona) Dwa procesy: P 0 i P 1 zawierające sekcje krytyczne. Dzielone zmienne: int kolej = 0; /* czyja kolej wejścia do sekcji krytycznej */ bool flaga[2] = {false,false}; /* chęć wejścia do SK */ Ø Kod dla procesu P i (i = 0, 1; j = 1 i) ü do { flaga[i] = true; kolej = j; while (flaga[j] && kolej == j) ; /* czekaj */ sekcja krytyczna flaga[i] = false; reszta } while (1); Spełnia wszystkie trzy warunki poprawnego rozwiązania problemu sekcji krytycznej sprawdzić! Wiesław Płaczek Systemy Operacyjne: Wykład 5 5
Rozwiązanie dla wielu procesów Algorytm piekarni (Bakery algorithm) Sekcja krytyczna dla n procesów: Ø Spełnia wszystkie warunki sekcji krytycznej! Przed wejściem do sekcji krytycznej proces otrzymuje numer. Posiadacz najmniejszego numeru wchodzi do sekcji krytycznej. Jeżeli procesy P i i P j otrzymały ten sam numer oraz i < j, to P i będzie obsłużony najpierw. Schemat numerowania generuje niemalejące ciągi kolejnych liczb naturalnych, tzn. 1, 2, 3, 3, 3, 4, 5, 5,... Notacja: (a,b) < (c,d), jeżeli a < c lub jeżeli a = c i b < d. Dzielone zmienne: bool wybieranie[n]; wszystkie zainicjowane na: false int numer[n]; wszystkie zainicjowane na: 0 Wiesław Płaczek Systemy Operacyjne: Wykład 5 6
Algorytm piekarni Proces P i do { wybieranie[i] = true; numer[i] = max(numer[0],..., numer[n-1]) + 1; wybieranie[i] = false; for (j = 0; j < n; j++){ while (wybieranie[j]) ; while ( numer[j]!= 0 && } sekcja krytyczna numer[i] = 0; reszta } while (1); (numer[j],j) < (numer[i],i) ) ; Wiesław Płaczek Systemy Operacyjne: Wykład 5 7
Sprzętowe środki synchronizacji Na jednym procesorze problem sekcji krytycznej można rozwiązać zakazując przerwań w trakcie modyfikacji zmiennej dzielonej (niewydajne na wieloprocesorach!). Niepodzielne rozkazy: np. TestAndSet lub Swap bool TestAndSet(bool *cel){ bool zwracaj = *cel; *cel = true; return zwracaj; } void Swap(bool *a,bool *b){ bool pom = *a; *a = *b; *b = pom; } Wiesław Płaczek Systemy Operacyjne: Wykład 5 8
Dzielona zmienna: Proces P i Ø Rozkaz TestAndSet: do { Wzajemne wykluczanie bool zamek = false; while ( TestAndSet(&zamek) ) ; /* nic nie rób */ sekcja krytyczna zamek = false; reszta } while (1); Ø Rozkaz Swap: lokalna zmienna: bool klucz; do { klucz = true; while (klucz) Swap(&zamek,&klucz); /* nic nie rób */ sekcja krytyczna zamek = false; reszta } while (1); L Nie spełniają warunku ograniczonego czekania! Dlaczego? Wiesław Płaczek Systemy Operacyjne: Wykład 5 9
Semafory Semafor (semaphore) pierwszy mechanizm synchronizacyjny w językach wysokiego poziomu (Dijkstra, 1965): semaphore abstrakcyjny typ danych; semaphore S; zmienna semaforowa o wartościach całkowitych 0. Operacje na semaforze: Opuszczenie (zajęcie) semafora: P (hol. passeren, proberen): P(S): while (S <= 0) ; /* czekaj */ S--; Podniesienia (zwolnienie) semafora: V (hol. vrijmaken, verhogen): V(S): S++; Ø Operacje te muszą być niepodzielne! Powyższy semafor nazywany jest semaforem ogólnym lub liczącym (counting semaphore): S = 0,1,2,... Może być też semafor binarny: S = 0,1 (tylko dwie wartości). Ø Semafor liczący można zaimplementować przy pomocy semafora binarnego i odwrotnie. Wiesław Płaczek Systemy Operacyjne: Wykład 5 10
Implementacja semaforów Podstawową wadą powyższej definicji semafora jest to, że operacja P zawiera aktywne czekanie (busy waiting), które marnuje cykle procesora. Ø Taki semafor nazywany jest wirującą blokadą (spinlock). Implementacja semafora bez aktywnego czekania: Semafor jako rekord: typedef struct { } semaphore; int value; struct process *list; /* lista procesów */ SO dostarcza dwie proste operacje (elementarne funkcje systemowe): block wstrzymuje (blokuje) proces, który ją wywołuje; wakeup wznawia zablokowany proces (zmienia stan na gotowy); Lista procesów czekających pod semaforem np. kolejka FIFO (bloków kontrolnych procesów). Wiesław Płaczek Systemy Operacyjne: Wykład 5 11
Implementacja operacji semaforowych Operacje P i V (wartość semafora może być tutaj ujemna): void P(semaphore S) { S.value--; if (S.value < 0) { dodaj ten proces do S.list; block(); } } void V(semaphore S) { S.value++; if (S.value <= 0){ usuń jakiś proces P z S.list; wakeup(p); } } Ø Powyższe operacje P i V muszą być niepodzielne w środowisku jednoprocesorowym można to zrealizować przez wprowadzenie zakazu przerwań w trakcie ich wykonywania, a na wieloprocesorach przez spinlock. Wiesław Płaczek Systemy Operacyjne: Wykład 5 12
Zakleszczenia i głodzenie W rozwiązaniach opartych o semafory mogą pojawiać się problemy: Zakleszczenie (blokada) (deadlock): Kilka procesów czeka na zdarzenie, które może być spowodowane tylko przez jeden z czekających procesów. Ø Przykład: dwa semafory semaphore S = 1, Q = 1; Proces P0 P(S); Proces P1 P(Q); P(Q); P(S);...... V(S); V(Q); V(Q); V(S); (Za)głodzenie (blokowanie nieskończone) (starvation): Proces nie zostaje wznowiony, mimo iż zdarzenie, na które czeka występuje dowolną ilość razy za każdym razem, gdy proces ten mógłby być wznowiony wybierany jest inny czekający proces. Wiesław Płaczek Systemy Operacyjne: Wykład 5 13
Klasyczne problemy synchronizacji Wzajemne wykluczanie ćwiczenia. Producent Konsument ćwiczenia. Czytelnicy i pisarze: Dwie grupy procesów: czytelnicy i pisarze konkurują o dostęp do wspólnego zasobu czytelni. Czytelnik odczytuje informację zgromadzoną w czytelni i może to robić razem z innymi czytelnikami, natomiast pisarz zapisuje nową informację i musi przebywać sam w czytelni. Możliwe rozwiązania: 1) Czytelnik powinien wejść do czytelni najszybciej jak to możliwe. è Możliwość zagłodzenia pisarzy! 2) Pisarz powinien wejść do czytelni najszybciej jak to możliwe. è Możliwość zagłodzenia czytelników! 3) Czytelnicy i pisarze wpuszczani są do czytelni na przemian, np. według kolejności zgłoszeń, przy czym pisarze wchodzą pojedynczo, natomiast wchodzący czytelnik może wpuścić do czytelni wszystkich czekających czytelników. è Brak zagłodzenia! Wiesław Płaczek Systemy Operacyjne: Wykład 5 14
Problem pięciu filozofów v Ø Pięciu filozofów siedzi przy wspólnym okrągłym stole i myśli. Co jakiś czas filozofowie muszą się posilić. Przed każdym filozofem stoi talerz, a obok talerza widelec. Na środku stołu stoi półmisek z rybą. Rybę należy jeść dwoma widelcami, więc filozof może zacząć jeść tylko gdy będzie miał obok siebie dwa wolne widelce. Po spożyciu posiłku filozof odkłada oba widelce na stół i ponownie zatapia się w myśleniu, itd. Możliwe rozwiązania: 1) Każdy filozof czeka aż jeden widelec (np. lewy) będzie wolny i podnosi go, a następnie czeka aż będzie wolny drugi widelec i też go podnosi. è Możliwość zakleszczenia każdy filozof podniesie jeden widelec. 2) Głodny filozof podnosi jednocześnie dwa widelce wtedy gdy są wolne. è Możliwość zagłodzenia jeżeli któryś z filozofów będzie miał żarłocznych sąsiadów, tak że nigdy dwa widelce obok jego talerza nie będą wolne, to nie będzie mógł jeść i zostanie zagłodzony. 3) Nad procesem jedzenia filozofów czuwa lokaj, który dopuszcza do rywalizacji o widelce tylko czterech filozofów naraz, a ci podnoszą widelce sekwencyjnie (np. najpierw lewy, potem prawy). Wiesław Płaczek Systemy Operacyjne: Wykład 5 15
Monitory Monitor konstrukcja do synchronizacji stosowana w językach wysokiego poziomu; umożliwia bezpieczne dzielenie danych abstrakcyjnego typu między współbieżnymi procesami. monitor nazwa_monitora { // deklaracje zmiennych dzielonych procedure P1(...) {... } procedure P2(...) {... }... procedure Pn(...) {... } kod inicjalizacyny (...) {... } } Wiesław Płaczek Systemy Operacyjne: Wykład 5 16
Cechy monitora Procedura zdefiniowana wewnątrz monitora może korzystać tylko ze zmiennych lokalnych monitora i swoich parametrów. Zmienne lokalne monitora są dostępne tylko za pośrednictwem lokalnych procedur monitora. Konstrukcja monitora gwarantuje, że w jego wnętrzu może być aktywny tylko jeden proces (sekcja krytyczna). W celu zwiększenia funkcjonalności monitora wprowadza się dodatkowy mechanizm warunek (condition): Ø condition x, y; zmienne typu condition; Zmienne warunkowe mogą być użyte tylko z operacjami wait i signal: Operacja x.wait(); oznacza, że proces ją wywołujący zostaje zawieszony do chwili, gdy inny proces wywoła operację x.signal(); Operacja x.signal(); wznawia dokładnie jeden z zawieszonych procesów jeżeli nie ma takich procesów, to operacja ta nie ma żadnego efektu. Kolejność wznawiania procesów zależy od implementacji kolejki procesów czekających pod daną zmienną warunkową. Wiesław Płaczek Systemy Operacyjne: Wykład 5 17
Schemat monitora Kolejki związane z warunkami x, y x y Dane dzielone Kolejka wejściowa... Operacje Kod inicjujący Ø Monitor można zaimplementować przy pomocy semaforów. Wiesław Płaczek Systemy Operacyjne: Wykład 5 18
Bariery Ø Niektóre aplikacje podzielone są na fazy i stawiają wymaganie, iż żaden proces nie może przejść do następnej fazy zanim wszystkie procesy nie będą gotowe do przejścia do tej fazy. Na końcu każdej fazy umieszczana jest bariera dedykowany mechanizm synchronizacyjny dla grupy procesów. Kiedy proces osiąga barierę, jest blokowany do momentu, aż wszystkie procesy osiągną barierę dopiero wówczas wszystkie procesy mogą przejść do następnej fazy. A A A C B Bariera C B Bariera Bariera B C D Czas D D Wiesław Płaczek Systemy Operacyjne: Wykład 5 19
Synchronizacja w systemie Solaris Ø W celu kontrolowania dostępu do sekcji krytycznych w systemie Solaris zaimplementowano: muteksy adaptacyjne (rodzaj semafora binarnego), zmienne warunkowe, semafory, blokady do czytania lub pisania, turnikety. Muteks adaptacyjny (adaptive mutex) stosowany do ochrony krytycznych danych dla krótkich segmentów kodu (co najwyżej kilkaset rozkazów). W systemach jednoprocesorowych wątek wstrzymany przez muteks adaptacyjny jest usypiany. W systemach wieloprocesorowych wątek jest usypiany tylko jeśli wątek utrzymujący muteks jest nieaktywny, w przeciwnym razie zamek realizuje aktywne czekanie (wirującą blokadę). Do synchronizacji dłuższych segmentów kodu używane są zmienne warunkowe i semafory czekające wątki są usypiane. Blokady do czytania i pisania (readers-writers locks) stosuje się do ochrony danych o częstym dostępie, zwykle do czytania możliwość współbieżnego czytania przez wiele wątków (drogie w realizacji; tylko dla długich sekcji kodu). Turnikety (turnstiles) służą do porządkowania listy wątków czekających na pozyskanie zamka adaptacyjnego albo blokady do czytania lub pisania są to struktury kolejek zawierające wątki zablokowane na muteksie lub blokadzie. Wiesław Płaczek Systemy Operacyjne: Wykład 5 20
Synchronizacja w Windows XP/Vista/7/8/10 W systemie jednoprocesorowym jądro sięgając po jakiś zasób globalny maskuje czasowo przerwania mogące z niego korzystać. W systemie wieloprocesorowym dostęp do zasobów globalnych chroniony jest przy pomocy wirujących blokad. Do synchronizacji wątków poza jądrem służą obiekty dyspozytora (dispatcher objects). Używając obiektu dyspozytora wątek może korzystać z różnych mechanizmów synchronizacji: muteksy, semafory, zdarzenia itd. Zdarzenia (events) mechanizm synchronizacji podobny do zmiennych warunkowych (mogą powiadamiać wątek o spełnieniu żądanego warunku). Obiekty dyspozytora mogą znajdować się w stanie sygnalizowania (signaled) lub niesygnalizowania (nonsignaled). Stan sygnalizowania oznacza, że obiekt jest dostępny i wątek nie zablokuje się przy próbie jego pozyskania. Stan niesygnalizowania wskazuje, że obiekt nie jest dostępny i przy próbie jego pozyskania wątek zostanie zablokowany. Istnieje związek między stanem obiektu dyspozytora a stanem wątku: sygnalizowany/niesygnalizowany obiekt wątek w stanie gotowości/czekania. Wiesław Płaczek Systemy Operacyjne: Wykład 5 21
Synchronizacja w systemie Linux Jądro Linuksa od wersji 2.6 jest w pełni wywłaszczalne proces wykonywany w trybie jądra może zostać wywłaszczony przez inny proces; poprzednie wersje jądra były niewywłaszczalne. Linux dostarcza typu atomic_t do operacji atomowych, muteksów, wirujących blokad oraz semaforów do synchronizacji w jądrze. W systemach jednoprocesorowych zamiast wirujących blokad używane są wywołania systemowe preempt_enable() i preempt_disable() do włączania i wyłączania wywłaszczeń jądra. Dodatkowo jądro jest niewywłaszczalne kiedy jakieś zadanie jądra utrzymuje blokadę wywłaszczanie jest wtedy niebezpieczne! Wirujące blokady, jak też włączanie i wyłączanie wywłaszczeń jądra stosowane są tylko do krótkich sekcji krytycznych, natomiast do dłuższych wykorzystywane są semafory. Synchronizacja P-wątków Interfejs Pthreads API dostarcza muteksów i zmiennych warunkowych jako mechanizmów synchronizacji wątków standardu POSIX. Wiele systemów implementujących P-wątki dostarcza ponadto semafory. Wiesław Płaczek Systemy Operacyjne: Wykład 5 22
Zakleszczenia Model systemu. Charakterystyka zakleszczenia. Metody postępowania z zakleszczeniami. Zapobieganie zakleszczeniom. Unikanie zakleszczeń. Wykrywanie zakleszczenia. Likwidowanie zakleszczenia. Mieszane metody postępowania z zakleszczeniami. Wiesław Płaczek Systemy Operacyjne: Wykład 5 23
Model systemu System składa się z zasobów: pamięć, cykle procesora, pliki, urządzenia WE/WY itd., o które rywalizują procesy. Każdy proces korzysta z zasobu według schematu: 1. Zamówienie (żądanie, request) jeżeli nie może być zrealizowane natychmiast, to proces musi czekać do chwili otrzymania zasobu. 2. Użycie (use) proces może korzystać z zasobu. 3. Zwolnienie (release) proces oddaje zasób. Ø q Stan zakleszczenia, inaczej blokady (deadlock): każdy proces w zbiorze procesów czeka na zdarzenie, które może być spowodowane tylko przez inny proces z tego samego zbioru, np. zwolnienie zajętego zasobu, na który proces oczekuje. Przykłady: System ma trzy napędy DVD-RW: każdy z procesów P0, P1 i P2 jest w posiadaniu jednego napędu i zamawia dodatkowy napęd. Semafory A i B są ustawione na 1: P0 P(A); P(B); P1 P(B); P(A); Wiesław Płaczek Systemy Operacyjne: Wykład 5 24
Charakterystyka zakleszczenia Ø Zakleszczenie może powstać wtedy, kiedy w systemie spełnione są jednocześnie cztery warunki: 1. Wzajemne wykluczanie: Tylko jeden proces może używać zasobu w tym samym czasie (zasób niepodzielny). 2. Przetrzymywanie i czekanie: Proces mający jeden zasób czeka na przydział dodatkowych zasobów będących w posiadaniu innych procesów. 3. Brak wywłaszczeń: Zasoby nie podlegają wywłaszczaniu. 4. Czekanie cykliczne: Istnieje zbiór czekających procesów {P 1,P 2,...,P n }, takich że P 1 czeka na zasób przetrzymywany przez P 2, P 2 czeka na zasób przetrzymywany przez P 3,..., a P n czeka na zasób przetrzymywany przez P 1. Graf przydziału zasobów graf skierowany złożony ze zbioru wierzchołków W i zbioru krawędzi K. Zbiór wierzchołków W składa się z dwu podzbiorów: P={P 1,...,P n } zbiór wszystkich procesów, Z={Z 1,...,Z n } zbiór typów zasobów. Krawędź zamówienia: P i Z j ; Krawędź przydziału: Z j P i. Wiesław Płaczek Systemy Operacyjne: Wykład 5 25
Przykłady grafów przydziału zasobów Z 1 Z 2 Z 1 Z 3 Krawędź zamówienia Krawędź przydziału P 1 P 2 P 3 P 1 P 2 P 3 Z 2 Z 4 Graf przydziału bez zakleszczenia Wiesław Płaczek Systemy Operacyjne: Wykład 5 26 Z 2 Z 4 Graf przydziału z zakleszczeniem 1. Graf nie zawiera cyklu nie ma zakleszczenia! 2. Graf zawiera cykl, to: a) Zasoby w jednym egzemplarzu zakleszczenie! b) Zasoby w wielu egzemplarzach istnieje możliwość zakleszczenia!
Metody postępowania z zakleszczeniami Ø Z problemem zakleszczeń można sobie radzić na trzy różne sposoby: Zastosować protokół gwarantujący, że system nigdy nie wejdzie w stan zakleszczenia. Pozwolić systemowi na zakleszczenia, po czym podjąć działania w celu ich wykrycia i usunięcia. Zlekceważyć problem, udając, że zakleszczenia nigdy się nie pojawią w systemie ( algorytm strusia ) stosowane przez większość systemów operacyjnych, w tym UNIX i Windows. Wiesław Płaczek Systemy Operacyjne: Wykład 5 27
Zapobieganie zakleszczeniom Ø Zapobiec spełnieniu jednego z warunków koniecznych zakleszczeń: Wzajemne wykluczanie konieczne tylko dla zasobów niepodzielnych; nie wymagane dla zasobów podzielnych. Przetrzymywanie i oczekiwanie zagwarantować, że kiedy proces żąda zasobu, to nie posiada innych zasobów, np. wymagać by proces zamawiał i dostawał wszystkie swoje zasoby zanim rozpocznie działanie lub tylko wtedy gdy nie ma żadnych zasobów. L Słabe wykorzystanie zasobów, możliwość głodzenia procesów. Brak wywłaszczeń: Jeśli proces będący w posiadaniu pewnych zasobów żąda zasobu, którego nie można natychmiast przydzielić, to musi zwolnić wszystkie posiadane zasoby. Wywłaszczone zasoby są dodawane do listy zasobów, na które proces czeka. Proces zostanie wznowiony tylko wtedy, gdy będzie mógł odzyskać utracone zasoby oraz otrzymać nowo żądane zasoby. Czekanie cykliczne wymuszenie całkowitego uporządkowania wszystkich typów zasobów i wymaganie, aby każdy proces zamawiał zasoby w porządku rosnącym ich numeracji. Wiesław Płaczek Systemy Operacyjne: Wykład 5 28
Unikanie zakleszczeń Ø Wymaga informacji a priori o zapotrzebowaniach na zasoby. W najprostszym i najbardziej użytecznym modelu wymaga się, aby każdy proces deklarował maksymalną liczbę zasobów każdego typu, których będzie potrzebował. Algorytm unikania zakleszczeń (deadlock avoidance) sprawdza dynamicznie stan przydziału zasobów, by zapewnić, że nigdy nie dojdzie do czekania cyklicznego. Stan przydziału zasobów jest określony przez liczbę dostępnych i przydzielonych zasobów oraz maksymalne zapotrzebowania procesów. Wiesław Płaczek Systemy Operacyjne: Wykład 5 29
Unikanie zakleszczeń c.d. Kiedy proces żąda dostępnego zasobu, system musi sprawdzić, czy natychmiastowe przydzielenie tego zasobu zachowa system w stanie bezpiecznym (safe state). System jest w stanie bezpiecznym, jeżeli istnieje ciąg bezpieczny procesów. Ciąg procesów {P 1,P 2,...,P n } jest bezpieczny, jeśli dla każdego procesu P i jego potencjalne zapotrzebowanie na zasoby można zaspokoić przez aktualnie dostępne zasoby oraz zasoby użytkowane przez wszystkie procesy P j dla j < i. System jest w stanie bezpiecznym brak zakleszczenia! System jest w stanie zagrożenia istnieje możliwość powstania zakleszczenia! Unikanie zakleszczeń gwarancja, że nigdy nie pojawi się stan zagrożenia! Wiesław Płaczek Systemy Operacyjne: Wykład 5 30
Algorytmy unikania zakleszczeń Algorytm grafu przydziału zasobów: Ø Dla zasobów, których każdy typ ma pojedynczy egzemplarz. Dodatkowy typ krawędzi: krawędź deklaracji P i Z j wskazuje, że proces P i może zamówić kiedyś zasób Z j ; reprezentowana linią przerywaną. Krawędź deklaracji przechodzi w krawędź zamówienia, gdy proces zamawia zasób. Gdy zasób jest zwalniany krawędź zamówienia przechodzi z powrotem w krawędź deklaracji. Proces musi a priori zadeklarować zapotrzebowanie na potrzebne zasoby. Zamówienie może być spełnione tylko wtedy, gdy nie doprowadzi do powstania cyklu w grafie koszt szukania cyklu: n 2 (n liczba procesów). Wiesław Płaczek Systemy Operacyjne: Wykład 5 31
Algorytmy unikania zakleszczeń c.d. Algorytm bankiera (banker s algorithm): Ø Dla zasobów wielokrotnych (tzn. każdy typ może mieć wiele egzemplarzy). Każdy proces musi zadeklarować maksymalną liczbę egzemplarzy każdego typu, które będą mu potrzebne (nie większa od liczby wszystkich zasobów w systemie). Kiedy proces zamawia zbiór zasobów, sprawdza się czy ich przydzielenie pozostawi system w stanie bezpiecznym: Ø jeżeli tak zasoby są przydzielane, Ø jeżeli nie proces musi poczekać na zwolnienie dostatecznej ilości zasobów. Koszt sprawdzania stanu bezpiecznego: m n 2, gdzie m ilość typów zasobów. Wiesław Płaczek Systemy Operacyjne: Wykład 5 32
Wykrywanie zakleszczenia Ø Systemy nie stosujące zapobiegania zakleszczeniom muszą posiadać: Algorytm wykrywania ewentualnego zakleszczenia; Algorytm likwidowania wykrytego zakleszczenia. Typy zasobów reprezentowane pojedynczo: Algorytm wykrywania zakleszczeń oparty o graf oczekiwania, który powstaje z grafu przydziału zasobów po usunięciu węzłów reprezentujących zasoby, np. P i P j oznacza, że proces P i czeka na zasób będący w posiadaniu procesu P j. Okresowo wykonuje się powyższy algorytm, który szuka cyklu w grafie. Koszt algorytmu (liczba operacji): n 2 (n liczba wierzchołków grafu). Wiesław Płaczek Systemy Operacyjne: Wykład 5 33
Wykrywanie zakleszczenia c.d. Typy zasobów reprezentowane wielokrotnie: Algorytm wykrywania zakleszczenia podobny do algorytmu bankiera. Koszt algorytmu: m n 2 (m ilość typów zasobów). Używanie algorytmu wykrywania zakleszczenia: Ø Częstość wywoływania algorytmu zależy od tego jak często występują zakleszczenia i ile procesów ulega zakleszczeniu. ü Wykonywanie algorytmu przy każdym zamówieniu kosztowne! ü Wykonywanie algorytmu periodycznie (np. raz na godzinę) lub gdy wyraźnie spadnie wykorzystanie procesora może powstać wiele cykli! Wiesław Płaczek Systemy Operacyjne: Wykład 5 34
Likwidowanie zakleszczenia Zakończenie procesu: Zaniechanie wszystkich zakleszczonych procesów; Usuwanie procesów pojedynczo, aż do wyeliminowania cyklu zakleszczenia. Ø Jak wybrać proces do zakończenia: ü Jaki jest priorytet procesu? ü Jak długo proces wykonywał obliczenia i ile czasu potrzebuje do zakończenia? ü Ile zasobów i jakiego typu używa proces? ü Ilu jeszcze zasobów proces potrzebuje do zakończenia działania? ü Ile procesów trzeba będzie zakończyć? ü Czy proces jest interakcyjny czy wsadowy? Wiesław Płaczek Systemy Operacyjne: Wykład 5 35
Likwidowanie zakleszczenia c.d. Wywłaszczanie zasobów: Wybór ofiary: które zasoby i które procesy mają być wywłaszczone kryterium minimum kosztów; Wycofanie procesu do pewnego bezpiecznego stanu i wznowienie go z tego stanu w późniejszym czasie może być trudne! Głodzenie: do roli ofiary może być wybierany wciąż ten sam proces potrzebne ograniczenie; uwzględnienie liczby wycofań przy ocenie kosztów. Wiesław Płaczek Systemy Operacyjne: Wykład 5 36
Mieszane metody postępowania Połączenie trzech metod postępowania z zakleszczeniami: zapobieganie, unikanie, wykrywanie i likwidowanie, pozwala na uzyskanie optymalnego podejścia do problemu zakleszczeń dla poszczególnych klas zasobów w systemie. Podział zasobów na hierarchicznie uporządkowane klasy, np. Zasoby wewnętrzne (bloki kontrolne procesów itp.); Pamięć główna; Zasoby zadania (przydzielane urządzenia i pliki); Wymienny obszar pamięci (pamięć pomocnicza). Używanie najbardziej odpowiedniej techniki postępowania z zakleszczeniami wewnątrz każdej z klas zasobów. ü Zakleszczenia dotyczą zwykle nie więcej niż jednej klasy Ø System mniej lub wcale nie narażony na zakleszczenia! Wiesław Płaczek Systemy Operacyjne: Wykład 5 37
Zagadnienia 1. Na czym polega problem sekcji krytycznej i jakie są jej warunki? Podać rozwiązania tego problemu dla dwu oraz większej liczby procesów. 2. Podać przykłady sprzętowych środki synchronizacji oraz ich użycia do realizacji wzajemnego wykluczania procesów? 3. Omówić semafor jako mechanizm synchronizacji procesów oraz jego możliwe implementacje. Jakie wymagania stawia się wobec operacji semaforowych? 4. Jakie problemy mogą pojawić się w rozwiązaniach z użyciem semaforów? Przedstawić problemy czytelników i pisarzy oraz pięciu filozofów podać ich możliwe rozwiązania. 5. Omówić monitory i bariery jako mechanizmy synchronizacji procesów. 6. Porównać metody synchronizacji w systemach operacyjnych Solaris, Windows XP/Vista/7/8/10 oraz Linux. 7. Co to jest zakleszczenie i jakie są jego warunki? Do czego służy graf przydziału zasobów? Jaki jest związek między cyklem w grafie a zakleszczeniem? 8. Jakie są metody zapobiegania, unikania oraz wykrywania i likwidowania zakleszczeń. Wiesław Płaczek Systemy Operacyjne: Wykład 5 38