Semaphore vs. Mutex

Introduzione

Un processo del sistema operativo (OS) interagisce con altri processi in esecuzione nello stesso sistema per completare un’attività comune. I processi che interagiscono con altri processi sono noti come processi di cooperazione.

Sulla base delle strategie di comunicazione tra processi (IPC) implementate da un processo, può condividere il proprio spazio di indirizzamento con altri processi o comunicare attraverso lo scambio di messaggi. Nella tecnica precedente, è fondamentale controllare la comunicazione poiché entrambi i processi condividono uno spazio di indirizzamento comune.

Questo controllo della comunicazione di processo è noto come sincronizzazione. Senza una corretta sincronizzazione, i processi possono leggere dati obsoleti o sovrascrivere altri dati di processo.

Semaphore e mutex sono due meccanismi attraverso i quali possiamo implementare la sincronizzazione e gestire il coordinamento dei processi. In questo articolo, esamineremo queste due utilità di sincronizzazione e confronteremo varie caratteristiche.

Comprendere la sezione critica

Prima di discutere di semaphore e mutex, cerchiamo di capire il problema della sezione critica.

Supponiamo di avere un sistema che contiene n processi. Ognuno di questi processi ha un segmento di codice in cui il processo può eseguire un aggiornamento variabile comune, un aggiornamento della tabella o scrivere in un file. Questo segmento di codice è indicato come la sezione critica di un processo.

2.1. Caratteristiche di un problema di sezione critica

La caratteristica essenziale della sezione critica è che una volta che un processo inizia a eseguire la sua sezione critica, nessun altro processo è autorizzato a eseguire la sua sezione critica. Cioè, non ci sono due processi in grado di eseguire la loro sezione critica contemporaneamente. Questo problema di sezione critica è quello di progettare un protocollo in modo che i processi possano utilizzare la cooperazione.

Ogni processo deve ottenere il permesso di entrare nella sua sezione critica. La parte di codice che implementa l’autorizzazione è nota come sezione entry. Allo stesso modo, il pezzo di codice che implementa l’uscita della sezione critica è noto come la sezione di uscita.

2.2. Criteri di Critica-Sezione Problema

La soluzione di un critico-sezione problema deve soddisfare i seguenti criteri:

  • Mutua Esclusione: Se un processo è in esecuzione la sua sezione critica, nessun altro processo può eseguire la sua sezione critica
  • Progresso: Se il processo non è in esecuzione la loro sezione critica, poi altri processi possono decidere di eseguire la loro sezione critica. In base alla soluzione e all’implementazione, viene selezionato un processo che può eseguire la sua sezione critica. Le notevoli caratteristiche dei processi, la possibilità di procedere ad un processo di selezione per eseguire la sua sezione critica
  • Delimitata in Attesa: Ci dovrebbe essere un limite di attesa per un processo quando ha chiesto per la sua sezione critica sezione di ingresso e il numero di volte in un altro processo esegue la sua sezione critica

Mutex Serrature

Ci sono diverse utility per risolvere la sezione critica del problema in un sistema operativo. I blocchi mutex (mutex) di esclusione reciproca o mutex sono la soluzione più semplice. Usiamo le serrature mutex per proteggere la sezione critica e prevenire le condizioni di gara. Un processo deve acquisire il blocco prima di accedere alla sua sezione critica e rilascia il blocco una volta terminata l’esecuzione della sezione critica.

3.1. Come funziona un blocco Mutex?

Queste due funzionalità per acquisire e rilasciare i blocchi sono rappresentate attraverso due funzioni: acquisire() e rilasciare(). La funzione acquisisci acquisisce il blocco e il rilascio rilascia il blocco. Un blocco mutex ha una variabile booleana che decide se il blocco è disponibile o meno. Se il blocco è disponibile, il metodo acquisisci() ha esito positivo e il blocco viene considerato non disponibile. Qualsiasi processo che tenta di accedere a un blocco non disponibile viene bloccato fino al rilascio del blocco.

Il seguente pseudo-codice mostra acquire() metodo:

Resi da QuickLaTeX.com

Il seguente pseudo-codice mostra la release() metodo:

Resi da QuickLaTeX.com

3.2. Svantaggi di Mutex

Il principale svantaggio di un blocco mutex è che lascia il thread spinlock se il blocco non è disponibile.

Mentre un thread ha acquisito il blocco ed è nella sua sezione critica, tutti gli altri thread che tentano di acquisire il blocco si trovano in un ciclo in cui il thread controlla periodicamente se il blocco è disponibile. Pertanto, gira per il blocco e spreca i cicli della CPU che potrebbero essere stati utilizzati da altri thread in modo produttivo.

Questo è un problema importante in una singola macchina CPU. Spinlock è anche noto come attesa occupata in quanto il thread è “occupato” in attesa del blocco.

3.3. Vantaggi di Mutex

Sebbene i blocchi mutex soffrano del problema di spinlock, hanno un vantaggio. Come il processo spinlocks nella CPU, elimina la necessità per l’interruttore di contesto del processo, che altrimenti avrebbe richiesto.

L’interruttore di contesto di un processo è un’operazione che richiede molto tempo in quanto richiede il salvataggio delle statistiche di processo in esecuzione nel blocco di controllo di processo (PCB) e il ricaricamento di un altro processo nella CPU. Ci sono CPU multi-processore in cui un processo può girare in un core del processore e un altro può eseguire la loro sezione critica. Pertanto, uno spinlock di breve durata in alcuni scenari è più utile di un interruttore di contesto del processo.

Semaforo

Un semaforo è un’altra utility che fornisce anche funzionalità di sincronizzazione simili ai blocchi mutex ma è più robusto e sofisticato.

Un semaforo è una variabile intera a cui, oltre all’inizializzazione, si accede tramite due operazioni atomiche standard: wait() e signal(). L’operazione wait () è definita come P e l’operazione signal() è definita come V.

Diamo un’occhiata all’operazione wait() :

Reso da QuickLaTeX.com

Infine, diamo un’occhiata all’operazione signal() :

Reso da QuickLaTeX.com

!

Tutte le operazioni al valore intero del semaforo in wait() e signal () eseguite atomicamente. Cioè, una volta che un processo modifica il valore del semaforo, nessun altro processo può modificare simultaneamente lo stesso valore del semaforo.

In base al valore del semaforo S, è classificato in due categorie: il conteggio del semaforo e il semaforo binario. Il valore di un semaforo di conteggio può variare da 0 a un valore finito. Mentre, il valore di un semaforo binario può essere compreso tra 0 e 1.

4.1. Conteggio semafori

Conteggio semafori può controllare il numero N di istanze di una data risorsa. Spieghiamo il semaforo di conteggio con un’analogia.

Supponiamo che esista una biblioteca con tre sale studio, e c’è un bibliotecario che detiene dieci chiavi, ognuna per una stanza diversa. Una volta che un lettore richiede l’accesso a una stanza, hanno bisogno di ottenere una chiave per utilizzare la stanza. Una volta che un lettore è fatto con il loro utilizzo, restituiscono la chiave della stanza al bibliotecario. Una volta che tutte le camere sono in uso, un nuovo lettore deve attendere fino a quando una stanza viene liberata da un lettore esistente.

Nell’esempio precedente, la risorsa è una stanza e ne esistono dieci istanze. Queste istanze sono gestite attraverso un semaforo di conteggio che viene inizializzato con dieci. Questo valore del semaforo è controllato tramite i metodi wait() e signal() del semaforo. Il diagramma seguente illustra questo:

4.2. Semafori binari

Un semaforo binario ha due possibili valori, 0 e 1. Se la risorsa gestita dal semaforo è disponibile, il valore del semaforo è 1. In caso contrario, è impostato su 0, indicando che la risorsa non è disponibile.

Un semaforo binario ha la stessa funzionalità di un blocco mutex. I sistemi che non supportano i blocchi mutex possono sfruttare i semafori binari per ottenere la stessa funzionalità.

Il seguente diagramma illustra il semaforo binario:

Semaforo vs. Mutex

La seguente tabella riassume le caratteristiche importanti dei blocchi semaphore e mutex:

Reso da QuickLaTeX.com

Conclusione

In questo articolo, abbiamo discusso vari aspetti di mutex e semafori.

In primo luogo, abbiamo discusso la sezione critica e la necessità di un mutex o semaforo per controllare l’esecuzione della sezione critica. Abbiamo poi parlato di mutex e semaforo.

Infine, abbiamo fornito un confronto tra semaphore e mutex.

Se hai qualche anno di esperienza in informatica o ricerca e sei interessato a condividere questa esperienza con la comunità, dai un’occhiata alle nostre Linee guida sui contributi.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.