Semafor vs Mutex
Semaforul este o structură de date care este utilizată 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 paralele. Semaforele sunt folosite pentru a evita blocajele și condițiile de cursă. Mutex (Obiect de excludere reciprocă) este, de asemenea, folosit pentru a evita accesul la o resursă comună în același timp prin mai multe procese concurente.
Ce este un semafor?
Semaforul este o structură de date care este utilizată pentru a oferi excluderea reciprocă a secțiunilor critice. Semaforele suportă în principal două operațiuni numite așteptare (cunoscută istoric ca P) și semnal (cunoscută istoric ca 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 (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 de execuție, firul de execuție este blocat și trebuie să aștepte în coadă. Operația de semnal deschide un semafor și dacă există deja un fir de execuție care așteaptă deja în coadă, acel proces este permis să continue, iar dacă nu există fire care așteaptă în coadă, semnalul este reținut pentru următoarele fire. Există două tipuri de semafore numite semafore mutex și semafore de numărare. Semaforele Mutex permit un singur acces la o resursă, iar semaforele de numărare permit mai multor fire să acceseze o resursă (care are mai multe unități disponibile).
Ce este un Mutex?
Când o aplicație de calculator este pornită, aceasta va crea un mutex și o va atașa la o resursă. Când resursa este folosită de un fir de execuție, este blocată și alte fire nu o pot folosi. Dacă un alt thread dorește să folosească aceeași resursă, va trebui să facă o cerere. Apoi acel fir de execuție va fi plasat într-o coadă până când primul fir de execuție se termină cu resursa. Când primul fir de execuție se termină cu resursa, blocarea va fi eliminată și firul care așteaptă în coadă poate obține acces la resursă. Dacă există mai multe fire de execuție care așteaptă în coadă, li se oferă acces în mod rotativ. Practic, atunci când mutex-ul alternează accesul la o resursă între mai multe fire, acesta va fi vizibil deoarece mai multe fire consumă o resursă în același timp. Dar, în interior, doar un singur fir accesează resursa la un moment dat.
Care este diferența dintre Semaphore și Mutex?
Deși, atât semaforele, cât și obiectele mutex sunt folosite pentru a obține excluderea reciprocă în medii de programare paralelă, acestea au unele diferențe. Un obiect mutex permite doar unui singur fir să consume o resursă sau o secțiune critică, în timp ce semaforele permit un număr limitat de accese simultane la o resursă (sub un număr maxim permis). Cu obiectele mutex, alte fire de execuție care doresc să acceseze resursa trebuie să aștepte într-o coadă, până când firul de execuție curent se termină cu utilizarea resursei.