Citando link :
A deadlock situation can arise if all of the following conditions hold simultaneously in a system:
- Mutual exclusion: at least one resource must be held in a non-shareable mode.Only one process can use the resource at any given instant of time.
- Hold and wait or resource holding: a process is currently holding at least one resource and requesting additional resources which are being held by other processes.
- No preemption: a resource can be released only voluntarily by the process holding it.
- Circular wait: a process must be waiting for a resource which is being held by another process, which in turn is waiting for the first process to release the resource. In general, there is a set of waiting processes, P = {P1, P2, …, PN}, such that P1 is waiting for a resource held by P2, P2 is waiting for a resource held by P3 and so on until PN is waiting for a resource held by P1.
Wikipedia afferma che queste condizioni sono necessarie perché si verifichi un deadlock. Inoltre, ho sentito affermazioni che sono anche sufficienti (anche se posso aver interpretato male queste affermazioni).
Il problema è che ho esempi che mi sembrano contraddire sia la necessità sia la sufficienza di quelle condizioni. E non riesco a vedere il mio errore.
Necessità prima:
Lascia che R1 e R2 siano due risorse condivisibili da due processi al massimo. Sia P1, P2, P3, P4 siano processi come P1 e P2 reggono un pezzo di R1 ciascuno e ognuno aspetta un pezzo di R2, e P3 e P4 tengono un pezzo di R2 ciascuno e ciascuno aspetta un pezzo di R1, come qui di seguito:
Supponiamocheil#3siavalido.#2e#4sonoovviamentesoddisfatti,mail#1nonèinquantosiaR1cheR2possonoesserecondivisi.Tuttaviasembrachesiverifichiundeadlock.
Orasufficienza:
LasciacheR1eR2sianoduerisorse,comeR1ècondivisibiledadueprocessialmassimoeR2nonècondivisibile.SiaP1,P2eP3sianoprocessicomeP1detieneR2evuoleunpezzodiR1,R2contieneunpezzodiR1evuoleR2eR3detieneunpezzodiR1enonvuolealtro,comediseguito:
Ancora una volta, supponiamo che il # 3 sia valido. Quindi # 1 è soddisfatto poiché R2 non è condivisibile, P1 e P2 soddisfano entrambi # 2 quindi anche questa condizione è valida, e # 4 è soddisfatta dal ciclo formato da P1 e P2. Tuttavia non si verifica un deadlock, dal momento che non appena P3 termina il suo pezzo di R1 può essere concesso a P1, i cui requisiti saranno soddisfatti da allora; quindi, non appena P1 rilascia R2, P2 sarà in grado di procedere.
Dov'è il mio errore? Dov'è il mio malinteso?