Semaforo vs Monitor
Semaphore è una struttura di dati utilizzata per assicurarsi che più processi non accedano a una risorsa comune oa una sezione critica contemporaneamente, in ambienti di programmazione paralleli. 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 a una risorsa comune contemporaneamente, quindi garantisce l'esclusione reciproca. I monitor utilizzano variabili condizionali per eseguire questa attività.
Cos'è un semaforo?
Semaphore è una struttura di dati utilizzata per fornire l'esclusione reciproca alle sezioni critiche. I semafori supportano principalmente due operazioni chiamate wait (storicamente noto come P) e signal (storicamente noto come V). L'operazione di attesa blocca un processo fino a quando il semaforo non è aperto e l'operazione di segnale 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 del segnale apre un semaforo e se c'è già un thread 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 unico 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 di dati condivisi, procedure (che operano su strutture di dati condivise) e sincronizzazione tra chiamate di procedure simultanee. Un monitor fa in modo che i propri dati non siano soggetti ad accessi non strutturati e garantisce che i treads (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 determinato 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 nella 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 raggiungere 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 è distribuito come chiamate di funzione di attesa e segnale. Inoltre, è molto facile commettere errori quando si implementano i semafori, mentre ci sono pochissime possibilità di commettere errori quando si implementano i monitor. Inoltre, i monitor utilizzano variabili di condizione, mentre i semafori no.