Semaforo vs monitor
Il semaforo è una struttura di dati che viene utilizzata per garantire che più processi non accedano a una risorsa comune o a una sezione critica contemporaneamente, in ambienti di programmazione paralleli. I semafori sono usati per evitare serrature morte e condizioni di gara. Monitor è un costrutto del linguaggio di programmazione che viene utilizzato anche per evitare che più processi che accedono a una risorsa comune allo stesso tempo garantiscano quindi l'esclusione reciproca. I monitor usano variabili condizionali per raggiungere questo compito.
Cos'è un semaforo?
Il semaforo è una struttura dati utilizzata per fornire l'esclusione reciproca alle sezioni critiche. I semafori supportano principalmente due operazioni chiamate wait (storicamente note come P) e signal (storicamente note come V). L'operazione di attesa blocca un processo fino a quando il semaforo non è aperto e l'operazione di segnale consente ad un altro processo (thread) di entrare. Ogni semaforo è associato a una coda di processi in attesa. Quando l'operazione di attesa viene chiamata da un thread, se il semaforo è aperto, il thread può continuare. Se il semaforo viene chiuso quando l'operazione di attesa viene chiamata da un thread, il thread viene bloccato e deve attendere in coda. L'operazione di segnale apre un semaforo e se c'è un thread già in attesa in coda, quel processo è permesso di procedere e se non ci sono thread in attesa in coda il segnale viene ricordato per i thread successivi. Ci sono due tipi di semafori chiamati semifori mutex e conteggio di semafori. I semafori Mutex consentono un singolo accesso a una risorsa e il conteggio dei semafori consente a più thread di accedere a una risorsa (che ha diverse unità disponibili).
Cos'è un monitor?
Un monitor è un costrutto del linguaggio di programmazione che viene utilizzato per controllare l'accesso ai dati condivisi. I monitor incapsulano strutture dati condivise, procedure (che operano su strutture di dati condivise) e sincronizzazione tra richiami di procedure simultanee. Un monitor si assicura che i suoi dati non siano confrontati con accessi non strutturati e garantisce che i gradini (quali i dati del monitor di accesso attraverso le sue procedure) interagiscano in modo legittimo. Un monitor garantisce l'esclusione reciproca consentendo a un solo thread di eseguire qualsiasi procedura di monitoraggio in un dato momento. Se un altro thread tenta di richiamare un metodo nel monitor, mentre un thread sta già eseguendo una procedura nel monitor, la seconda procedura viene bloccata e deve attendere in coda. Esistono due tipi di monitor denominati monitor Hoare e monitor Mesa. Differiscono principalmente nella semantica di programmazione.
Qual è la differenza tra Semaforo e Monitor?
Anche se sia i semafori che i monitor sono usati per ottenere l'esclusione reciproca in ambienti di programmazione paralleli, differiscono nelle tecniche utilizzate per raggiungere questo compito. Nei monitor, il codice utilizzato per raggiungere l'esclusione reciproca si trova in un unico luogo ed è più strutturato, mentre il codice per i semafori viene distribuito come chiamate di funzioni di attesa e segnale. Inoltre, è molto facile commettere errori quando si implementano i semafori, mentre vi sono poche possibilità di commettere errori quando si implementano i monitor. Inoltre, i monitor usano variabili di condizione, mentre i semafori no.