In molte applicazioni, un processo ha bisogno dell’accesso esclusivo di non solo una risorsa, ma diverse. Supponiamo che due processi vogliono immagazzinare un documento scansionato su un disco Blu-ray. Il processo A richiede il permesso di usare lo scanner e gli viene garantita. Il processo B è programmato differentemente e richiede prima il Blu-ray recorder e gli viene garantito. Ora A richiede il Blue-ray recorder, ma la richiesta viene sospesa finché B non lo rilascia. Sfortunatamente, invece che rilasciare il recorder, B vuole lo scanner. A questo punto entrambe i processi sono bloccati e rimarranno così per sempre. Questa situazione viene chiamata deadlock.

Resources

Una classe maggiore di deadlocks riguardano risorse alla quale ad alcuni processi è stato garantito l’accesso esclusivo. Queste risorse possono essere devices, data records, files,… Ci riferiamo agli oggetti garantiti con resources.

Preemptable and Nonpreemptable Resources

Le resources possono essere di due tipi: preemptable e nonpreemptable.

Una risorsa preemptable è una risorsa che può essere portata via dal processo che la possiede senza avere nessun effetto collaterale..

Una risorsa nonpreemptable, in contrasto, è una risorsa che non può essere tolta dal processo che la possiede senza causare un potenziale errore.

In generale, i deadlocks riguardano le risorse nonpreemptable. Potenzialmente i deadlocks che riguardano risorse preemptable possono essere risolti reallocando la risorsa da un processo all’altro.

La sequenza astratta di eventi richiesti per usare una determinata risorsa:

Se la risorsa non è disponibile quando richiesta, il requesting process viene forzato ad aspettare.

Resource Acquisition

Per alcuni tipi di risorse, come i records in un sistema database, è l’user processes che gestisce la risorsa invece che il sistema.

Un modo per permettere questo è quello di associare un semaforo ad ogni risorsa. Questi semafori sono inizializzati ad 1. Si possono utilizzare anche i mutexes.

image.png

Qualche volta i processi hanno bisogno di due o più risorse. Queste possono essere prese sequenzialmente (b).

Adesso consideriamo il caso con due processi, A e B, e due risorse.

image.png