Sistemi Operativi

Variabili di lock

Una soluzione al problema della sincronizzazione di processi è quella di utilizzare le variabili di lock. Sostanzialmente questa soluzione consiste nell'allocare all'interno della memoria condivisa (in maniera tale cioè da essere visibile ad ogni processo) una certa cella (o parola o bit) che assume la funzione di "lucchetto" (lock) per l'accesso ad una certa risorsa condivisa. Ogni processo può accedere al suo valore e controllare se essa è "chiusa" o "aperta", cioè se tale flag è settato a 0 o a 1. Quando il valore della variabile di Lock è 0, allora il processo può settarla ad 1 (cioè "chiuderla"), accedere alla risorsa condivisa ed entrare così nella sua sezione critica; quando ha finito, rimette il suo valore a 0 (per mezzo di una normale MOVE). Gli altri processi che avessero voluto accedere alla risorsa condivisa avrebbero testato il valore del flag non nullo e avrebbero aspettato l'evento costituito dal ritorno 0 della variabile di lock. In poche parole, quando un processo deve entrare nella sua sezione critica, controlla il valore di una certa variabile per vedere se l'entrata è possibile. Nel caso non lo sia, il processo in stato di Running che vuole accedere a quella risorsa continua a ciclare testando il valore del lock finché questo non cambia. Essendo questa operazione costituita da più righe di codice assembly, c’è il rischio che durante questo procedimento arrivi un interrupt ad interrompere questa procedura. Per risolvere questo problema il controllo e il test sul valore di questa variabile viene solitamente effettuata con una istruzione particolare che si trova presente in molti sistemi (soprattutto quelli multiprocessori) detta Test And Set Lock (TSL). Tale istruzione garantisce l'indivisibilità di esecuzione in quanto tale istruzione, essendo una system call, non può essere interrotta. Questa soluzione è forse la più semplice ed intuitiva ma presta il fianco a molte critiche: essa richiede un considerevole spreco di utilizzo della CPU (spesso il sistema esegue semplicemente un loop di test); inoltre è un metodo comunque poco efficiente in caso che uno dei processi sia molto più lento degli alti. Una soluzione che fa a meno di sprecare l'utilizzo della CPU è quella proposta da Dijkstra nel 1965 e che, con qualche modifica, si è imposta nei vari sistemi informatici quasi universalmente (per esempio, è una delle soluzioni adottata sia da Unix che da Windows NT): la soluzione dei semafori.






















































Tutto quanto riportato in questa pagina è a puro scopo informativo personale. Se non ti trovi in accordo con quanto riportato nella pagina, vuoi fare delle precisazioni, vuoi fare delle aggiunte o hai delle proposte e dei consigli da dare, puoi farlo mandando un email. Ogni indicazione è fondamentale per la continua crescita del sito.