Wykład 3
Transkrypt
Wykład 3
Plan prezentacji Spis treści 1 Synchronizacja procesów 1.1 Współpraca procesów i sekcje krytyczne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Metody synchronizacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Klasyczne problemy synchronizacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 7 11 2 Zakleszczenia 2.1 Wst˛ep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Charakterystyka zakleszczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Metody post˛epowania z zakleszczeniami . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 16 17 1 Synchronizacja procesów 1.1 Współpraca procesów i sekcje krytyczne Cel synchronizacji procesów • Procesy w systemie sa˛ wykonywane w sposób współbieżny • Zasoby systemu sa˛ współdzielone • Wspólny dost˛ep do zasobów generuje problemy – kto i kiedy może korzystać z zasobu – konieczność utrzymania spójności Synchronizacja procesów obejmuje ogół mechanizmów służacych ˛ koordynacji dost˛epu procesów do zasobów systemu. Problem praktyczny • Procesy komunikuja˛ si˛e wykorzystujac ˛ pami˛eć współdzielona˛ • Do sygnalizacji dost˛epności danych wykorzystywany jest licznik • Proces producenta umieszcza w pami˛eci porcj˛e danych i zwi˛eksza licznik • Proces konsumenta odczytuje porcj˛e danych i zmniejsza licznik Problem: Czy działanie tak skonstruowanych procesów b˛edzie poprawne? 1 Problem praktyczny Przeanalizujmy... Patrzac ˛ na każdy proces z osobna, jego działanie jest poprawne. Co si˛e stanie jeśli operacje zwi˛ekszenia licznika przez producenta i zmniejszenia przez konsumenta zostana˛ wykonane współbieżnie? Zwi˛ekszenie licznika rejestr = licznik rejestr = rejestr + 1 licznik = rejestr Zmniejszenie licznika rejestr = licznik rejestr = rejestr - 1 licznik = rejestr Problem praktyczny Houston... • Proces producenta umieścił właśnie dane w pami˛eci. • Proces konsumenta przeczytał kolejna˛ ich porcj˛e. • Oba procesy odczytały stan licznika - 6... – producent dodał 1 – konsument odjał ˛ 1 • Procesy przyst˛epuja˛ do zapisania nowej wartości licznika: – Jaka˛ wartość otrzyma licznik po zakończeniu obu operacji? – Powinno być 6... – Ale b˛edzie 5 lub 7... Problem praktyczny ... we’ve got... Producent R1 = licznik R1 = R1 + 1 licznik = R1 Konsument Wykonana operacja R1 = 6 R1 = 7 przełaczenie ˛ procesu R2 = licznik R2 = 6 R2 = R2 − 1 R2 = 5 przełaczenie ˛ procesu licznik = 7 przełaczenie ˛ procesu licznik = R2 licznik = 5 !!! 2 Problem praktyczny ... a problem! Wyścig! Współbieżne wykonywanie operacji na liczniku doprowadziło do sytuacji wyścigu. Licznik przyjmie ostatecznie taka˛ wartość jaka˛ przypisze mu ostatni z procesów! Możliwe rozwiazania: ˛ • Niepodzielność operacji na liczniku • Zagwarantowanie wyłaczności ˛ procesowi modyfikujacemu ˛ licznik Sekcja krytyczna • Treść procesu można podzielić na dwie zasadnicze cz˛eści: – cz˛eść, która operuje na współdzielonych danych, – pozostały kod programu • Operacje na współdzielonych danych podlegaja˛ wzajemnemu wykluczaniu: – w danej chwili tylko jeden proces może je modyfikować – pozostałe procesy powinny oczekiwać na uzyskanie dost˛epu Sekcja krytyczna Sekcja krytyczna Fragment programu (np. operujacy ˛ na współdzielonych danych), którego wykonanie podlega wzajemnemu wykluczaniu. • Sekcj˛e krytyczna˛ poprzedza sekcja wejściowa, w której proces uzyskuje zgod˛e na na wejście do sekcji krytycznej. • Po sekcji krytycznej nast˛epuje sekcja wyjściowa – zwolnienie blokady Reszta Pozostały kod programu. Problem sekcji krytycznej Warunki poprawności rozwiazania: ˛ 1. Wzajemne wykluczanie – w danej chwili co najwyżej jeden proces może wykonywać swoja˛ sekcj˛e krytyczna.˛ 2. Post˛ep – procesy działajace ˛ poza sekcja˛ krytyczna˛ nie moga˛ blokować innym procesom wejścia do sekcji krytycznej. 3. Ograniczone czekanie – czas oczekiwania na wejście do sekcji krytycznej jest skończony. Dodatkowe założenia: • procesy wykonuja˛ si˛e z niezerowa˛ pr˛edkościa,˛ • operacje load, store oraz test sa˛ niepodzielne 3 Algorytmy dla dwóch procesów • Dwa procesy - P0 i P1 • W treści procesu i odnosi si˛e bieżacego ˛ procesu, j – drugiego do { sekcja wejściowa sekcja krytyczna sekcja wyjściowa reszta } while (1) Algorytm 1 • Używamy zmiennej pomocniczej numer • numer == i oznacza, że proces Pi może działać • Zapewniona wyłaczność ˛ • Wymuszone naprzemienne wykonywanie sekcji krytycznych • Niespełniony warunek post˛epu do { while (numer != i); sekcja krytyczna numer = j; reszta } while (1) Procesy wzajemnie ustawiaja˛ sobie flag˛e (zmienna numer) zezwalajac ˛ a˛ na wejście do sekcji krytycznej. Jeżeli proces P0 wykonywał sekcj˛e krytyczna,˛ to w swojej sekcji wyjściowej ustawi zmienna˛ numer na 1 (zgoda na wejście procesu P1 do sekcji krytycznej). Dopóki proces P1 nie wykona swojej sekcji krytycznej, proces P0 nie b˛edzie mógł ponownie wejść do sekcji krytycznej. Algorytm 2 • Przechowujemy w tablicy znacznik stan procesów • znacznik[i]==true oznacza, że Pi jest gotowy do wejścia do sekcji krytycznej • Spełniony warunek wzajemnego wykluczania • Możliwość powstania blokady do { znacznik[i] = true; while (znacznik[j]); sekcja krytyczna znacznik[i] = false; reszta } while (1) Sekcje wejściowe i wyjściowe nie maja˛ zagwarantowanej niepodzielności. Może si˛e zatem zdarzyć, że proces zostanie wywłaszczony po ustawieniu znacznika a przed wejściem do p˛etli, a w tym momencie drugi proces ustawi swój znacznik. W sytuacji, gdy oba znaczniki sa˛ ustawione, oba procesy oczekuja,˛ aż “ten drugi” zakończy swoja˛ sekcj˛e krytyczna˛ i zwolni swój znacznik. 4 Algorytm 3 • Połaczenie ˛ dwóch poprzednich algorytmów • Tablica stanów procesów znacznik • Zmienna pomocnicza numer • Spełniony warunek wzajemnego wykluczania • Spełniony warunek post˛epu • Spełniony warunek ograniczonego czekania do { znacznik[i] = true; numer = j; while (znacznik[j] && numer == j); sekcja krytyczna znacznik[i] = false; reszta } while (1) Algorytm 3 - analiza Warunek wzajemnego wykluczania • Jeśli oba procesy b˛eda˛ chciały wejść jednocześnie do sekcji krytycznej ostawia˛ swoje znaczniki na true • Z założenia niepodzielności operacji load i store wynika, że zmienna numer b˛edzie miała wartość i lub j do { znacznik[i] = true; numer = j; while (znacznik[j] && numer == j); sekcja krytyczna znacznik[i] = false; reszta } while (1) Algorytm 3 - analiza Warunki post˛epu i ograniczonego czekania Blokada może nastapić ˛ jedynie w p˛etli while • Pierwsza cz˛eść warunku może być spełniona jednocześnie dla obu procesów • Zmienna numer może mieć wartość i lub j • Proces wykonawszy sekcj˛e krytyczna˛ zresetuje swój wskaźnik do { znacznik[i] = true; numer = j; while (znacznik[j] && numer == j); 5 sekcja krytyczna znacznik[i] = false; reszta } while (1) Algorytm dla wielu procesów Algorytm piekarni 1. Każdy proces chcacy ˛ wejść do sekcji krytycznej dostaje numer 2. Procesy wchodza˛ do sekcji krytycznej w kolejności przydzielonych numerów 3. Algorytm nie gwarantuje unikatowych numerów: • nadawanie numerów odbywa si˛e współbieżnie • każdy proces ma unikatowy identyfikator – pid • w przypadku kolizji numerów procesy o tym samym numerze sa˛ obsługiwane w kolejności pid Spostrzeżenie Algorytm implementuje kolejk˛e typu FIFO Algorytm dla wielu procesów Algorytm piekarni boolean wybieranie[n]; int numer[n]; do { wybieranie[i] = true; numer[i] = max(numer) +1; wybieranie[i] = false; for (j = 0; j < n; j++) { while (wybieranie[j]); while ( numer[j] != 0 && ((numer[j], j) < (numer[i], i)) ); } sekcja krytyczna numer[i] = 0; reszta } while (1) Sekcje krytyczne - podsumowanie • Sekcja krytyczna obejmuje operacje, które musza˛ być wykonywane z wzajemnym wykluczeniem współpracujacych ˛ procesów • Algorytm dost˛epu do sekcji krytycznej powinien być sprawiedliwy i musi spełniać warunki: – wzajemne wykluczanie – post˛ep – ograniczone czekanie • Piszac ˛ program da˛ży si˛e do maksymalnego skrócenia sekcji krytycznej 6 1.2 Metody synchronizacji Metody synchronizacji procesów • Wsparcie sprz˛etowe • Semafory • Regiony krytyczne i monitory • Transakcje Wsparcie sprz˛etowe • Programowa obsługa sekcji krytycznych wymaga znacznego nakładu czasu i utrudnia programowanie • Odpowiednie rozwiazania ˛ sprz˛etowe moga˛ uprościć programowanie i zwi˛ekszyć wydajność systemu: – zablokowanie przerwań w wewnatrz ˛ sekcji krytycznej ∗ łatwe w implementacji w systemach jednoprocesorowych ∗ trudne i czasochłonne w systemach wieloprocesorowych – niepodzielne wykonywanie niektórych operacji: ∗ testuj-i-ustal ∗ zamień Testuj-i-Ustal boolean Testuj_i_Ustal (boolean &cel) { boolean pob = cel; cel = true; return pob; } Testuj-i-Ustal Realizacja wzajemnego wykluczania • Poprawna realizacja wzajemnego wykluczania • Nie spełnia warunku ograniczonego czekania do { while (Testuj_i_Ustal(zamek)); sekcja krytyczna zamek = false; reszta } while (1) P˛etla while wykonywana jest, dopóki warunek jest spełniony. Znak ; po warunku p˛etli oznacza jej koniec, czyli mamy do czynienia z p˛etla˛ pusta.˛ Zwrócenie przez funkcj˛e Testuj_i_Ustal wartości logicznej fałsz powoduje wyjście z p˛etli oczekiwania. Brak spełnienia warunku ograniczonego czekania wynika z faktu, iż nie ma żadnej gwarancji, że proces w końcu osiagnie ˛ sekcj˛e krytyczna˛ — kolejne procesy oczekujace ˛ na wejście do sekcji krytycznej b˛eda˛ wywoływały funkcj˛e Testuj_i_Ustal i ten, który “wstrzeli si˛e” w czas, gdy zmienna zamek ustawiona jest w wartość fałsz — uzyska dost˛ep. 7 Zamień boolean Zamień (boolean &a, boolean &b) { boolean tymcz = a; a = b; b = tymcz; } Zamień Realizacja wzajemnego wykluczania • Poprawna realizacja wzajemnego wykluczania • Nie spełnia warunku ograniczonego czekania do { klucz = true; while (klucz == true) Zamień (zamek, klucz); sekcja krytyczna zamek = false; reszta } while (1) Dopóki zmienna klucz ma wartość prawda, jej wartość jest zamieniana ze zmienna˛ zamek. Zmiana wartości zmiennej klucz na fałsz oznacza, że właśnie został zablokowany zamek — miał wartość fałsz, po zamianie ma wartość prawda. Brak jakiegokolwiek kolejkowania procesów oczekujacych ˛ na zwolnienie zamka i algorytm dost˛epu na zasadzie “kto pierwszy ten lepszy” oznacza, że nie jest spełniony warunek ograniczonego czekania. Aby wykorzystać funkcje Testuj_i_Ustal oraz Zamień do rozwiazania ˛ problemu sekcji krytycznej należy zaimplementować obok nich dodatkowe mechanizmy zwiazane ˛ z kolejkowaniem. Semafory Semafor Zmienna całkowita, do której dost˛ep realizowany jest za pomoca˛ operacji wait() i signal(). Operacje wait() i signal() sa˛ wykonywane niepodzielnie. Zmienna zwykle jest inicjowana wartościa˛ 1 (wolny), wartość 0 lub ujemna oznacza zaj˛ety. Przykładowe zastosowania: • Sterowanie wejściem do sekcji krytycznej • Synchronizacja procesów Semafory Klasyczna implementacja wait() wait(&S) { while (S <= 0) ; S--; } 8 signal() signal(&S) { S++; } W funkcji wait znowu mamy do czynienia z p˛etla˛ oczekiwania — po warunku p˛etli while nast˛epuje średnik, czyli p˛etla jest pusta i b˛edzie wykonywana do momentu niespełnienia warunku. Semafory Przykład użycia – problem wzajemnego wykluczenia semaphore mutex = 1; do { wait(mutex); sekcja krytyczna signal(mutex); reszta } while (1) Semafor musi zostać zainicjalizowany — stad ˛ przypisanie mu wartości. Inicjalizacja liczba˛ wi˛eksza˛ niż 1 oznacza, że semafor może być zaj˛ety przez wi˛ecej niż jeden proces, co oznacza, że nie jest realizowane wzajemne wykluczanie. Taki sposób inicjalizacji charakterystyczny jest dla semaforów zliczajacych. ˛ Implementacja semaforów • Aktywne czekanie zużywa czas procesora: – nieefektywne w systemach jednoprocesorowych – jeśli czas oczekiwania jest krótki – korzystne w systemach wieloprocesorowych • Można wykorzystać funkcje block() oraz wake(): 1. oprócz zmiennej semafora utrzymywana jest kolejka procesów oczekujacych ˛ pod semaforem 2. jeśli proces nie może wejść do sekcji krytycznej, dodawany jest do kolejki i zostaje wstrzymany (block()) 3. jeśli sa˛ procesy w kolejce, proces opuszczajacy ˛ inicjuje wznowienie pierwszego procesu (wake()) Implementacja semaforów Przykład Struktura semafora typedef struct { int wartość; struct proces *L; } semafor; wait(semafor &S) { S.wartość--; if (S.wartość < 0) { kolejkuj(P, S.L); block(); } } 9 signal(semafor &S) { S.wartość++; if(S.wartość <= 0) { wykolejkuj(P, S.L); wake(P); } } Implementacja semaforów Właściwości • Zagwarantowane wzajemne wykluczanie • Spełniony warunek ograniczonego oczekiwania (kolejka FIFO) • Konieczne zagwarantowanie niepodzielności operacji wait() i signal() – proste w systemach jednoprocesorowych – wyłaczenie ˛ przerwań – złożone w systemach wieloprocesorowych – operacje te staja˛ si˛e sekcjami krytycznymi • Wartość zmiennej zliczajacej ˛ jest równa (co do modułu) ilości oczekujacych ˛ procesów Inne zagadnienia zwiazane ˛ z semaforami • Poza semaforami zliczajacymi ˛ istnieja˛ semafory binarne: – Moga˛ przyjmować tylko dwie wartości 0 i 1 – Moga˛ mieć wsparcie sprz˛etowe – Można z ich użyciem zaimplementować semafor zliczajacy ˛ • Implementujac ˛ i wykorzystujac ˛ semafory należy brać pod uwag˛e możliwość powstania zakleszczeń i zagłodzeń – Zakleszczenie wyst˛epuje wtedy, gdy grupa procesów nawzajem blokuje sobie potrzebne zasoby – Zagłodzenie wyst˛epuje wtedy, gdy proces nie jest dopuszczany do potrzebnych mu zasobów Problemy Skutki potencjalnych pomyłek • Zamieniona kolejność wait() i signal(): – kilka procesów b˛edzie mogło jednocześnie wejść do sekcji krytycznej – problem nie zawsze może być odtwarzalny • Użycie wait() zamiast signal(): – opuszczajac ˛ sekcj˛e krytyczna˛ proces b˛edzie ponownie chciał zajać ˛ semafor – prowadzi do zakleszczeń • Pomini˛eto jedna˛ z operacji wait() albo signal() – naruszenie wzajemnego wykluczania – zakleszczenie 10 Inne mechanizmy synchronizacji • (Warunkowe) Rejony Krytyczne – Współdzielone zmienne sa˛ odpowiednio oznaczone – Dost˛ep do zmiennej poprzedzony jest sprawdzeniem warunku – Wewnatrz ˛ rejonu krytycznego w danej chwili może znajdować si˛e tylko jeden proces. • Monitory – Podejście obiektowe – Współdzielony obiekt implementuje wzajemna˛ wyłaczność ˛ Transakcje Transakcja Zbiór operacji wykonujacych ˛ logicznie spójna˛ funkcj˛e. • Transakcja może być zatwierdzona w całości lub poniechana (wszystko albo nic) • Wywodza˛ si˛e z systemów bazodanowych – Nacisk na spójność danych – Ochrona przed utrata˛ danych w wyniku awarii • Adaptowane na potrzeby systemów operacyjnych – Systemy plików z dziennikiem – Systemy rozproszone Przebieg transakcji 1. Otwarcie transakcji 2. Ciag ˛ operacji: • każda operacja odnotowywana jest w dzienniku • aby transakcja mogła być zatwierdzona wszystkie operacje musz˛e si˛e zakończyć powodzeniem 3. Zakończenie transakcji: • jeśli wszystkie operacje zakończyły si˛e powodzeniem transakcja jest zatwierdzana (committed) • jeśli napotkano bł˛edy - transakcja zostaje zaniechana (aborted) • w przypadku zaniechania transakcji należy przywrócić stan sprzed jej rozpocz˛ecia – wycofanie (roll back) 1.3 Klasyczne problemy synchronizacji Klasyczne problemy synchronizacji • Problem ograniczonego buforowania (producent – konsument) • Problem czytelników i pisarzy • Problem ucztujacych ˛ filozofów 11 Problem ograniczonego buforowania • Producent generuje porcje danych i umieszcza je w buforze • Konsument pobiera dane z bufora • Bufor ma ograniczona˛ pojemność • Algorytm powinien zagwarantować, że: – producent nie b˛edzie przepełniał bufora – konsument nie b˛edzie czytał z pustego bufora – operacje na buforze b˛eda˛ realizowane z wzajemnym wykluczeniem Problem ograniczonego buforowania Przykładowe rozwiazanie ˛ semaphore mutex = 1; semaphore pusty = n; semaphore pełny = 0; Producent: do { wyprodukuj_jednostk˛ e(); wait(pusty) wait(mutex) dodaj_jednostk˛ e() signal(mutex) signal(pełny) } while (1) Konsument: do { wait(pełny) wait(mutex) pobierz_jednostk˛ e() signal(mutex) signal(pusty) konsumuj_jednostk˛ e() } while (1) Semafor mutex zapewnia wzajemne wykluczanie wewnatrz ˛ sekcji krytycznej (dost˛ep do bufora). Para semaforów pusty oraz pełny realizuje kontrol˛e zapełnienia bufora — n to pojemność bufora. Jeśli semafor pusty osiagnie ˛ wartość 0, oznacza to, że w buforze nie ma już wolnego miejsca (w buforze zgromadzono n elementów). Zwracam uwag˛e na kolejność wywołań funkcji wait — najpierw zajmujemy semafor zwiazany ˛ z kolejka˛ (pusty lub pełny, dopiero potem ten zwiazany ˛ z wyłaczności ˛ a˛ na dost˛ep do bufora (mutex). Odwrotna kolejność blokowania semaforów mogła by prowadzić do zakleszczeń. (Zadanie domowe dla ch˛etnych: Dlaczego? Pisemne uzasadnienie prosz˛e przysłać na maila lub dostarczyć na kartce na nast˛epnym wykładzie.) 12 Problem czytelników i pisarzy • Kilka procesów dzieli wspólne dane – czytelnicy tylko odczytuja˛ dane – pisarze dokonuja˛ modyfikacji (czytaja˛ i zapisuja) ˛ • Równoczesny dost˛ep wielu czytelników jest dozwolony • Dost˛ep jakiegokolwiek innego użytkownika razem z pisarzem może prowadzić do chaosu • Zagwarantować pisarzom wyłaczny ˛ dost˛ep do dzielonego obiektu Problem czytelników i pisarzy Przykładowe rozwiazanie ˛ semaphore mutex, pis; int liczba_czytelników; Pisarz wait(pis); edycja(); signal(pis); Czytelnik wait(mutex); liczba_czytelników++; if (liczba_czytelników == 1) wait(pis); signal(mutex); czytanie(); wait(mutex); liczba_czytelników--; if (liczba_czytelników == 0) signal(pis); signal(mutex); Semafor mutex realizuje wyłaczność ˛ przy dost˛epie do licznika czytelników. Semafor pis realizuje właściwa˛ wyłaczność ˛ pisarza na dost˛ep potrzebny do edycji. Pierwszy czytelnik blokuje semafor pis, ostatni — zwalnia. Problem ucztujacych ˛ filozofów • Pi˛eciu filozofów siedzi przy wspólnym stole • Filozofowie na przemian j˛edza˛ i medytuja˛ • Na stole stoi 5 misek z ryżem, a pomi˛edzy nimi spoczywa 5 pałeczek • Aby filozof mógł si˛e posilić, potrzebuje dwóch pałeczek • Pałeczki wolno podnosić pojedynczo (najpierw jedna,˛ potem druga) ˛ • Pałeczk˛e w danej chwili może trzymać tylko jeden filozof • Opracować algorytm taki, by żaden z uczestników uczty nie został zagłodzony oraz aby nie doszło do blokady (każdy filozof trzyma jedna˛ pałeczk˛e) 13 Rysunek 1: Ilustracja problemu ucztujacych ˛ filozofów Problem ucztujacych ˛ filozofów Cz˛eściowe rozwiazanie ˛ semaphore pałeczka[5]; do { wait(pałeczka[i]); wait(pałeczka[(i+1) % 5]); jedz(); signal(pałeczka[i]); signal(pałeczka[(i+1) % 5]); medytuj(); } while (1); Gdzie jest bład? ˛ • Zagwarantowana jest wzajemna wyłaczność ˛ przy dost˛epie do pałeczek • A co zakleszczeniami? Problem ucztujacych ˛ filozofów Przykładowe rozwiazanie ˛ Zabierzmy filozofom jeden talerz... • 4 talerze • 5 pałeczek • Przynajmniej jeden filozof b˛edzie mógł jeść! Semafory: semaphore pałeczka[5]; semaphore talerz=4; Filozof: 14 do { wait(talerz); wait(pałeczka[i]); wait(pałeczka[(i+1) % 5]); jedz(); signal(pałeczka[i]); signal(pałeczka[(i+1) % 5]); signal(talerz); medytuj(); } while (1); 2 Zakleszczenia 2.1 Wst˛ep Model systemu • System składa si˛e z ograniczonej ilości zasobów: – zasoby maja˛ różne typy – zasoby moga˛ być unikatowe lub może wyst˛epować wi˛eksza ilość zasobów tego samego typu – przykłady: drukarka, procesor, strony pami˛eci, urzadzenia ˛ we/wy • Zasoby sa˛ udost˛epniane procesom – proces zamawia zasób – po jego przydzieleniu proces korzysta z zasobu – po użyciu zasób zostaje zwolniony Przydział zasobów 1. Proces zamawia zasób: • jeśli zasób jest wolny – zostaje przydzielony natychmiast • jeśli zasób jest użytkowany – proces oczekuje na jego zwolnienie 2. Zasób zostaje przydzielony 3. Proces korzysta z przydzielonego zasobu 4. Po zakończeniu użytkowania zasób zostaje zwolniony Przydział zasobów • Procesy oczekujace ˛ na przydział zasobu moga˛ być zorganizowane w kolejki • Wiele procesów może oczekiwać na ten sam zasób • Proces może użytkować wiele zasobów 15 Zakleszczenie • Grupa procesów może potrzebować tych samych zasobów • Jeżeli procesy przetrzymuja˛ sobie na wzajem zasoby, o dost˛ep do których si˛e ubiegaja,˛ dochodzi do zakleszczenia • Poj˛ecie zakleszczenia obejmuje zarówno zasoby fizyczne (dyski, drukarki, pami˛eć, itp) jak i logiczne (semafory) Zakleszczenie Zbiór procesów jest w stanie zakleszczenia, gdy każdy proces z tego zbioru oczekuje na zdarzenie, które może być spowodowane przez inny proces z tego zbioru. 2.2 Charakterystyka zakleszczenia Warunki powstawania zakleszczeń 1. Wzajemne wykluczanie 2. Przetrzymywanie i oczekiwanie 3. Brak wywłaszczeń 4. Czekanie cykliczne Uwaga: Wszystkie warunki musza˛ wystapić ˛ jednocześnie Warunki powstawania zakleszczeń Wzajemne wykluczanie Przynajmniej jeden zasób musi być niepodzielny. Przetrzymywanie i oczekiwanie Musi istnieć proces, któremu przydzielono co najmniej jeden zasób i oczekujacy ˛ na przydział dodatkowego zasobu, przetrzymywanego przez inny proces. W trakcie oczekiwania na przydział proces nie oddaje już przydzielonych zasobów. Warunki powstawania zakleszczeń Brak wywłaszczeń Zasoby moga˛ być zwolnione jedynie z inicjatywy samego procesu. Czekanie cykliczne Musi istnieć zbiór procesów taki, że pierwszy proces oczekuje na zasób przetrzymywany przez drugi proces, drugi – na zasób przetrzymywany przez trzeci, itd, a ostatni proces oczekuje na zasób przetrzymywany przez proces pierwszy. 16 Rysunek 2: Graf przydziału zasobów Graf przydziału zasobów • Przydział zasobów można przedstawić przy użyciu grafu • W˛ezły grafu przedstawiaja˛ procesy i zasoby, podzielone sa˛ na dwie grupy: – procesy (przedstawione jako okr˛egi) – zasoby (przedstawiane jako prostokaty) ˛ • Liczność zasobu przedstawia si˛e wpisujac ˛ odpowiednia˛ liczb˛e kropek w prostokat ˛ • Kraw˛edzie grafu sa˛ skierowane: – od procesu do zasobu – kraw˛edź zamówienia – od zasobu do procesu – kraw˛edź przydziału Graf przydziału zasobów • Brak cykli oznacza brak zakleszczeń w systemie • Wyst˛epowanie cyklu oznacza możliwość zakleszczenia: – jeśli wszystkie zasoby systemu sa˛ unikatowe – jeśli wszystkie zasoby w cyklu sa˛ unikatowe – jeśli przynajmniej jeden zasób w cyklu ma wi˛eksza˛ liczność, do zakleszczenia mogło nie dojść 2.3 Metody post˛epowania z zakleszczeniami Metody post˛epowania z zakleszczeniami • Zastosowanie protokołu zapobiegajacego ˛ zakleszczeniom lub unikajacego ˛ ich – Wymaga dodatkowych mechanizmów – Narzut czasowy 17 Rysunek 3: Zakleszczenie (po lewej stronie) i cykl bez zakleszczeń (po prawej) • Zezwolenie na wyst˛epowanie zakleszczeń, a nast˛epnie ich detekcja i usuwanie – Wymagany mechanizm wykrywania zakleszczeń – Dodatkowe obcia˛żenie systemu • Ignorowanie zakleszczeń – Zakleszczenia zdarzaja˛ si˛e rzadko – Nakład środków potrzebnych do obsługi zakleszczeń jest niewspółmierny do korzyści Zapobieganie zakleszczeniom Zapobieganie zakleszczeniom polega na zapewnieniu niespełnienia przynajmniej jednego z warunków powstawania zakleszczeń. 1. Wzajemne wykluczanie 2. Przetrzymywanie i oczekiwanie 3. Brak wywłaszczeń 4. Czekanie cykliczne Przypomnienie Aby wystapiło ˛ zakleszczenie musza˛ być spełnione jednocześnie wszystkie warunki! Zapobieganie zakleszczeniom 1. Wzajemne wykluczanie • Wi˛ekszość zasobów może być współdzielona • Dost˛ep do niektórych zasobów z natury jest wyłaczny ˛ • Nie jest możliwa pełna realizacja praktyczna. 18 Zapobieganie zakleszczeniom 2. Przetrzymywanie i oczekiwanie • Przydział wszystkich zasobów potrzebnych do wykonania zadania na samym poczatku ˛ • Obowiazkowe ˛ zwolnienie posiadanych zasobów przed żadaniem ˛ nowego zasobu • Nieefektywne wykorzystanie zasobów • Możliwość głodzenia Zapobieganie zakleszczeniom 3. Brak wywłaszczeń • Jeśli proces nie może uzyskać dost˛epu do zasobu – zwalnia te, które dotychczas posiadał • Jeśli proces potrzebuje zasobu, który posiada inny proces oczekujacy ˛ na zasób – nast˛epuje zwolnienie tego zasobu (inny proces zostaje wywłaszczony), w przeciwnym wypadku proces przechodzi w stan oczekiwania (i może zostać wywłaszczony z posiadanych zasobów) Zapobieganie zakleszczeniom 4. Czekanie cykliczne • Każdemu zasobowi przydzielany jest unikalny numer • Proces może zamawiać zasoby jedynie w kolejności rosnacych ˛ numerów • Jeśli numer zasobu jest niższy niż zasobów obecnie posiadanych – proces zwalnia wszystkie posiadane zasoby Unikanie zakleszczeń Unikanie zakleszczeń polega na takim zarzadzaniu ˛ zasobami, aby nie dochodziło do zakleszczeń. • System musi z góry znać zapotrzebowania na zasoby poszczególnych procesów • Planowanie wykonania procesów musi uwzgl˛edniać aktualnie zaj˛ete zasoby i zapotrzebowanie na nie w przyszłości • Narzut obliczeniowy, potrzebna pami˛eć Unikanie zakleszczeń Stan bezpieczny systemu Stan bezpieczny System jest w stanie bezpiecznym, jeśli istnieje taka kolejność przydzielania zasobów procesom, że stale unika si˛e zakleszczenia. Stan zagrożenia System, który nie znajduje si˛e w stanie bezpiecznym, znajduje si˛e w stanie zagrożenia. Przebywanie w stanie zagrożenia nie implikuje zakleszczenia. 19 Rysunek 4: Stan bezpieczny, zagrożenia i zakleszczenia Algorytmy unikania zakleszczeń • Analiza grafu przydziału zasobów: – poprawny dla systemów z zasobami unikatowymi – zapotrzebowanie na zasoby zapisane kraw˛edziami deklaracji • Algorytm bankiera: – dla dowolnie licznych zasobów – rozbudowane struktury przechowujace ˛ informacje o stanie zasobów Algorytmy unikania zakleszczeń Algorytm grafu przydziału zasobów • Kraw˛edzie deklaracji: – zwrot taki sam, jak kraw˛edzi zamówienia – proces może zamówić dany zasób w przyszłości – deklaracja nast˛epuje przed uruchomieniem procesu • Przed przyj˛eciem zamówienia system sprawdza, czy zmiana kraw˛edzi deklaracji w kraw˛edź zamówienia nie domknie cyklu • Przy zwolnieniu zasobu, kraw˛edź przydziału przechodzi w kraw˛edź zamówienia Algorytmy unikania zakleszczeń Algorytm bankiera • Rozbudowana informacja: – Ilość zasobów w systemie – Deklarowane zapotrzebowanie dla poszczególnych procesów – Aktualny przydział zasobów 20 Rysunek 5: Stan bezpieczny (po lewej) oraz stan zagrożenia po prawej) – Ilość potencjalnie potrzebnych zasobów dla każdego procesu • Przydział zasobów nast˛epuje po spełnieniu warunków: – proces nie przekroczy deklarowanego limitu – sa˛ wolne zasoby w systemie – po przydziale zasobów system nadal pozostanie w stanie bezpiecznym • Duży narzut czasowy i pami˛eciowy Wykrywanie zakleszczeń Algorytmy wykrywania zakleszczeń maja˛ na celu wykrycie zakleszczenia oraz określenie procesów i zasobów w nie uwikłanych. • Konieczne, jeśli brak algorytmów prewencyjnych • Nakład czasowy i pami˛eciowy: – rozbudowane algorytmy – cykliczne uruchamianie • Co zrobić z wykrytym zakleszczeniem? – informowanie operatora – automatyczna likwidacja zakleszczenia Wykrywanie zakleszczeń Wykrywanie zakleszczeń w systemie z pojedynczymi zasobami • Graf oczekiwania: – modyfikacja grafu przydziału zasobów – usuni˛ete w˛ezły symbolizujace ˛ zasoby – łuki powstaja˛ przez złaczenie ˛ łuków biegnacych ˛ od/do zasobu • Cykle wskazuja˛ na istnienie zakleszczeń • System na bieżaco ˛ utrzymuje graf oczekiwania • W wybranych chwilach uruchamiany jest algorytm wyszukiwania cykli 21 Rysunek 6: Graf przydziału i odpowiadajacy ˛ mu graf oczekiwania Wykrywanie zakleszczeń Wykrywanie zakleszczeń w systemie z wielokrotnymi zasobami • Pochodna algorytmu bankiera • System utrzymuje informacj˛e o bieżacym ˛ wykorzystaniu zasobów: – ilość zasobów w systemie – aktualnie przydzielone zasoby – zamówienia • Cykliczne sprawdzanie, czy stan zasobów wskazuje na zakleszczenie Wykrywanie zakleszczeń Kiedy uruchamiać algorytm wykrywania zakleszczeń? • Wykrywanie zakleszczeń wymaga czasu procesora: – złożoność O(n2 ) w przypadku algorytmu grafowego – O(m ∗ n2 ) w przypadku algorytmu bankiera • Uruchamianie algorytmu: – przy każdym zamówieniu zasobu – co któreś zamówienie – co pewien czas – gdy obcia˛żenie procesora spadnie poniżej zadanego progu Likwidowanie zakleszczeń Jeśli w systemie doszło do zakleszczenia, konieczne jest jego usuni˛ecie. Usuni˛ecie zakleszczonych procesów • pojedynczo, do czasu zlikwidowania zakleszczenia 22 • usuni˛ecie wszystkich zakleszczonych procesów Wywłaszczenie zasobów Odebranie zasobów jednemu badź ˛ kilku procesom i przydzielenie ich innym, tak by mogły zakończyć prac˛e. Usuwanie zakleszczonych procesów • Usuni˛ecie procesów powoduje utrat˛e wyników ich pracy • Usuwajac ˛ proces należy zadbać o zwolnienie zasobów: – doprowadzenie urzadzeń ˛ we/wy do stanu wyjściowego – uporzadkowanie ˛ plików • Dobór procesów do zakończenia: – aktualny post˛ep procesu – jakie zasoby posiada, jakich potrzebuje – jakie procesy od niego zależa˛ Usuwanie zakleszczonych procesów • Usuni˛ecie wszystkich zakleszczonych procesów: – Likwiduje p˛etl˛e zakleszczenia – Powoduje znaczne straty • Usuwanie procesów pojedynczo, aż do likwidacji zakleszczenia: – Pozwala ograniczyć straty – Konieczne jest wielokrotne uruchamianie algorytmu detekcji zakleszczeń Wywłaszczanie zasobów • Wybór zasobów/procesów do wywłaszczenia: – Jakie zasoby sa˛ potrzebne, które procesy je przetrzymuja˛ – Uwzgl˛ednienie bieżacego ˛ zaawansowania procesów • Wycofanie: – Co zrobić z wywłaszczanymi procesami? • Unikanie głodzenia – Zapewnienie, że wywłaszczenie nie b˛edzie dotyczyć stale tego samego procesu. • Konieczne wsparcie przez system operacyjny Dzi˛ekuj˛e za uwag˛e! 23