Conform terminologiei sistemului de operare, mutexul și semaforele sunt resurse ale nucleului care oferă servicii de sincronizare, numite și primitive de sincronizare . Sincronizarea proceselor joacă un rol important în menținerea coerenței datelor partajate. Atât soluțiile software, cât și cele hardware sunt prezente pentru rezolvarea problemelor critice ale secțiunilor. Dar soluțiile hardware pentru problemele secțiunilor critice sunt destul de dificil de implementat. Mutex și semaphore oferă ambele servicii de sincronizare, dar nu sunt la fel.
Ce este Mutex?
Mutex este un obiect de excludere reciprocă care sincronizează accesul la o resursă. Este creat cu un nume unic la începutul unui program. Mecanismul de blocare a mutexului asigură că doar un fir poate obține mutexul și poate intra în secțiunea critică. Acest thread eliberează mutex-ul doar când iese în secțiunea critică.
Este un tip special de semafor binar folosit pentru controlul accesului la resursa partajată. Include un mecanism de moștenire a priorităților pentru a evita problemele de inversare a priorității extinse. Permite ca sarcinile curente cu prioritate mai mare să fie menținute în starea blocată pentru cel mai scurt timp posibil. Totuși, moștenirea priorității nu corectează inversarea priorității, ci doar minimizează efectul acesteia.
Exemplu
Acest lucru este arătat cu ajutorul exemplului următor,
wait (mutex); ..... Critical Section ..... signal (mutex);
Utilizarea Mutex
Un mutex oferă excluderea reciprocă, fie producător, fie consumator, care poate avea cheia (mutex) și își poate continua munca. Atâta timp cât producătorul umple tamponul, utilizatorul trebuie să aștepte și invers. În blocarea Mutex, tot timpul, doar un singur fir poate funcționa cu întregul buffer.
Când pornește un program, acesta solicită sistemului să creeze un obiect mutex pentru o anumită resursă. Sistemul creează obiectul mutex cu un nume sau un ID unic. Ori de câte ori firul de execuție al programului dorește să folosească resursa, ocupă blocarea obiectului mutex, utilizează resursa și, după utilizare, eliberează blocarea obiectului mutex. Apoi, următorul proces este permis să obțină blocarea obiectului mutex.
Între timp, un proces a obținut blocarea obiectului mutex și niciun alt fir sau proces nu poate accesa resursa respectivă. Dacă obiectul mutex este deja blocat, procesul care dorește să obțină blocarea pe obiectul mutex trebuie să aștepte și este pus în coadă de sistem până când obiectul mutex este deblocat.
Avantajele Mutex
Iată următoarele avantaje ale mutexului, cum ar fi:
- Mutex este doar simple încuietori obținute înainte de a intra în secțiunea sa critică și apoi de a o elibera.
- Deoarece un singur fir se află în secțiunea sa critică la un moment dat, nu există condiții de cursă, iar datele rămân întotdeauna consistente.
Dezavantajele Mutex
Mutex are, de asemenea, unele dezavantaje, cum ar fi:
- Dacă un fir de execuție obține o blocare și intră în repaus sau este preemptat, atunci celălalt thread poate să nu avanseze. Acest lucru poate duce la foame.
- Nu poate fi blocat sau deblocat dintr-un context diferit de cel care a dobândit-o.
- În secțiunea critică ar trebui permisă un singur fir o dată.
- Implementarea normală poate duce la o stare de așteptare ocupată, care irosește timp CPU.
Ce este Semaphore?
Semaforul este pur și simplu o variabilă care nu este negativă și partajată între fire. Un semafor este un mecanism de semnalizare, iar un alt fir poate semnala un fir care așteaptă un semafor.
Un semafor folosește două operații atomice,
1. Așteptați: Operația de așteptare scade valoarea argumentului său S dacă este pozitiv. Dacă S este negativ sau zero, atunci nu se efectuează nicio operație.
wait(S) { while (S<=0); s--; } < pre> <p> <strong>2. Signal for the process synchronization:</strong> The signal operation increments the value of its argument S.</p> <pre> signal(S) { S++; } </pre> <p>A semaphore either allows or reject access to the resource, depending on how it is set up.</p> <h3>Use of Semaphore</h3> <p>In the case of a single buffer, we can separate the 4 KB buffer into four buffers of 1 KB. Semaphore can be associated with these four buffers, allowing users and producers to work on different buffers simultaneously.</p> <h3>Types of Semaphore</h3> <p>Semaphore is distinguished by the operating system in two categories <strong>Counting semaphore</strong> and <strong>Binary semaphore</strong> .</p> <p> <strong>1. Counting Semaphore:</strong> The semaphore S value is initialized to the <strong>number of resources</strong> present in the system. Whenever a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and <strong>decrements</strong> the semaphore value by one. When it releases the resource, it performs <strong>the signal()</strong> operation on the semaphore and <strong>increments</strong> the semaphore value by one.</p> <p>When the semaphore count goes to 0, it means the processes occupy all resources. A process needs to use a resource when the semaphore count is 0. It executes the <strong>wait()</strong> operation and gets <strong>blocked</strong> until the semaphore value becomes greater than 0.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-3.webp" alt="Mutex vs Semaphore"> <p> <strong>2. Binary semaphore:</strong> The value of a semaphore ranges between <strong>0</strong> and <strong>1</strong> . It is similar to mutex lock, but mutex is a locking mechanism, whereas the semaphore is a signaling mechanism. In binary semaphore, if a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and decrements the value of the semaphore from 1 to 0. When it releases the resource, it performs a <strong>signal</strong> <strong>()</strong> operation on the semaphore and increments its value to 1. Suppose the value of the semaphore is 0 and a process wants to access the resource. In that case, it performs <strong>wait()</strong> operation and block itself till the current process utilizing the resources releases the resource.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-4.webp" alt="Mutex vs Semaphore"> <h3>Advantages of Semaphore</h3> <p>Here are the following advantages of semaphore, such as:</p> <ul> <li>It allows more than one thread to access the critical section.</li> <li>Semaphores are machine-independent.</li> <li>Semaphores are implemented in the machine-independent code of the microkernel.</li> <li>They do not allow multiple processes to enter the critical section.</li> <li>As there is busy and waiting in semaphore, there is never wastage of process time and resources.</li> <li>They are machine-independent, which should be run in the machine-independent code of the microkernel.</li> <li>They allow flexible management of resources.</li> </ul> <h3>Disadvantage of Semaphores</h3> <p>Semaphores also have some disadvantages, such as:</p> <ul> <li>One of the biggest limitations of a semaphore is priority inversion.</li> <li>The operating system has to keep track of all calls to wait and signal semaphore.</li> <li>Their use is never enforced, but it is by convention only.</li> <li>The Wait and Signal operations require to be executed in the correct order to avoid deadlocks in semaphore.</li> <li>Semaphore programming is a complex method, so there are chances of not achieving mutual exclusion.</li> <li>It is also not a practical method for large scale use as their use leads to loss of modularity.</li> <li>Semaphore is more prone to programmer error</li> <li>, and it may cause deadlock or violation of mutual exclusion due to programmer error.</li> </ul> <h3>Difference between Mutex and Semaphore</h3> <p>The basic difference between semaphore and mutex is that semaphore is a signalling mechanism, i.e. processes perform wait() and signal() operation to indicate whether they are acquiring or releasing the resource. In contrast, a mutex is a locking mechanism, and the process has to acquire the lock on a mutex object if it wants to acquire the resource. Here are some more differences between semaphore and mutex, such as:</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-5.webp" alt="Mutex vs Semaphore"> <br> <table class="table"> <tr> <th>Terms</th> <th>Mutex</th> <th>Semaphore</th> </tr> <tr> <td>Definition</td> <td>The mutex is a locking mechanism, as to acquire a resource, a process needs to lock the mutex object, and while releasing a resource process has to unlock the mutex object.</td> <td>Semaphore is a signalling mechanism as wait() and signal() operations performed on the semaphore variable indicate whether a process is acquiring or releasing the resource.</td> </tr> <tr> <td>Existence</td> <td>A mutex is an object.</td> <td>Semaphore is an integer variable.</td> </tr> <tr> <td>Function</td> <td>Mutex allows multiple program threads to access a single resource but not simultaneously.</td> <td>Semaphore allows multiple program threads to access a finite instance of resources.</td> </tr> <tr> <td>Ownership</td> <td>Mutex object lock is released only by the process that has acquired the lock on the mutex object.</td> <td>Semaphore value can be changed by any process acquiring or releasing the resource by performing wait() and signal() operation.</td> </tr> <tr> <td>Categorize</td> <td>Mutex is not categorized further.</td> <td>The semaphore can be categorized into counting semaphore and binary semaphore.</td> </tr> <tr> <td>Operation</td> <td>The mutex object is locked or unlocked by the process of requesting or releasing the resource.</td> <td>Semaphore value is modified using wait() and signal() operation apart from initialization.</td> </tr> <tr> <td>Resources Occupied</td> <td>If a mutex object is already locked, then the process desiring to acquire resource waits and get queued by the system till the resource is released and the mutex object gets unlocked.</td> <td>Suppose the process acquires all the resources, and no resource is free. In that case, the process desiring to acquire resource performs wait() operation on semaphore variable and blocks itself till the count of semaphore become greater than 0.</td> </tr> </table> <hr></=0);>
Un semafor fie permite sau respinge accesul la resursă, în funcție de modul în care este configurat.
Utilizarea Semaforului
În cazul unui singur buffer, putem separa bufferul de 4 KB în patru buffer-uri de 1 KB. Semaforul poate fi asociat cu aceste patru buffere, permițând utilizatorilor și producătorilor să lucreze la diferite buffere simultan.
Tipuri de semafor
Semaforul se distinge prin sistemul de operare în două categorii Semafor de numărare și Semafor binar .
1. Numărarea semaforului: Valoarea S semaforului este inițializată la numărul de resurse prezente în sistem. Ori de câte ori un proces dorește să acceseze resursa, acesta funcționează asteptarea() operație pe semafor și scade valoarea semaforului cu unu. Când eliberează resursa, funcționează semnalul() operație pe semafor și incremente valoarea semaforului cu unu.
Când numărul de semaforuri ajunge la 0, înseamnă că procesele ocupă toate resursele. Un proces trebuie să utilizeze o resursă atunci când numărul de semafor este 0. El execută aștepta() operațiune și devine blocat până când valoarea semaforului devine mai mare decât 0.
2. Semafor binar: Valoarea unui semafor variază între 0 și 1 . Este similar cu blocarea mutexului, dar mutexul este un mecanism de blocare, în timp ce semaforul este un mecanism de semnalizare. În semaforul binar, dacă un proces dorește să acceseze resursa, acesta funcționează asteptarea() operațiune pe semafor și decrementează valoarea semaforului de la 1 la 0. Când eliberează resursa, efectuează o semnal () operațiunea pe semafor și crește valoarea acestuia la 1. Să presupunem că valoarea semaforului este 0 și un proces dorește să acceseze resursa. În acest caz, funcționează aștepta() funcționarea și se blochează până când procesul curent care utilizează resursele eliberează resursa.
Avantajele Semaphore
Iată următoarele avantaje ale semaforului, cum ar fi:
- Permite mai multor fire să acceseze secțiunea critică.
- Semaforele sunt independente de mașină.
- Semaforele sunt implementate în codul independent de mașină al microkernel-ului.
- Ele nu permit intrarea mai multor procese în secțiunea critică.
- Deoarece în semafor este ocupat și așteaptă, nu există niciodată risipă de timp și resurse de proces.
- Sunt independente de mașină, care ar trebui să fie rulate în codul independent de mașină al microkernel-ului.
- Acestea permit gestionarea flexibilă a resurselor.
Dezavantajul semaforelor
Semaforele au și unele dezavantaje, cum ar fi:
- Una dintre cele mai mari limitări ale unui semafor este inversarea priorității.
- Sistemul de operare trebuie să țină evidența tuturor apelurilor pentru a aștepta și a semnala semaforul.
- Utilizarea lor nu este niciodată impusă, dar este doar prin convenție.
- Operațiunile de așteptare și semnal trebuie să fie executate în ordinea corectă pentru a evita blocajele în semafor.
- Programarea cu semafor este o metodă complexă, deci există șanse să nu se realizeze excluderea reciprocă.
- De asemenea, nu este o metodă practică pentru utilizarea pe scară largă, deoarece utilizarea lor duce la pierderea modularității.
- Semaforul este mai predispus la erori ale programatorului
- , și poate cauza blocaj sau încălcarea excluderii reciproce din cauza erorii programatorului.
Diferența dintre Mutex și Semaphore
Diferența de bază dintre semafor și mutex este că semaforul este un mecanism de semnalizare, adică procesele efectuează operațiuni wait() și signal() pentru a indica dacă achiziționează sau eliberează resursa. În schimb, un mutex este un mecanism de blocare, iar procesul trebuie să obțină blocarea unui obiect mutex dacă dorește să obțină resursa. Iată mai multe diferențe între semafor și mutex, cum ar fi:
Termeni | Mutex | Semafor |
---|---|---|
Definiție | Mutexul este un mecanism de blocare, deoarece pentru a dobândi o resursă, un proces trebuie să blocheze obiectul mutex și, în timp ce eliberează o resursă, procesul trebuie să deblocheze obiectul mutex. | Semaforul este un mecanism de semnalizare, deoarece operațiile wait() și signal() efectuate asupra variabilei semafor indică dacă un proces achiziționează sau eliberează resursa. |
Existenţă | Un mutex este un obiect. | Semaforul este o variabilă întreagă. |
Funcţie | Mutex permite mai multor fire de execuție de program să acceseze o singură resursă, dar nu simultan. | Semaphore permite mai multor fire de execuție de program să acceseze o instanță finită de resurse. |
Proprietate | Blocarea obiectului Mutex este eliberată numai de procesul care a obținut blocarea obiectului mutex. | Valoarea semaforului poate fi modificată de orice proces care achiziționează sau eliberează resursa prin efectuarea operației wait() și signal(). |
Clasificați | Mutex nu este clasificat în continuare. | Semaforul poate fi clasificat în semafor de numărare și semafor binar. |
Operațiune | Obiectul mutex este blocat sau deblocat prin procesul de solicitare sau eliberare a resursei. | Valoarea semaforului este modificată folosind operația wait() și signal() în afară de inițializare. |
Resurse ocupate | Dacă un obiect mutex este deja blocat, atunci procesul care dorește să obțină o resursă așteaptă și este pus în coadă de către sistem până când resursa este eliberată și obiectul mutex este deblocat. | Să presupunem că procesul dobândește toate resursele și nicio resursă nu este gratuită. În acest caz, procesul care dorește să achiziționeze resurse efectuează operația wait() pe variabila semafor și se blochează până când numărul de semafor devine mai mare de 0. |
=0);>