Semaphore vs. Monitor
Semaphore este o structură de date care se utilizează pentru a se asigura că mai multe procese nu accesează o resursă comună sau o secțiune critică în același timp, în medii de programare paralelă. Semaphorele sunt folosite pentru a evita blocarea mortală și condițiile de curse. Monitorul este un construct de limbaj de programare care este de asemenea folosit pentru a evita multiple procese care accesează o resursă comună în același timp, garantând astfel excluderea reciprocă. Monitoarele utilizează variabile condiționate pentru a atinge această sarcină.
Ce este Semaphore??
Semaphore este o structură de date care este utilizată pentru a asigura excluderea reciprocă în secțiunile critice. Semaphorele sprijină în principal două operațiuni numite așteptați (istoric cunoscute ca P) și semnal (istoric cunoscut sub numele de V). Operația de așteptare blochează un proces până când semaforul este deschis și funcționarea semnalului permite intrarea unui alt proces (thread). 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 coada de așteptare. Funcționarea semnalului deschide un semafor și dacă există un fir deja așteptat în coadă, procesul respectiv este permis să continue și dacă nu există fire în așteptare în coadă, semnalul este reținut pentru următoarele fire. Există două tipuri de semafoare numite semaphore mutex și semafoare de numărare. Semaphorele Mutex permit un singur acces la o semaforă de resurse și numărare, care permite mai multor fire de acces să acceseze o resursă (care are mai multe unități disponibile).
Ce este un monitor?
Un monitor este un construct de limbaj de programare folosit pentru a controla accesul la date partajate. Monitoarele încorporează structuri de date partajate, proceduri (care funcționează pe structuri de date partajate) și sincronizare între invocările de proceduri concurente. Un monitor asigură că datele sale nu se confruntă cu accese nestructurate și garantează faptul că treptele (care accesează datele monitorului prin procedurile sale) interacționează într-un 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 fir încearcă să invocă o metodă pe monitor, în timp ce un fir execută deja o procedură pe 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 lor de planificare.
Care este diferența dintre Semaphore și Monitor?
Chiar dacă semafoarele și monitoarele sunt folosite pentru a obține excluderea reciprocă în mediile de programare paralele, acestea diferă în tehnicile utilizate pentru a îndeplini această sarcină. În monitoare, codul utilizat pentru a obține excluderea reciprocă se află într-un singur loc și este mai structurat, în timp ce codul pentru semafoare este distribuit ca apeluri de așteptare și de funcții de semnal. De asemenea, este foarte ușor să faci greșeli la implementarea semaphorelor, în timp ce există foarte puține șanse de a face greșeli atunci când implementăm monitoare. Mai mult, monitoarele folosesc variabilele de stare, în timp ce semaphorele nu.