Quali sono le principali differenze tra un monitor e un semaforo ?
Quali sono le principali differenze tra un monitor e un semaforo ?
Risposte:
Un monitor è un oggetto progettato per l'accesso da più thread. Le funzioni o i metodi membro di un oggetto monitor imporranno l'esclusione reciproca, quindi solo un thread può eseguire qualsiasi azione sull'oggetto in un determinato momento. Se un thread sta attualmente eseguendo una funzione membro dell'oggetto, qualsiasi altro thread che tenta di chiamare una funzione membro di tale oggetto dovrà attendere fino al termine del primo.
Un semaforo è un oggetto di livello inferiore. Potresti usare un semaforo per implementare un monitor. Un semaforo è essenzialmente solo un contatore. Quando il contatore è positivo, se un thread tenta di acquisire il semaforo, allora è consentito e il contatore viene decrementato. Quando un thread è terminato, rilascia il semaforo e incrementa il contatore.
Se il contatore è già zero quando un thread tenta di acquisire il semaforo, deve attendere fino a quando un altro thread non rilascia il semaforo. Se più thread sono in attesa quando un thread rilascia un semaforo, uno di essi lo ottiene. Il thread che rilascia un semaforo non deve necessariamente essere lo stesso thread che lo ha acquisito.
Un monitor è come un bagno pubblico. Può entrare solo una persona alla volta. Chiudono a chiave la porta per impedire a chiunque altro di entrare, fare le loro cose e poi sbloccarle quando escono.
Un semaforo è come un luogo di noleggio biciclette. Hanno un certo numero di biciclette. Se provi a noleggiare una bici e ne hanno una gratis, puoi prenderla, altrimenti devi aspettare. Quando qualcuno restituisce la sua bici, qualcun altro può prenderla. Se hai una bici, puoi restituirla a qualcun altro per tornare --- al posto di noleggio biciclette non importa chi la restituisce, a condizione che la bici la ritorni.
La seguente spiegazione in realtà spiega come wait () e signal () del monitor differiscono da P e V del semaforo.
Le operazioni wait () e signal () sulle variabili di condizione in un monitor sono simili alle operazioni P e V sul conteggio dei semafori .
Un'istruzione wait può bloccare l'esecuzione di un processo, mentre un'istruzione signal può causare lo sblocco di un altro processo. Tuttavia, ci sono alcune differenzetra loro. Quando un processo esegue un'operazione P, non necessariamente lo blocca perché il semaforo di conteggio può essere maggiore di zero. Al contrario, quando viene eseguita un'istruzione wait, blocca sempre il processo. Quando un'attività esegue un'operazione V su un semaforo, sblocca un'attività in attesa su quel semaforo o incrementa il contatore dei semafori se non è presente alcuna attività da sbloccare. D'altra parte, se un processo esegue un'istruzione di segnale quando non ci sono altri processi da sbloccare, non c'è alcun effetto sulla variabile di condizione. Un'altra differenza tra semafori e monitor è che gli utenti risvegliati da un'operazione V possono riprendere l'esecuzione senza indugio. Al contrario, gli utenti che si svegliano con un'operazione di segnale vengono riavviati solo quando il monitor è sbloccato. Inoltre,
Link: qui per ulteriori letture. Spero che sia d'aiuto.
Semaphore consente a più thread (fino a un numero impostato) di accedere a un oggetto condiviso. I monitor consentono l'accesso reciprocamente esclusivo a un oggetto condiviso.
java.util.ArrayList
: è un oggetto o un contenitore di più oggetti? Bene, è entrambi allo stesso tempo. Quindi il semaforo è appropriato per controllare l'accesso ad esso? Direi: no.
Quando un semaforo viene utilizzato per proteggere una regione critica, non esiste alcuna relazione diretta tra il semaforo e i dati da proteggere. Questo è uno dei motivi per cui i semafori possono essere dispersi nel codice e perché è facile dimenticare di chiamare in attesa o notificare , nel qual caso il risultato sarà, rispettivamente, violare l'esclusione reciproca o bloccare la risorsa in modo permanente.
Al contrario, una serie di cose brutte può accadere con un monitor. Un monitor è stanco direttamente dei dati (incapsula i dati) e, poiché le operazioni del monitor sono azioni atomiche, è impossibile scrivere codice che può accedere ai dati senza chiamare il protocollo di ingresso. Il protocollo di uscita viene chiamato automaticamente al termine dell'operazione di monitoraggio.
Un monitor ha un meccanismo incorporato per la sincronizzazione delle condizioni sotto forma di variabile di condizione prima di procedere. Se la condizione non è soddisfatta, il processo deve attendere fino a quando non viene notificato un cambiamento nella condizione. Quando un processo è in attesa della sincronizzazione delle condizioni, l'implementazione del monitor si occupa del problema dell'esclusione reciproca e consente a un altro processo di accedere al monitor.
Tratto dal materiale del corso "Interacting process" dell'Unità Open University M362.
Semaforo:
L'uso di un contatore o flag per controllare l'accesso ad alcune risorse condivise in un sistema concorrente, implica l'uso di Semaphore .
Esempio:
Le bandiere rivelano solo lo stato corrente della risorsa, nessun conteggio o altre informazioni sugli oggetti in attesa o in esecuzione sulla risorsa.
Tenere sotto controllo :
Un monitor sincronizza l'accesso a un oggetto comunicando con i thread interessati all'oggetto, chiedendo loro di acquisire l'accesso o attendere che alcune condizioni diventino realtà.
Esempio: