Zakleszczenia


Streszczenie

W wykładzie 6 zajmiemy się zagadnieniem zakleszczeń. Zakleszczenie to sytuacja, w której pewien zbiór procesów nie może kontynuować działań, ponieważ każdy proces do niego należący przetrzymuje zasoby potrzebne innym procesom z tego zbioru, a jednocześnie czeka na zasoby przydzielone innym procesom.

Zakleszczenie jest zjawiskiem niezwykle niepożądanym w systemie i dlatego opracowano rozmaite metody radzenia sobie z nimi. W niniejszym wykładzie omówimy te metody. Są nim zapobieganie, unikanie i wykrywanie. Pokażemy także powiązany z tymi metodami tzw. algorytm bankiera.


Zakleszczenie

Zakleszczenie to zbiór procesów będących w impasie wywołanym przez to, że każdy proces należący do tego zbioru przetrzymuje zasoby potrzebne innym procesom z tego zbioru, a jednocześnie czeka na zasoby przydzielone innym procesom.

Rozważmy system, w którym są procesor i drukarka. Żeby coś wydrukować, proces musi otrzymać oba te zasoby. Przypuśćmy, że dwa procesy chcą drukować. Jednemu z nich system przydzielił drukarkę a drugiemu procesor. Pierwszy trzyma więc procesor i oczekuje na przydział drukarki, który nigdy nie nastąpi, ponieważ tę trzyma drugi proces oczekujący na przydział procesora.

Do podobnej sytuacji może dojść na wąskim moście o ruchu dwukierunkowym. Gdy na ten most wjadą z przeciwnych kierunków dwa samochody, będą się wzajemnie blokować. Porównując to do poprzedniej sytuacji, zauważymy, że mamy do czynienia z dwoma zasobami (dwie połówki mostu). Żeby przejechać, trzeba mieć przydzielone je obydwie. W tym wypadku każdy z samochodów zajął po jednym zasobie (jednej połówce mostu) i czeka na przydział tej drugiej połówki. Znając upór polskich kierowców, można przypuszczać, że nieprędko któryś z nich ustąpi i się wycofa (dojdzie do wywłaszczenia). Inny rodzaj chamstwa drogowego nosi nazwę pociągu i polega na tym, że kierowcy z jednej strony mostu formują spójną kolumnę i bez przerwy jadą przez most, nie dając możliwości przejechania komukolwiek z drugiej strony mostu (mamy wówczas do czynienia z zagłodzeniem).

Model systemu

Rozważania o zakleszczeniu będziemy prowadzić w ramach pewnego modelu systemu. Zakłada się w nim, że w systemie jest m rodzajów zasobów oznaczanych Z(1), Z(2), ..., Z(m). Dla każdego i=1, 2, ..., m, E(i) oznacza liczbę egzemplarzy zasobu Z(i).

Procesy korzystający z zasobu wykonuje następujące działania:

  1. żąda przydzielenia zasobu,
  2. korzysta z zasobu,
  3. zwalnia zasób.


Warunki konieczne

Aby mogło dojść do zakleszczenia, muszą zachodzić cztery następujące warunki. Nie gwarantują one zakleszczenia, ale jeśli choć jeden z nich nie jest spełniony, do zakleszczenia nie dojdzie.

Wzajemne wykluczanie
W jednej chwili z jednego zasobu może korzystać co najwyżej jeden proces.
Przetrzymywanie i oczekiwanie
Proces przetrzymujący co najmniej jeden zasób czeka na przydział dodatkowych zasobów, które są przydzielone innym procesom.
Brak wywłaszczania
Procesy zwalniają zasoby dobrowolnie po zakończeniu swojego zadania. Nie można odebrać procesowi przydzielonego zasobu, którego ten nie ma ochoty zwolnić.
Czekanie cykliczne
Istnieje zbiór czekających procesów {P(1), P(2), ..., P(n)}, takich, że:

Graf przydziału zasobów

Graf przydziału zasobów jest obiektem matematycznym, za którego pomocą łatwo jest analizować zakleszczenia. Zauważmy, że jeden z warunków koniecznych zakleszczenia mówi właśnie o cyklu w jakimś grafie. Fakt istnienia, bądź nie, cyklu w tym grafie ściśle wiąże się więc z występowaniem zakleszczeń.

Graf przydziału zasobów jest skierowany.

Wierzchołkami tego grafu są procesy działające w systemie P(1), P(2), ..., P(n) oraz zasoby systemowe Z(1), Z(2), ..., Z(m).

Krawędź żądania od procesu P(i) do zasobu Z(j) oznacza, że proces P(i) zażądał przydzielenia zasobu Z(j).

Krawędź przypisania od zasobu Z(j) do procesu P(i) oznacza, że zasób Z(j) jest przydzielony procesowi P(i).

Jeśli w tym grafie występuje cykl, może to oznaczać istnienie zakleszczenia. Wyobraźmy sobie dwa procesy P(1) i P(2) oraz dwa zasoby Z(1) i Z(2), z których każdy ma tylko jeden egzemplarz. Procesowi P(1) przydzielono zasób Z(1), a procesowi P(2) przydzielono zasób Z(2). Jednocześnie proces P(1) zażądał zasobu Z(2) a proces P(2) zażądał zasobu Z(1). Te procesy są w stanie zakleszczenia. Oto graf przydziału zasobów, na którym zobaczysz czteroelementowy cykl będący zakleszczeniem.

Cykl w grafie przydziału zasobów nie wystarcza do tego, żeby było zakleszczenie. Gdyby w poprzednim przykładzie były dwa egzemplarze Z(1), to oczywiście zakleszczenia by nie było, tak jak na poniższym rysunku.

Jeśli w grafie przydziału zasobów jest cykl i wszystkie zasoby w tym cyklu są jednoegzemplarzowe, to na pewno ma miejsce zakleszczenie.


Metody obsługi zakleszczeń

Jedną z metod jest zapewnienie, że system nigdy nie znajdzie się w stanie zakleszczenia. Można też dopuścić do powstania zakleszczenia, wykryć to, a potem zlikwidować zaistniałą sytuację. Niestety wiele w wielu systemach ignoruje się ten problem i udaje się, że zakleszczenia występują jedynie w przekazach ludowych i legendach. Jednym z tych systemów jest Unix.

Wyróżniamy w zasadzie trzy metody radzenia sobie z zakleszczeniami:

Zapobieganie zakleszczeniom
Polega na zaprzeczeniu co najmniej jednemu z czterech warunków koniecznych zakleszczenia. Gdy co najmniej jeden z tych warunków nie jest spełniony, mamy pewność, że do zakleszczenia nie dojdzie.
Unikanie zakleszczeń
Gdy stosujemy tę metodę wszystkie warunki konieczne występowania zakleszczeń są prawdziwe. Nie dopuszczamy do zakleszczeń poprzez badanie stanu systemu przed każdym żądaniem przydziału zasobów i niekiedy odrzucamy to żądanie nawet wtedy, gdy są wolne zasoby, ale uznaliśmy, że spełnienie tego żądania może prowadzić do zakleszczenia. Unikanie zakleszczeń zwykle wymaga dodatkowej wiedzy o procesach (np. o ich maksymalnym dopuszczalnym zapotrzebowaniu na zasoby).
Wykrywanie zakleszczeń i odtwarzanie
Dopuszczamy powstawanie zakleszczeń, ale umiemy je wykrywać, likwidować i przywracać normalne działanie systemu po tym zabiegu.

Zapobieganie

Zapobieganie zakleszczeniom polega na zaprzeczeniu co najmniej jednemu z czterech warunków koniecznych zakleszczenia. Gdy co najmniej jeden z tych warunków nie jest spełniony, mamy pewność, że do zakleszczenia nie dojdzie.

Brak wzajemnego wykluczania (pierwszy warunek) oznacza eliminację całego problemu. W rzeczywistości korzystanie z większości zasobów i urządzeń wymaga wyłączności, więc zapobieganie zakleszczeniom nie może polegać na eliminacji tego warunku.

Brak przetrzymywania i oczekiwania można zrealizować na przykład w ten sposób, że proces musi zażądać kompletu potrzebnych zasobów zanim przystąpi do działania. Można też zezwolić na żądanie przydzielenia zasobów tylko tym procesom, które nie są w posiadaniu żadnego zasobu. Niestety prowadzi to do niskiego wykorzystania zasobów i możliwości zagłodzenia procesów, które jednocześnie wykorzystują wiele zasobów.

Wywłaszczanie można zrealizować na przykład tak, że proces żądający zasobu, który nie jest obecnie dostępny, musi zwrócić wszystkie posiadane przez siebie zasoby. Następnie jest on umieszczamy w kolejce oczekiwania na zasób, którego zażądał, i zasoby, które przymusowo zwolnił. Proces ten będzie wznowiony dopiero wtedy, gdy wszystkie te zasoby będą dostępne i proces je otrzyma.

Wykluczenie czekania cyklicznego można osiągnąć poprzez ponumerowanie wszystkich rodzajów zasobów i wprowadzenie zasady, że proces musi żądać zasobów w kolejności rosnących numerów zasobów (np. nie może zażądać zasobu 4 po przydzieleniu mu zasobu 7).


Unikanie

Gdy stosujemy metodę unikania zakleszczeń wszystkie warunki konieczne są prawdziwe. Nie dopuszczamy do zakleszczeń poprzez badanie stanu systemu przed każdym żądaniem przydziału zasobów i niekiedy odrzucamy to żądanie nawet wtedy, gdy są wolne zasoby, ale uznaliśmy, że spełnienie tego żądania może prowadzić do zakleszczenia. Unikanie zakleszczeń zwykle wymaga dodatkowej wiedzy o procesach. Najprostszą i najbardziej przydatną informacją tego rodzaju są dane o maksymalnym dopuszczalnym zapotrzebowaniu na zasoby w każdym procesie.

W algorytmie unikania dynamicznie bada się stan przed każdym żądaniem i sprawdza się, czy jego spełnienie może doprowadzić do czekania cyklicznego.

Stan bezpieczny

Realizując unikanie zakleszczeń, możemy na przykład przez cały czas utrzymywać stan bezpieczny, tzn. taki, w którym istnieje ciąg bezpieczny.

Ciąg procesów P(1), P(2), ..., P(n) nazywamy bezpiecznym, gdy dla i=1, 2, ..., n maksymalne potrzeby procesu P(i) mogą być zaspokojone za pomocą obecnie dostępnych zasobów i zasobów będących w posiadaniu procesów P(1), P(2), ..., P(i-1). Intuicja kryjąca się za tą definicją polega na tym, że zakładamy, iż proces, którego maksymalne potrzeby zaspokojono, kończy się i zwalnia posiadane przez siebie zasoby. Proces P(i) może więc korzystać z zasobów zwolnionych przez poprzednie procesy w ciągu, ponieważ zakładamy, że one już skończyły swoje zadania.

Jeśli system jest w stanie bezpiecznym, nie ma zakleszczeń, ponieważ istnieje możliwa do zrealizowania kolejność wykonania i zakończenia wszystkich procesów. Stan niebezpieczny nie oznacza jednak konieczności istnienia zakleszczenia (np. proces nie zawsze musi żądać wszystkich zadeklarowanych przez siebie zasobów). Unikanie polega jednak na utrzymywaniu systemu w stanie bezpiecznym.


Algorytm bankiera

Algorytm bankiera służy do sprawdzenia, czy stan jest bezpieczny. Polega on na skonstruowaniu ciągu bezpiecznego. Przypuśćmy, że jest n procesów P(1), P(2), ..., P(n) oraz m procesów Z(1), Z(2), ..., Z(n). W trakcie realizacji algorytmu bankiera wykorzystuje się następujące tablice.

Dostępne[1..m]
Dostępne[i] to liczba dostępnych w danej chwili egzemplarzy zasobu Z(i).
Max[1..n, 1..m]
Max[j, i] to maksymalna liczba egzemplarzy zasobu Z(i), których może używać proces P(j) (wg jego deklaracji).
Przydział[1..n, 1..m]
Przydział[j, i] to liczba egzemplarzy zasobu Z(i) w posiadaniu procesu P(j).
Potrzeby[1..n, 1..m]
Potrzeby[j, i] to liczba egzemplarzy zasobu Z(i), których dodatkowo może zażądać proces P(j). Prawdą jest że:
Potrzeby[j, i] = Max[j, i] - Przydział[j, i]
Koniec[1..n]
Koniec[j] = true wtedy i tylko wtedy, gdy proces P(j) może być zakończony w dotychczas skonstruowanym fragmencie początkowym ciągu bezpiecznego.
Robocze[1..m]
Robocze[i] to liczba egzemplarzy zasobu Z(i) dostępnych po zakończeniu wszystkich procesów, dla których Koniec[j] = true. Jest to zestaw zasobów zwolnionych przez procesy znajdujące się w dotychczas skonstruowanym fragmencie początkowym ciągu bezpiecznego.

Algorytm sprawdzania, czy stan jest bezpieczny

Stan systemu jest zadany przez tablice Potrzeby, Przydział i Dostępne. Zadaniem algorytmu jest stwierdzenie, czy ten stan jest bezpieczny. W algorytmie wykorzystamy tablice Koniec i Robocze. Oto kolejne kroki:

  1. Zainicjuj tablicę Koniec wartościami false a tablicę Robocze zawartością tablicy Dostępne.
  2. Znajdź takie j, że: (j to numer kolejnego procesu dodawanego na końcu już skonstruowanego fragmentu ciągu bezpiecznego; maksymalne potrzeby tego procesu mogą być zaspokojone przez zasoby zwolnione przez procesy znajdujące się wcześniej w już skonstruowanym fragmencie ciągu bezpiecznego)
  3. Jeśli nie ma takiego j, idź do kroku 6.
  4. Jeśli jest takie j: (po dodaniu procesu P(j) do konstruowanego ciągu bezpiecznego, zakładamy, że ten proces kończy się i zwalnia wszystkie swoje zasoby; są one teraz dostępne dla pozostałych procesów).
  5. Wróć do kroku 2.
  6. Jeśli dla każdego j = 1, 2, ..., n, Koniec[j] = true, to stan jest bezpieczny (skonstruowaliśmy ciąg bezpieczny).
  7. W przeciwnym wypadku, stan nie jest bezpieczny.

Obsługa żądania procesu

Przypuśćmy, że proces P(j) zażądał zasobów opisanych za pomocą tablicy Żądane[1..m] (Żądane[i] to liczba egzemplarzy zasobu P(i), których żąda proces P(j)). Rozważmy obsługę tego żądania w systemie, w którym stosujemy algorytm bankiera przy realizacji strategii unikania zakleszczeń.

  1. Jeśli Żądane > Potrzeby[j], to znaczy, że proces żąda więcej zasobów niż zadeklarowane na początku maksimum. Takie zlecenie jest odrzucane.
  2. Jeśli Żądane > Dostępne, to znaczy, że proces żąda więcej zasobów niż zadeklarowane na początku maksimum. Takie zlecenie jest odrzucane.
  3. Jeśli żaden z tych warunków nie jest spełniony, konstruujemy stan, który powstałby po spełnieniu tego żądania i sprawdzamy, czy jest on bezpieczny. Nowy stan otrzymamy wykonując następujące zmiany w tablicach:
    Dostępne := Dostępne - Żądane
    Przydział[j] := Przydział[j] + Żądane
    Potrzeby[j] := Potrzeby[j] - Żądane
  4. Jeśli taki stan jest bezpieczny, żądanie jest spełnianie. Jeśli taki stan nie jest bezpieczny, proces P(j) musi czekać (mimo, że te zasoby są wolne! To właśnie jest koszt unikania zakleszczeń).

Przykład

Rozważmy sytuację, w której są trzy procesy P(1), P(2) i P(3) oraz dwa rodzaje zasobów Z(1) i Z(2), które mają po 3 egzemplarze. Oto stan systemu opisany tablicami Przydział, Max i Dostępne.

Przydział Max Dostępne
Proces   Z(1)    Z(2)     Z(1)    Z(2)     Z(1)    Z(2)  
P(1)
0
0
2
1
1
1
P(2)
2
1
2
3
P(3)
0
1
1
1

System jest w stanie bezpiecznym, ponieważ istnieje ciąg bezpieczny P(3), P(2), P(1). W obecnym stanie możemy spełnić maksymalne potrzeby P(3). Zakładamy więc, że P(3) zwolni posiadany jeden egzemplarz zasobu Z(2). To z kolei pozwoli na spełnienie maksymalnych żądań P(2) i zwolnienie jego zasobów. Wówczas będzie można spełnić maksymalne żądania P(1).


Wykrywanie

Stosując tę metodę radzenia sobie z zakleszczeniami, dopuszczamy powstawanie zakleszczeń, ale umiemy je wykrywać, likwidować i przywracać normalne działanie systemu po tym zabiegu.

Graf oczekiwania

Gdy w systemie występuje po dokładnie jednym egzemplarzu każdego zasobu, można skorzystać z grafu oczekiwania. Jest to uproszczona postać grafu przydziału zasobów.

Graf oczekiwania jest skierowany.

Wierzchołkami tego grafu są procesy działające w systemie P(1), P(2), ..., P(n).

Krawędź oczekiwania od procesu P(k) do procesu P(l) oznacza, że proces P(k) czeka na zwolnienie zasobu przez proces P(l).

Istnienie cyklu w tym grafie oznacza zakleszczenie. Wykrywanie zakleszczenia może więc polegać na utrzymywaniu tego grafu i okresowe sprawdzanie istnienia w nim cyklu. Koszt takiego algorytmu (np. poprzez wyszukiwanie w głąb) jest proporcjonalny do liczby krawędzi grafu, która maksymalnie może wynieść n^2.

Oto przykładowy graf oczekiwania. Proces P(1) oczekuje na zwolnienie jakiegoś zasobu przez proces P(2), zaś proces P(2) oczekuje na zwolnienie jakiegoś zasobu przez proces P(3). Gdy teraz proces P(3) zażąda zasobu będącego w posiadaniu procesu P(1), w grafie pojawi się nowa (zaznaczona na czerwono krawedź), która spowoduje powstanie cyklu w grafie oczekiwania, czyli zakleszczenie:

Algorytm bankiera raz jeszcze

Wykrywanie zakleszczeń można przeprowadzić też metodą podobną do algorytmu bankiera. Wykorzystuje się w nim tablice Dostępne, Przydział, Koniec i Robocze, takie jak poprzednio oraz tablicę:

Żądane[1..n, 1..m]
Żądane[j, i] to liczba egzemplarzy zasobu Z(i), na których przydział oczekuje proces P(j).
Algorytm polega na sprawdzeniu, czy istnieje taki ciąg procesów P(1), P(2), ..., P(n), że dla i=1, 2, ..., n żądanie procesu P(i) może być zaspokojone za pomocą obecnie dostępnych zasobów i zasobów będących w posiadaniu procesów P(1), P(2), ..., P(i-1). Intuicja kryjąca się za tą definicją jest taka, jak w algorytmie bankiera. Zakładamy, iż proces, którego żądanie zaspokojono, kończy się i zwalnia posiadane przez siebie zasoby. Proces P(i) może więc korzystać z zasobów zwolnionych przez poprzednie procesy w ciągu, ponieważ zakładamy, że one już skończyły swoje zadania.

  1. Zainicjuj tablicę Koniec wartościami false dla procesów, które coś mają przydzielone (Przydział[j] ≠ 0) i wartościami true dla procesów, które nic nie mają przydzielone (Przydział[j] = 0). Tablicę Robocze zainicjuj zawartością tablicy Dostępne.
  2. Znajdź takie j, że: (j to numer kolejnego procesu dodawanego na końcu już skonstruowanego fragmentu ciągu; żądanie tego procesu może być zaspokojone przez zasoby zwolnione przez procesy znajdujące się wcześniej w już skonstruowanym fragmencie ciągu)
  3. Jeśli nie ma takiego j, idź do kroku 6.
  4. Jeśli jest takie j: (po dodaniu procesu P(j) do konstruowanego ciągu, zakładamy, że ten proces kończy się i zwalnia wszystkie swoje zasoby; są one teraz dostępne dla pozostałych procesów).
  5. Wróć do kroku 2.
  6. Jeśli dla każdego j = 1, 2, ..., n, Koniec[j] = true, to w systemie nie ma zakleszczenia (skonstruowaliśmy scenariusz wyjścia z obecnego stanu).
  7. W przeciwnym wypadku, w systemie jest zakleszczenie. Co więcej, zakleszczone są procesy, dla których Koniec[j] = false.

Odtwarzanie

Po wykryciu zakleszczenia należy je zlikwidować. Można na przykład przerwać wszystkie zakleszczone procesy. Jest to jednak zbyt brutalna metoda. Lepiej jest przerywać zakleszczone procesy po jednym do chwili, w której zakleszczenie zniknie. Zwykle powinno wystarczyć przerwanie jednego procesu. Oto kryteria, z których można skorzystać przy wyborze procesu do przerwania:

Przy wyborze ofiary należy minimalizować koszt takiej decyzji, np. nie zabijać procesu, który zaraz się skończy, zabijać jak najmniej procesów etc. Jeśli to możliwe, zamiast przerywać proces można go wycofać do jakiegoś wcześniejszego bezpiecznego stanu (tak robi się w bazach danych przy zerwaniu transakcji!). Należy też zwracać uwagę na zagłodzenie -- pewien proces może zawsze stawać się ofiarą odtwarzania po zakleszczeniu i nigdy nie zakończyć działania. Rozwiązaniem może być tu dynamiczne zwiększanie priorytetu procesu po każdym zakleszczeniu, którego był ofiarą.


Podsumowanie

W wykładzie 6 poznaliśmy pojęcie zakleszczenia oraz konsekwencje wystąpienia takiej sytuacji w systemie operacyjnym.

Poznaliśmy też różnorakie podejścia do radzenia sobie z zakleszczeniami. Były to zapobieganie, unikanie i wykrywanie z odtwarzaniem. Warto dobrze przyswoić sobie różnice między zapobieganiem i unikaniem, ponieważ z naszych doświadczeń wynika, że te dwa jakże odmienne pojęcia są często mylone.

Przedstawiliśmy też dwie wersje algorytmu bankiera. Jedna służyła do implementacji unikania zakleszczeń, a druga była metodą ich wykrywania.

Czasem warto stosować strategie mieszane. Można podzielić zasoby na klasy i w każdej z tych klas stosować inną metodę (zapobieganie, unikanie albo wykrywanie z odtwarzaniem), najlepszą w wypadku tej klasy zasobów.


Słownik

algorytm bankiera
Algorytm sprawdzania, czy stan jest bezpieczny.
czekanie cykliczne
Zbiór czekających procesów, z których pierwszy czeka na drugi, drugi na trzeci, itd. a ostatni proces czeka na ten pierwszy.
graf oczekiwania
Graf, którego wierzchołkami są procesy, a każda krawędź reprezentuje fakt oczekiwania jednego procesu na drugi. Cykl w tym grafie oznacza zakleszczenie.
graf przydziału zasobów
Graf, którego wierzchołkami są procesy i zasoby, a każda krawędź reprezentuje przydzielenie zasobu procesowi albo żądanie zasobu przez proces. Cykl w tym grafie może oznaczać zakleszczenie.
odtwarzanie
Czynności podejmowane po wykryciu zakleszczenia.
stan bezpieczny
Stan, który gwarantuje brak zakleszczenia.
unikanie
Metoda radzenia sobie z zakleszczeniami, przy której stosowaniu wszystkie warunki konieczne powstawania zakleszczeń są prawdziwe. Nie dopuszcza ona do zakleszczeń poprzez badanie stanu systemu przed każdym żądaniem przydziału zasobów i odrzucaniu niektórych żądań nawet wtedy, gdy są wolne zasoby. Unikanie zakleszczeń zwykle wymaga dodatkowej wiedzy o procesach.
wykrywanie
Metoda radzenia sobie z zakleszczeniami, która polega na dopuszczeniu do powstawania zakleszczeń, wykrywaniu i ich likwidacji oraz przywracaniu normalnego działania systemu po tym zabiegu.
zakleszczenie
Zbiór procesów w będących w impasie wywołanym przez to, że każdy proces należący do tego zbioru przetrzymuje zasoby potrzebne innym procesom z tego zbioru, a jednocześnie czeka na zasoby przydzielone innym procesom.
zapobieganie
Metoda radzenia sobie z zakleszczeniami, która polega na zaprzeczeniu co najmniej jednemu z czterech warunków koniecznych zakleszczenia. Gdy co najmniej jeden z tych warunków nie jest spełniony, mamy pewność, że do zakleszczenia nie dojdzie.

Zadania

  1. (2p.) Narysuj przykładowy graf przydziału (jednokrotnych) zasobów (bez zakleszczenia) i sprawdź, jakie przykładowe żądania przydzielenia zasobów spowodują powstanie zakleszczenia, a jakie nie.
  2. (5p.) W systemie są następujące liczby egzemplarzy zasobów:

    Aktualnie przydzielone zasoby (i maksymalne zapotrzebowania) są następujące:

    Aktualny przydziałMaksymalne zapotrzebowanie
    ABCDE
    P120010
    P232020
    P300103
    P430000
    P500002
    ABCDE
    P150023
    P232130
    P301103
    P460024
    P523042

    Czy ten system jest w stanie bezpiecznym? Podaj sekwencję kończenia procesów świadczącą o tym.

  3. (3p.) Co się stanie, gdy zgłoszone zostaną następujące żądania przydzielenia zasobów:
Jeżeli zasoby zostaną przydzielone, podaj odpowiednią sekwencję kończenia procesów. Jeżeli nie, podaj przyczynę.
Strona przygotowana przez Marcina Kubicę i Krzysztofa Stencla.