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

Podobne dokumenty