6.4 Inversione priorita'

I sistemi operativi utilizzano uno scheduler con prerilascio basato su priorità. Questi sistemi assegnano ad ogni processo un unico livello di priorità. Lo scheduler si accerta che di tutti i processi pronti a funzionare, sia in esecuzione sempre il processo con priorità maggiore. Per raggiungere questo obiettivo, lo scheduler può rilasciare un processo di priorità bassa durante la sua esecuzione. Poiché i processi utilizzano le risorse, eventi fuori dal controllo dello scheduler possono impedire al processo pronto con priorità maggiore di andare in esecuzione quando dovrebbe. Se questo accade, una scadenza critica potrebbe essere mancata, inducendo il fallimento del sistema. Si dice che avviene un'inversione di priorità quando il processo pronto a priorità maggiore non riesce ad entrare in esecuzione quando dovrebbe.



6.4.1 Condivisione Risorse

In qualunque momento due processi condividono una risorsa in un sistema che impiega uno scheduler basato su priorità, uno di loro avrà solitamente priorità maggiore dell'altro. Il processo con priorità maggiore si aspetta di andare in esecuzione non appena è pronto. Tuttavia, se il processo con priorità minore sta usando la risorsa condivisa quando il processo a priorità maggiore diventa pronto, quest'ultimo processo deve aspettare che il processo in esecuzione finisca la sua esecuzione. Diciamo che il processo a priorità maggiore è in attesa bloccante della risorsa.



6.4.2 Problema

La difficoltà si presenta a tempo di esecuzione, quando un processo con priorità media causa il prerilascio di un processo con priorità bassa attraverso la richiesta di utilizzo di una risorsa condivisa su cui è in attesa il processo con priorità alta. Al contrario, se il processo con priorità alta è pronto ad andare in esecuzione ma un processo con priorità media è attualmente in esecuzione, si dice che avviene un'inversione di priorità. Il processo a bassa priorità L e quello ad alta priorità H condividono una risorsa. Dopo che il processo L ottiene la risorsa, il processo H diventa pronto. Tuttavia il processo H deve aspettare che L termini di utilizzare la risorsa. Prima che L finisca di utilizzare la risorsa, il processo M a media priorità diventa pronto, causando il prerilascio di L. Mentre è in esecuzione il processo M, il processo H è costretto a rimanere in attesa.



6.4.3 Soluzione

La ricerca sull'inversione di priorità ha portato a due possibili soluzioni.

Il primo è detto “priority inheritance”. Questa tecnica consiste nel fatto che un processo con priorità bassa eredita la priorità del processo con priorità maggiore in attesa della risorsa condivisa. Questo cambiamento di priorità dovrebbe avvenire non appena il processo con priorità maggiore entra in attesa della risorsa; dovrebbe concludersi quando la risorsa è liberata. Ciò richiede l'intervento del sistema operativo.

La seconda soluzione, “priority ceilings”, associa una priorità ad ogni risorsa; lo scheduler poi trasferisce tale priorità ad ogni processo che accede alla risorsa. La priorità assegnata alla risorsa è la priorità del relativo processo a priorità maggiore, più uno. Una volta che un processo ha terminato di utilizzare la risorsa, la sua priorità torna ad essere quella precedente.