Salta al contenuto
Note per Studenti Esercizio - Algoritmo del banchiere su quattro risorse (eserciziario, esercizio 5)

Esercizio - Algoritmo del banchiere su quattro risorse (eserciziario, esercizio 5)

In questa pagina 4

Testo (eserciziario del corso di Sistemi Operativi, Ing. Informatica UniPD, esercizio 5). Un sistema ha quattro risorse A,B,C,DA, B, C, D con 8, 2, 7, 2 istanze, allocate all'istante tt a P0,…,P4P_0, \dots, P_4:

Assegnate A B C DA\,B\,C\,D Massimo A B C DA\,B\,C\,D
P0P_0 1 0 1 1 1 1 1 2
P1P_1 2 0 0 0 3 1 0 1
P2P_2 1 1 1 0 1 1 3 1
P3P_3 0 1 2 0 1 2 2 0
P4P_4 3 0 1 1 4 0 3 1

Con Ri=(a,b,c,d)R_i = (a,b,c,d) richiesta di PiP_i (ognuna considerata indipendentemente): (1) R0=(1,0,1,0)R_0 = (1,0,1,0); (2) R1=(1,0,0,0)R_1 = (1,0,0,0); (3) R2=(0,0,1,0)R_2 = (0,0,1,0); (4) R3=(1,1,0,0)R_3 = (1,1,0,0); (5) R2=(0,0,2,0)R_2 = (0,0,2,0). Quali sono soddisfacibili? Alla luce delle risposte, lo stato all'istante tt è sicuro? Teoria: Deadlock - condizioni, prevenzione, evitamento e rilevamentoUn deadlock (stallo) è una situazione in cui un insieme di processi attende all'infinito risorse possedute da altri processi dello stesso insieme; può verificarsi solo se valgono insieme quattro condizioni (mutua esclusione, hold and wait, assenza di prelazione, attesa circolare); il grafo di allocazione delle risorse (archi di richiesta P->R e di assegnazione R->P) senza cicli esclude lo stallo, con un ciclo lo implica se ogni risorsa ha una sola istanza, e lo rende solo possibile se ha più istanze; si può prevenire (negare una delle quattro condizioni, per esempio ordinare le risorse per negare l'attesa circolare), evitare (stato sicuro: esiste una sequenza sicura; algoritmo del grafo con archi di rivendicazione per istanza singola, algoritmo del banchiere con Available, Max, Allocation, Need = Max - Allocation e complessità O(m n^2) per istanze multiple), rilevare e ripristinare (grafo wait-for per istanza singola, algoritmo di rilevamento per istanze multiple; terminazione dei processi o prelazione delle risorse con scelta della vittima e rollback), oppure ignorare.Deadlock - condizioni, prevenzione, evitamento e rilevamento →.

Strutture dati

Assegnate in totale: (1+2+1+0+3, 0+0+1+1+0, 1+0+1+2+1, 1+0+0+0+1)=(7,2,5,2)(1+2+1+0+3,\ 0+0+1+1+0,\ 1+0+1+2+1,\ 1+0+0+0+1) = (7, 2, 5, 2); Available =(8,2,7,2)−(7,2,5,2)=(1,0,2,0)= (8,2,7,2) - (7,2,5,2) = (1,0,2,0).

Need == Massimo −- Assegnate:

A B C DA\,B\,C\,D
P0P_0 0 1 0 1
P1P_1 1 1 0 1
P2P_2 0 0 2 1
P3P_3 1 1 0 0
P4P_4 1 0 2 0

Lo stato a tt è sicuro?

Prima di valutare le richieste si verifica la sicurezza dello stato di partenza. Si prova ⟨P4,P2,P1,P0,P3⟩\langle P_4, P_2, P_1, P_0, P_3 \rangle:

passo processo Need≤WorkNeed \le Work WorkWork dopo
inizio (1,0,2,0)(1,0,2,0)
1 P4P_4 (1,0,2,0)≤(1,0,2,0)(1,0,2,0) \le (1,0,2,0) sì +(3,0,1,1)=(4,0,3,1)+(3,0,1,1) = (4,0,3,1)
2 P2P_2 (0,0,2,1)≤(4,0,3,1)(0,0,2,1) \le (4,0,3,1) sì +(1,1,1,0)=(5,1,4,1)+(1,1,1,0) = (5,1,4,1)
3 P1P_1 (1,1,0,1)≤(5,1,4,1)(1,1,0,1) \le (5,1,4,1) sì +(2,0,0,0)=(7,1,4,1)+(2,0,0,0) = (7,1,4,1)
4 P0P_0 (0,1,0,1)≤(7,1,4,1)(0,1,0,1) \le (7,1,4,1) sì +(1,0,1,1)=(8,1,5,2)+(1,0,1,1) = (8,1,5,2)
5 P3P_3 (1,1,0,0)≤(8,1,5,2)(1,1,0,0) \le (8,1,5,2) sì +(0,1,2,0)=(8,2,7,2)+(0,1,2,0) = (8,2,7,2)

Lo stato è sicuro. (Ogni passo restituisce le risorse; alla fine Work è uguale al totale.)

Le cinque richieste

  1. R0=(1,0,1,0)R_0 = (1,0,1,0). Controllo R≤Need0=(0,1,0,1)R \le Need_0 = (0,1,0,1): 1>01 > 0 per AA e per CC. Richiesta non valida (P0P_0 eccede il massimo dichiarato).
  2. R1=(1,0,0,0)R_1 = (1,0,0,0). ≤Need1=(1,1,0,1)\le Need_1 = (1,1,0,1) sì; ≤Available=(1,0,2,0)\le Available = (1,0,2,0) sì. Simulazione: Available =(0,0,2,0)= (0,0,2,0), Need1=(0,1,0,1)Need_1 = (0,1,0,1). Nessun processo ha Need≤(0,0,2,0)Need \le (0,0,2,0): P0P_0 e P1P_1 vogliono BB e DD, P2P_2 vuole DD, P3P_3 vuole AA e BB, P4P_4 vuole AA. Stato non sicuro: non soddisfacibile.
  3. R2=(0,0,1,0)R_2 = (0,0,1,0). ≤Need2=(0,0,2,1)\le Need_2 = (0,0,2,1) sì; ≤(1,0,2,0)\le (1,0,2,0) sì. Simulazione: Available =(1,0,1,0)= (1,0,1,0), Need2=(0,0,1,1)Need_2 = (0,0,1,1). Con il massimo scritto nel testo (P4P_4 può chiedere 3 di CC) Need4=(1,0,2,0)Need_4 = (1,0,2,0) e 2>12 > 1 per CC: nessun processo può finire (a P0P_0, P1P_1 servono BB; a P2P_2 serve DD; a P3P_3 serve BB): stato non sicuro, non soddisfacibile.
    • Discrepanza nel materiale del corso. La soluzione del corso dice che questa richiesta è soddisfacibile, con la sequenza sicura ⟨P4,P2,P0,P1,P3⟩\langle P_4, P_2, P_0, P_1, P_3 \rangle: perché usa Need4=(1,0,1,0)Need_4 = (1,0,1,0), cioè un massimo di P4P_4 per CC pari a 2 invece di 3. Il corso lo ammette in una nota ("nelle soluzioni si considera come valore Massimo di P4P_4 in CC non 3 ma 2"). Con il testo scritto (3) la risposta è no; con 2 è sì.
  4. R3=(1,1,0,0)R_3 = (1,1,0,0). ≤Need3=(1,1,0,0)\le Need_3 = (1,1,0,0) sì, ma (1,1,0,0)≤(1,0,2,0)(1,1,0,0) \le (1,0,2,0) no (BB: 1 > 0). P3P_3 deve attendere (risorse non disponibili).
  5. R2=(0,0,2,0)R_2 = (0,0,2,0). ≤Need2\le Need_2 sì; ≤Available\le Available sì. Simulazione: Available =(1,0,0,0)= (1,0,0,0), Need2=(0,0,0,1)Need_2 = (0,0,0,1). Solo i processi che non chiedono BB, CC, DD potrebbero finire: nessuno ha Need≤(1,0,0,0)Need \le (1,0,0,0) (P4P_4 vuole 2 di CC, P2P_2 vuole 1 di DD). Non sicuro: non soddisfacibile.

Ultima domanda. Non ha senso valutare la sicurezza dello stato a tt in base al fatto che le richieste risultino o meno soddisfacibili: lo stato a tt è sicuro, come verificato all'inizio, e una richiesta rifiutata non lo rende insicuro (viene solo fatta attendere).

Tutti i calcoli sono stati ricontrollati con un programma Python.

Domande d'esame

Prima di valutare una richiesta, perché si controlla che lo stato corrente sia sicuro? Traccia. L'algoritmo di richiesta assume che lo stato di partenza sia sicuro: se non lo fosse, nessuna assegnazione potrebbe garantire di non cadere in deadlock.

Versione ripasso

Teoria collegata