Semaphore vs. Monitors: qual è la differenza?


233

Quali sono le principali differenze tra un monitor e un semaforo ?


8
Puoi pensare al monitor come a un semaforo binario.
Maxim Egorushkin,


1
Si prega di consultare questo albahari.com/threading/part2.aspx . Ho letto questo articolo, il migliore che abbia mai letto su Threading
Shantanu Gupta,

5
Non penso che tu abbia ragione, Maxim. Un semaforo è una struttura di "livello inferiore", se non sbaglio, mentre un Monitor è un oggetto in piena regola. Ricordo che al college abbiamo esaminato brevemente i monitor nella mia classe di Sistemi operativi, ma non ricordo come un Monitor differisse da un Mutex, a parte il fatto che era orientato agli oggetti. Ricordo che un problema poteva essere fatto usando i monitor, ma non potevamo usare questo stesso metodo in classe, a causa delle restrizioni del linguaggio C.
user919860,

1
Semaphore e Monitor sono molto diversi, ma equivalenti in termini di potenza, nel senso che puoi implementarli l'uno dall'altro. Puoi leggere il documento originale di Hoare che dimostra la loro equivalenza da qui
Thanh DK

Risposte:


529

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.


162
+1 Grande analogia con i bagni pubblici e il noleggio biciclette. Non dimenticherò mai la differenza tra i due ora.
Drupad Panchal,

4
La tua risposta sembra contraddire stackoverflow.com/a/7336799/632951 .. quindi chi ha ragione?
Pacerier,

6
@Pacerier: I am :-) L'unica contraddizione è la cosa di alto livello / basso livello. È possibile costruire un monitor da semafori, non solo è molto ordinata, proprio a causa di un monitor è una struttura di livello superiore ad un semaforo. Un semaforo è solo un contatore con l'attesa. Suggerisco di leggere "Il piccolo libro dei semafori" greenteapress.com/semaphores
Anthony Williams,

3
@AnthonyWilliams: forse dubito dell'idea che puoi costruire monitor solo da semafori. L'altro modo è anche possibile e per questo motivo non possiamo dire copiosamente che il monitoraggio è un'entità di livello superiore rispetto ai semafori.
Kavish Dwivedi

5
Sì, puoi creare un semaforo da un monitor. Puoi sempre costruire oggetti di basso livello da quelli di alto livello. Le cose di livello alto / basso riguardano le capacità e l'ambito di funzionamento, non su quale può essere usato per costruire l'altro.
Anthony Williams,

11

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.


6

Risposta a una riga:

Monitor: controlla sul monitor solo UN thread alla volta. (è necessario acquisire il blocco per eseguire il thread singolo)

Semaforo: un lucchetto che protegge una risorsa condivisa. (è necessario acquisire il blocco per accedere alla risorsa)


5

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.

Tenere sotto controllo

Semaforo


10
Ma allora come differirebbe un monitor da un MutEx? Un blocco di esclusione reciproca fa la stessa cosa di un semaforo, ma consente a un solo thread di accedere alla Regione critica alla volta.
user919860,

2
Sì, qual è la differenza tra un mnitor e un mutex?
Pacerier,

2
Vale la pena notare che i semafori non controllano l'accesso a un oggetto condiviso, ma piuttosto una risorsa condivisa (che conterrà più oggetti).
xbonez,

@xbonez: Se guardiamo 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.
dma_k

Nella stessa risposta accettata si dice che Monitor sta implementando l'esclusione reciproca. Si prega di vedere "Le funzioni membro o i metodi di un oggetto monitor imporranno l'esclusione reciproca, quindi solo un thread può eseguire qualsiasi azione sull'oggetto in un determinato momento"
achoora

2

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.


Ad eccezione del fatto che, sebbene i semafori siano abbastanza comunemente resi disponibili in una lingua e presentati nei libri di testo come una sorta di variabile con operatori atomici limitati, un semaforo è un caso speciale di un monitor , poiché è una specie di variabile con operatori atomici limitati, perché è quello che è un monitor. Gli argomenti sopra che i semafori sono "di livello inferiore" sono speciosi.
philipxy,

2

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:

  1. Un contatore per consentire a soli 50 passeggeri di acquisire i 50 posti (risorsa condivisa) di qualsiasi teatro / autobus / treno / giro divertente / classe. E consentire un nuovo Passeggero solo se qualcuno libera un posto.
  2. Un flag binario che indica lo stato libero / occupato di qualsiasi bagno.
  3. I semafori sono un buon esempio di bandiere. Controllano il flusso regolando il passaggio dei veicoli sulle strade (risorsa condivisa)

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:

  1. Un padre può fungere da monitor per sua figlia, permettendole di uscire con un solo ragazzo alla volta.
  2. Un insegnante di scuola che usa il testimone per consentire a un solo bambino di parlare in classe.
  3. Infine una tecnica, le transazioni (tramite thread) su un oggetto Account sincronizzato per mantenere l'integrità.

Penso che anche il semaforo sul bivio sia una bandiera binaria: o le auto su una strada o su una strada ortogonale possono guidare (reciprocamente esclusive), quindi l'esempio (3) è lo stesso di (2). Inoltre penso che quegli esempi siano un caso d'angolo per i semafori (caso banale), che può essere implementato usando monitor. Ci sono esempi più tipici in Wikipedia .
dma_k
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.