Semaphore vs Monitor
Semafor este o structură de date care este utilizată pentru a vă asigura că mai multe procese nu accesează o resursă comună sau o secțiune critică în același timp, în medii de programare paralele. Semaforele sunt folosite pentru a evita blocajele moarte și condițiile de rasă. Monitorul este un construct de limbaj de programare care este, de asemenea, utilizat pentru a evita procesele multiple care accesează o resursă comună în același timp, garantând astfel excluderea reciprocă. Monitoarele folosesc variabile condiționale pentru a realiza această sarcină.
Ce este un semafor?
Semaforul este o structură de date care este utilizată pentru a oferi excludere reciprocă secțiunilor critice. Semaforele suportă în principal două operații numite așteptare (cunoscute istoric sub numele de P) și semnal (cunoscute istoric sub numele de V). Operația de așteptare blochează un proces până când semaforul este deschis și operația de semnal permite intrarea unui alt proces (fir). Fiecare semafor este asociat cu o coadă de procese de așteptare. Când operația de așteptare este apelată de un fir, dacă semaforul este deschis, firul poate continua. Dacă semaforul este închis când operația de așteptare este apelată de un fir, firul este blocat și trebuie să aștepte în coadă. Operația de semnal deschide un semafor și dacă există un fir de așteptare deja în coadă, acel proces este permis să continue și dacă nu există fire de așteptare în coadă, semnalul este amintit pentru următoarele fire. Există două tipuri de semafore numite semafore mutex și semafoare de numărare. Semaforele Mutex permit un singur acces la o resursă, iar numărarea semaforelor permite mai multor fire să acceseze o resursă (care are mai multe unități disponibile).
Ce este un monitor?
Un monitor este o construcție de limbaj de programare care este utilizată pentru a controla accesul la datele partajate. Monitoarele încapsulează structuri de date partajate, proceduri (care funcționează pe structuri de date partajate) și sincronizare între invocări de proceduri concurente. Un monitor se asigură că datele sale nu se confruntă cu accesuri nestructurate și garantează că treptele (care accesează datele monitorului prin procedurile sale) interacționează în mod legitim. Un monitor garantează excluderea reciprocă, permițând unui singur fir să execute orice procedură de monitorizare la un moment dat. Dacă un alt thread încearcă să invoce o metodă în monitor, în timp ce un thread execută deja o procedură în monitor, atunci a doua procedură este blocată și trebuie să aștepte în coadă. Există două tipuri de monitoare numite monitoare Hoare și monitoare Mesa. Ele diferă în principal în semantica de programare.
Care este diferența dintre Semafor și Monitor?
Chiar dacă atât semaforele, cât și monitoarele sunt folosite pentru a realiza excluderea reciprocă în medii de programare paralele, ele diferă în tehnicile utilizate pentru realizarea acestei sarcini. În monitoare, codul care este utilizat pentru a realiza excluderea reciprocă se află într-un singur loc și este mai structurat, în timp ce codul pentru semafor este distribuit ca apeluri funcție de așteptare și semnal. De asemenea, este foarte ușor să greșești la implementarea semaforelor, în timp ce există foarte puține șanse să greșești la implementarea monitoarelor. Mai mult, monitoarele folosesc variabile de stare, în timp ce semaforele nu.