Semaforo vs Monitor
Il semaforo è una struttura di dati utilizzata per assicurarsi che più processi non accedano contemporaneamente a una risorsa comune oa una sezione critica, in ambienti di programmazione parallela. I semafori vengono utilizzati per evitare dead lock e condizioni di gara. Monitor è un costrutto del linguaggio di programmazione che viene utilizzato anche per evitare che più processi accedano contemporaneamente a una risorsa comune, quindi garantisce l'esclusione reciproca. I monitor utilizzano variabili condizionali per eseguire questa operazione.
Cos'è un semaforo?
Il semaforo è una struttura di 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 wait blocca un processo finché il semaforo non è aperto e l'operazione signal consente a 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 signal apre un semaforo e se c'è un thread già in attesa nella coda, quel processo può procedere e se non ci sono thread in attesa nella coda il segnale viene ricordato per i thread successivi. Esistono due tipi di semafori chiamati semafori mutex e semafori di conteggio. 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 utilizzato per controllare l'accesso ai dati condivisi. I monitor incapsulano strutture dati condivise, procedure (che operano su strutture dati condivise) e sincronizzazione tra chiamate di procedure simultanee. Un monitor fa in modo che i suoi dati non siano sottoposti ad accessi non strutturati e garantisce che i gradini (che accedono ai dati del monitor 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 loro semantica di pianificazione.
Qual è la differenza tra Semaphore e Monitor?
Anche se sia i semafori che i monitor vengono utilizzati per ottenere l'esclusione reciproca in ambienti di programmazione parallela, differiscono nelle tecniche utilizzate per ottenere questo compito. Nei monitor, il codice utilizzato per ottenere l'esclusione reciproca si trova in un unico posto ed è più strutturato, mentre il codice per i semafori viene distribuito come chiamate di funzioni di attesa e di segnalazione. Inoltre, è molto facile commettere errori durante l'implementazione dei semafori, mentre ci sono pochissime possibilità di commettere errori durante l'implementazione dei monitor. Inoltre, i monitor utilizzano variabili di condizione, mentre i semafori no.