Semaphore vs. Mutex
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. Mutex (obiect de excludere mutuală) este, de asemenea, utilizat pentru a evita accesul la o resursă comună în același timp prin mai multe procese concurente.
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 Mutex??
Când se pornește o aplicație pentru computer, se va crea un mutex și se va atașa la o resursă. Când resursa este utilizată de un fir, este blocată și alte fire nu o pot folosi. Dacă un alt fir vrea să folosească aceeași resursă, va trebui să facă o solicitare. Apoi acel fir va fi plasat într-o coadă până când primul thread va fi terminat cu resursa. Când primul fir este terminat cu resursa, blocarea va fi eliminată iar firul care așteaptă în coadă poate avea acces la resursă. Dacă există mai multe fire în așteptare în coadă, ei primesc acces în mod rotativ. Practic, atunci când mutexul suplimentează accesul la o resursă între mai multe fire, acesta va fi vizibil deoarece firele multiple consumă o resursă în același timp. Dar, în interior, numai un singur fir accesează resursele la un moment dat.
Care este diferența dintre Semaphore și Mutex?
Chiar dacă atât semaphorele, cât și obiectele mutex sunt folosite pentru a obține excluderea reciprocă în mediile de programare paralele, ele au unele diferențe. Un obiect mutex permite doar unui singur fir să consume o resursă sau o secțiune critică, în timp ce semaphorele permit un număr restrâns de accesări simultane la o resursă (sub un număr maxim permis). Cu obiecte mutex, alte fire care doresc să acceseze resursa trebuie să aștepte într-o coadă, până când thread-ul curent este terminat folosind resursa.