La gestione dell'integrità delle informazioni condivise dipende in larga misura dalla sincronizzazione dei processi. Per affrontare i problemi delle sezioni critiche, sono disponibili soluzioni sia software che hardware. Le soluzioni hardware per il problema della sezione critica, invece, sono estremamente difficili da eseguire. Esaminiamo e contrapponiamo Mutex e Semaphore, due soluzioni applicative per affrontare problemi di sezione critica.
Mutex vs Semaforo
La differenza tra un mutex e un semaforo è che un semaforo è un processo di segnalazione, il che significa che i processi usano wait() e signal() per indicare se stanno ottenendo o rilasciando una risorsa, mentre un mutex è un metodo bloccabile, il che significa che se un'operazione vuole ottenere una risorsa, deve prima acquisire il blocco sull'oggetto mutex.
Mutex è l'acronimo di Mutual Exclusion Object. È un tipo di semaforo binario utilizzato per limitare l'accesso a una risorsa condivisa. Per prevenire problemi di inversione di priorità prolungati, è dotato di un meccanismo di ereditarietà della priorità. Consente di bloccare i lavori esistenti con priorità più elevata per il minor tempo possibile. L'ereditarietà della priorità, d'altra parte, non fissa l'inversione di priorità; piuttosto, riduce il suo impatto.
Il semaforo è una variabile non negativa che viene mantenuta tra i thread. Un semaforo è un meccanismo di segnalazione e un altro thread può segnalare un thread che è in attesa di un semaforo. Per la sincronizzazione dei processi, utilizza due procedure atomiche: () wait e () signal. A seconda di come è impostato, un semaforo abilita o impedisce l'accesso alla risorsa.
Tabella di confronto tra Mutex e Semaforo
Parametri di confronto | mutex | Semaforo |
Meccanismo | È un sistema di chiusura. | È un sistema di segnalazione di qualche tipo. |
Scopo | Il thread è rappresentato dal mutex. | I processi sono rappresentati dal semaforo. |
Natura | Mutex è solitamente atomico e singolare. | Il semaforo è di natura atomica, ma non singolare. |
Tipo di dati | Mutex non è altro che un software. | Un semaforo è una variabile con un valore intero. |
tipi | Mutex non ha sottotipi. | Conteggio e semafori binari sono due tipi di semafori. |
Modifica | Solo il processo che può richiedere o rilasciare una risorsa può modificarla. | Un semaforo può essere modificato utilizzando le funzioni di attesa e segnale. |
Cos'è Mutex?
Mutua esclusione è un termine usato per descrivere una situazione Mutex è un nome breve per l'oggetto. Possiamo dedurre dalla parola mutua esclusione che solo un programma alla volta ha accesso a una determinata risorsa. L'oggetto mutex consente a molti thread dell'applicazione di accedere alla stessa risorsa contemporaneamente, solo uno alla volta.
Ogni volta che un programma richiede una risorsa al sistema, il sistema crea un oggetto mutex con un'identità o ID univoco. Di conseguenza, ogni volta che il programma desidera utilizzare quella risorsa, blocca l'oggetto. Il programma utilizza quindi la risorsa prima di rilasciare definitivamente l'oggetto mutex. L'oggetto mutex può quindi essere creato e utilizzato da altri programmi allo stesso modo.
Bloccando l'oggetto, quella specifica risorsa viene assegnata a quel processo specifico e nessun altro processo può utilizzarla. Di conseguenza, nessun altro programma è autorizzato a utilizzare le risorse di sistema nell'area cruciale. Un oggetto mutex può essere utilizzato per eseguire la sincronizzazione dei processi in questo modo.
Un mutex consente l'esclusione reciproca; sia come produttore che come consumatore può avere la chiave (mutex) e continuare a lavorare. Il consumatore deve attendere finché il buffer del produttore è pieno e viceversa.
Cos'è il semaforo?
Il semaforo è una variabile intera S che viene utilizzata per la sincronizzazione del processo e viene inizializzata con il numero di risorse nel sistema. Per modificare il valore di S, utilizza due funzioni principali: wait() e signal(). Entrambe queste funzioni vengono utilizzate per modificare il valore di un semaforo, ma consentono a un solo programma alla volta di farlo, quindi non ci sono due metodi che possono modificare il valore di un semaforo contemporaneamente. I semafori di conteggio e i semafori binari sono i due tipi di semafori.
La variabile del semaforo viene prima inizializzata con il numero di risorse disponibili durante il conteggio dei semafori. Il metodo wait() viene quindi eseguito ogni volta che un processo richiede una risorsa e il valore della variabile semaforo viene ridotto di uno. Il processo utilizza quindi la risorsa, dopodiché chiama il metodo signal(), che aumenta di uno il valore della variabile semaforo. Ogni volta che il valore della variabile del semaforo raggiunge lo 0, ovvero quando il programma ha esaurito tutte le risorse e non ne rimane nessuna da utilizzare, quindi, se un altro processo ha bisogno di utilizzare risorse, dovrà attendere il suo tempo. Stabiliamo la sincronizzazione dei processi in questo modo.
In Binary Semaphores, il valore della variabile del semaforo è 0 o 1. Quando un processo desidera utilizzare una risorsa, viene invocato il metodo wait() e il valore del semaforo viene regolato a 0 da 1. Il processo quindi effettua uso della risorsa, e dopo averlo fatto, viene chiamato il metodo signal() e il valore della variabile del semaforo è impostato su 1. Se il valore della variabile del semaforo è 0 in un dato momento e un altro programma vuole per accedere alla stessa risorsa, deve attendere che il programma precedente liberi le risorse. La sincronizzazione dei processi può essere eseguita in questo modo. È paragonabile a un mutex, ma non blocca nulla.
Principali differenze tra Mutex e Semaforo
Conclusione
Se sono disponibili diverse istanze di una risorsa, Semaphore è un'alternativa migliore. Mutex è una scelta preferibile quando c'è solo una risorsa condivisa. Il semaforo consente a molti thread di accedere alla regione cruciale. Le macchine non influiscono sui semafori. I semafori sono gestiti nel codice indipendente dalla macchina del microkernel. Non c'è mai uno spreco di tempo o risorse di processo perché c'è sempre un'attesa indaffarata nel semaforo. Consentono inoltre la flessibilità di gestione delle risorse mentre i Mutex non sono altro che semplici blocchi che devono essere ottenuti prima di raggiungere un'area vitale e quindi rilasciati, ma In Mutex il metodo standard può comportare uno stato di attesa occupato, sprecando tempo della CPU. Inoltre, non può essere bloccato o sbloccato da un contesto diverso da quello in cui è stato acquisito.