Perché lo stato non sicuro non causa sempre un deadlock?


10

Stavo leggendo i sistemi operativi di Galvin e mi sono imbattuto nella riga in basso,

Tuttavia, non tutti gli stati non sicuri sono deadlock. Uno stato non sicuro può portare a deadlock

Qualcuno può spiegare come deadlock! = Stato non sicuro ? Ho anche preso la stessa linea qui

Se non esiste una sequenza sicura, il sistema si trova in uno stato non sicuro, che può portare a un deadlock. (Tutti gli stati sicuri sono senza deadlock, ma non tutti gli stati non sicuri portano a deadlock.)


1
deadlock può essere un concetto simile a una condizione di gara che si verifica in modo intermittente. il codice non sicuro attiva il deadlock solo quando si allinea una particolare sequenza. quella sequenza potrebbe "accadere in qualsiasi momento", anche "incidente in attesa di accadere" ...
vzn,

stato non sicuro significa, teoricamente esiste la possibilità di un deadlock. deadlock può verificarsi quando accadono alcune cose specifiche. per uno stato sicuro, non importa cosa succede, non può esserci un deadlock.
nishantbhardwaj2002,

1
Per le stesse identiche ragioni per cui qualsiasi situazione pericolosa (nella vita reale) non fa sempre accadere cose brutte.
David Richerby,

Risposte:


14

Deadlock significa qualcosa di specifico: ci sono due (o più) processi che sono attualmente bloccati in attesa l'uno dell'altro.

In uno stato non sicuro , puoi anche trovarti in una situazione in cui potrebbe esserci un punto morto in futuro, ma non è ancora successo perché uno o entrambi i processi non hanno effettivamente iniziato ad aspettare.

Considera il seguente esempio:

Process A                  Process B
lock X                     lock Y           # state is "unsafe"
                           unlock Y
lock Y                                      # state is back to "safe" (no deadlock this time.  We got lucky.)

C'è un esempio più interessante nella Sezione 7.5.1 del link che hai fornito :

Prendi in considerazione un sistema con 12 unità nastro con:

Process       Max Need       Current
P0:             10              5
P2:              9              3

Questo è uno stato non sicuro. Ma non siamo in un punto morto. Ci sono solo 4 unità libere, così, per esempio, se P0 fa richiesta di un ulteriore 5, P2 e fa richiesta di un ulteriore 1, ci sarà stallo, ma non è ancora successo. E P0 potrebbe non richiedere più unità, ma potrebbe invece liberare le unità che già possiede. Il Max needè su tutte le possibili esecuzioni del programma, e questo potrebbe non essere una delle esecuzioni in cui abbiamo bisogno tutti e 10 le unità in P0.


Grazie molte signore! e odio il mio libro di testo poco chiaro ...
Ning

Ma ho anche alcune domande: (1) Hai detto ["] La necessità massima è su tutte le possibili esecuzioni del programma [."] , Ma hai anche detto ["] se P0 richiede un ulteriore 5 e P2 lo richiede un ulteriore 1, ci sarà deadlock [. "] , dove (1) mezzi se Max Bisogno non è raggiunto E ' possibile avere stallo, mentre (2) mezzi devono avere deadlock quando non è raggiunto?
Ning

È il mio ragionamento corretto ?: Se P2 fa richiesta di un ulteriore 1 e finire , poi i nastri liberi diventano (4 + 3 = 7), e poiché P1 richiedere ulteriori 5 allora si può ottenere, in modo che nessun stallo. Ma se P2 non termina, si verifica un deadlock poiché anche se P1 necessita solo di 5 per finire, sempre 4 <5.
Ning

Per l'ultimo esempio: P0 richiede 5 aggiuntivi, quindi 5 + 5 + 3 = 13> 12, quindi P0 deve attendere P2, per generare deadlock basta lasciare che P2 ne richieda uno aggiuntivo.
Bit_hcAlgorithm

7

Giusto per spiegare ciò che stava dicendo Wandering Logic.

Supponiamo che io abbia due thread che necessitano entrambi dell'accesso a X e Y e che non hanno sincronizzazione né meccanismi per correggere il deadlock. Questo non è sicuro, poiché uno potrebbe bloccare X e l'altro Y e quindi nessuno dei due potrebbe procedere. Ma non è garantito.

Thread 1                    Thread 2
Lock X                      
Lock Y
OS Interrupts Thread 1 and passes control to Thread 2
                            Unable to lock needed resources.
OS Interrupts Thread 2 and passes control to Thread 1
Unlock X                    
Unlock Y                    
                            Lock Y
                            Lock X
 ....

Questo scenario non si è concluso in un punto morto, ma avrebbe potuto. A causa del modo in cui funziona il threading, non esiste un flusso impostato. Il sistema operativo controlla il threading e quindi potrebbe verificarsi qualcosa di simile al seguente:

Thread 1                    Thread 2
Lock X        
OS Interrupts Thread 1 and passes control to Thread 2
                            Lock Y              
DEADLOCK Thread 1 needs Y, Thread 2 needs X. Neither knows to back down and simply waits.

1

Lo stato sicuro è sicuro senza deadlock, ma se non è possibile soddisfare tutti i requisiti per prevenire deadlock, potrebbe verificarsi. Ad esempio, se due thread possono cadere in deadlock quando iniziano il thread A, quindi il thread B, ma quando iniziano il contrario (B, A) funzioneranno bene - supponiamo che B sia più bello;) Lo stato del sistema non è sicuro, ma con fortunata sequenza di partenza funzionerà. Nessun deadlock, ma è possibile. Se anche li sincronizzi manualmente - avvia in buon ordine - è pericoloso - per qualche motivo potrebbero non essere attivati ​​a tuo piacimento - il sistema non è ancora sicuro (a causa di possibili deadlock) ma ci sono poche probabilità. In caso di eventi esterni come il congelamento di thread o interruzioni dopo il proseguimento, l'operazione fallirà.

Devi rendertene conto: lo stato sicuro è condizione sufficiente per evitare lo stallo, ma non sicuro è solo condizione essenziale. In questo momento è difficile scrivere il codice fuori di testa, ma posso cercarne un po '. Ho riscontrato codice in Ada che più di 99/100 volte funzionava perfettamente per diverse settimane (e poi si fermava a causa del riavvio del server non del deadlock) ma di tanto in tanto si bloccava dopo alcuni secondi nello stato di deadlock.

Consentitemi di aggiungere un semplice esempio confrontandolo con la divisione: se la funzione divide c / d e restituisce il risultato, senza verificare se d è uguale a 0, potrebbe esserci una divisione per errore zero, quindi il codice non è sicuro (lo stesso nome è destinato), ma fino a quando fai una tale divisione, tutto va bene, ma dopo che il codice di analisi teorica non è sicuro e potrebbe cadere in un comportamento indefinito non gestito correttamente.


0

Ecco la mia comprensione su questo (per favore correggimi se sbaglio): (A) Se deadlock, significa che esiste un ciclo (una delle condizioni necessarie) (B) Un ciclo è condizione obbligatoria per deadlock (sia per singolo che multi risorse di istanza)

Quindi possiamo provare ora che esiste un ciclo che potrebbe non portare a un deadlock, stato non sicuro con ciclo Puoi vedere qui un ciclo che significa che è stato trovato uno stato non sicuro, ma questo potrebbe non portare a un deadlock poiché la risorsa R2 che partecipa al ciclo potrebbe interrompere il ciclo non appena il processo P3 termina e lo rilascia (ricordare che P3 non ha alcuna dipendenza o è in attesa di qualsiasi altra risorsa).


2
Benvenuti nel sito! Un piccolo punto: è meglio evitare la frase "non può" in inglese scritto, dal momento che non è chiaro se significhi "non deve" ("Non si può parcheggiare qui") o "potrebbe non esserlo" ("Potresti non goderti questo film . ")
David Richerby,

0

Un banale stato non sicuro: il thread 1 prende il blocco A, quindi il blocco B, quindi sblocca entrambi. Il thread 2 prende il blocco B, quindi il blocco A, quindi sblocca entrambi.

Questo porterà a un deadlock solo se il thread 2 prende il blocco B appena tra il thread 1 prende il blocco A e prova a prendere il blocco B, oppure il thread 1 prende il blocco A proprio tra il thread 2 prendendo il blocco B e cercando di prendere il blocco A.

Se il thread 1 e il thread 2 lo fanno in modo casuale una volta ogni ora, e c'è un intervallo di tempo di microsecondi che porterebbe effettivamente a un deadlock. questo può durare a lungo nella mano dei clienti fino a quando alla fine non si ottiene uno stallo.

Attraversa una strada con gli occhi chiusi. Non è sicuro. Ma non vieni sempre ucciso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.