Enligt operativsystemets terminologi är mutex och semaforer kärnresurser som tillhandahåller synkroniseringstjänster, även kallade synkroniseringsprimitiver . Processsynkronisering spelar en viktig roll för att upprätthålla konsistensen hos delad data. Både mjukvaru- och hårdvarulösningarna finns för att hantera kritiska sektionsproblem. Men hårdvarulösningar för kritiska sektionsproblem är ganska svåra att implementera. Mutex och semafor tillhandahåller båda synkroniseringstjänster, men de är inte samma sak.
Vad är Mutex?
Mutex är ett ömsesidigt uteslutningsobjekt som synkroniserar åtkomst till en resurs. Den skapas med ett unikt namn i början av ett program. Mutex-låsmekanismen säkerställer att endast en tråd kan ta mutexen och gå in i den kritiska delen. Den här tråden släpper bara mutex när den går ut i det kritiska avsnittet.
Det är en speciell typ av binär semafor som används för att kontrollera åtkomst till den delade resursen. Den inkluderar en prioritetsärvningsmekanism för att undvika problem med utökad prioritetsinversion. Det gör att nuvarande högre prioriterade uppgifter kan hållas i blockerat tillstånd under kortast möjliga tid. Prioritetsarv korrigerar dock inte prioritetsinversion utan minimerar bara dess effekt.
Exempel
Detta visas med hjälp av följande exempel,
wait (mutex); ..... Critical Section ..... signal (mutex);
Användning av Mutex
En mutex ger ömsesidig uteslutning, antingen producent eller konsument som kan ha nyckeln (mutex) och fortsätta med sitt arbete. Så länge som producenten fyller bufferten måste användaren vänta och vice versa. I Mutex lock, hela tiden, kan bara en enda tråd fungera med hela bufferten.
När ett program startar ber det systemet att skapa ett mutex-objekt för en given resurs. Systemet skapar mutex-objektet med ett unikt namn eller ID. Närhelst programtråden vill använda resursen, upptar den lås på mutex-objekt, använder resursen och efter användning släpper den låset på mutex-objekt. Därefter tillåts nästa process att förvärva låset på mutex-objektet.
Under tiden har en process skaffat låset på mutex-objektet, och ingen annan tråd eller process kan komma åt den resursen. Om mutex-objektet redan är låst måste processen som önskar erhålla låset på mutex-objektet vänta och köas av systemet tills mutex-objektet är upplåst.
Fördelar med Mutex
Här är följande fördelar med mutex, till exempel:
- Mutex är bara enkla lås som erhålls innan man går in i dess kritiska sektion och sedan släpper den.
- Eftersom endast en tråd är i sin kritiska sektion vid varje given tidpunkt, finns det inga tävlingsförhållanden och data förblir alltid konsekventa.
Nackdelar med Mutex
Mutex har också några nackdelar, såsom:
- Om en tråd erhåller ett lås och går i viloläge eller är förebyggd, kanske den andra tråden inte går framåt. Detta kan leda till svält.
- Det kan inte låsas eller låsas upp från ett annat sammanhang än det som fick det.
- Endast en tråd bör tillåtas i det kritiska avsnittet åt gången.
- Den normala implementeringen kan leda till ett upptaget vänteläge, vilket slösar bort CPU-tid.
Vad är semafor?
Semafor är helt enkelt en variabel som är icke-negativ och delad mellan trådar. En semafor är en signalmekanism, och en annan tråd kan signalera en tråd som väntar på en semafor.
En semafor använder två atomoperationer,
1. Vänta: Vänteoperationen minskar värdet på dess argument S om det är positivt. Om S är negativ eller noll, utförs ingen operation.
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);>
En semafor tillåter eller avvisar åtkomst till resursen, beroende på hur den är inställd.
Användning av semafor
I fallet med en enda buffert kan vi separera 4 KB bufferten i fyra buffertar på 1 KB. Semafor kan associeras med dessa fyra buffertar, vilket gör att användare och producenter kan arbeta på olika buffertar samtidigt.
Typer av semafor
Semaphore särskiljs av operativsystemet i två kategorier Räkna semafor och Binär semafor .
1. Räkna semafor: Semaforens S-värde initieras till antal resurser finns i systemet. Närhelst en process vill komma åt resursen, utför den väntan() operation på semaforen och minskar semaforvärdet med ett. När den släpper resursen presterar den signalen() operation på semaforen och steg semaforvärdet med ett.
När semaforantalet går till 0 betyder det att processerna upptar alla resurser. En process behöver använda en resurs när semaforantalet är 0. Den exekverar vänta() operation och får blockerad tills semaforvärdet blir större än 0.
2. Binär semafor: Värdet på en semafor varierar mellan 0 och 1 . Det liknar mutex lock, men mutex är en låsmekanism, medan semaforen är en signalmekanism. I binär semafor, om en process vill komma åt resursen, utför den väntan() operation på semaforen och minskar värdet på semaforen från 1 till 0. När den släpper resursen utför den en signal () operation på semaforen och ökar dess värde till 1. Antag att värdet på semaforen är 0 och en process vill komma åt resursen. I så fall presterar den vänta() drift och blockerar sig själv tills den aktuella processen som använder resurserna släpper resursen.
Fördelar med Semaphore
Här är följande fördelar med semafor, till exempel:
- Det tillåter mer än en tråd att komma åt den kritiska delen.
- Semaforer är maskinoberoende.
- Semaforer är implementerade i den maskinoberoende koden för mikrokärnan.
- De tillåter inte att flera processer kommer in i den kritiska delen.
- Eftersom det är upptaget och väntan i semafor, finns det aldrig slöseri med processtid och resurser.
- De är maskinoberoende, vilket bör köras i den maskinoberoende koden för mikrokärnan.
- De tillåter flexibel hantering av resurser.
Nackdelen med semaforer
Semaforer har också några nackdelar, såsom:
- En av de största begränsningarna för en semafor är prioritetsinversion.
- Operativsystemet måste hålla reda på alla samtal för att vänta och signalera semafor.
- Deras användning upprätthålls aldrig, utan endast enligt konvention.
- Vänta och signaloperationer måste utföras i rätt ordning för att undvika dödlägen i semaforen.
- Semaforprogrammering är en komplex metod, så det finns chanser att inte uppnå ömsesidig uteslutning.
- Det är inte heller en praktisk metod för storskalig användning eftersom deras användning leder till förlust av modularitet.
- Semaphore är mer benägen för programmeringsfel
- , och det kan orsaka dödläge eller brott mot ömsesidig uteslutning på grund av programmeringsfel.
Skillnaden mellan Mutex och Semaphore
Den grundläggande skillnaden mellan semafor och mutex är att semafor är en signaleringsmekanism, det vill säga processer utför wait() och signal() operationer för att indikera om de skaffar eller släpper resursen. Däremot är en mutex en låsmekanism, och processen måste förvärva låset på ett mutex-objekt om den vill skaffa resursen. Här är några fler skillnader mellan semafor och mutex, till exempel:
Villkor | Mutex | Semafor |
---|---|---|
Definition | Mutex är en låsmekanism, eftersom för att skaffa en resurs måste en process låsa mutex-objektet, och när en resurs släpps måste en process låsa upp mutex-objektet. | Semaphore är en signaleringsmekanism eftersom wait() och signal()-operationer utförda på semaforvariabeln indikerar om en process skaffar eller frigör resursen. |
Existens | En mutex är ett objekt. | Semafor är en heltalsvariabel. |
Fungera | Mutex tillåter flera programtrådar att komma åt en enda resurs men inte samtidigt. | Semafor tillåter flera programtrådar att komma åt en ändlig instans av resurser. |
Äganderätt | Mutex-objektlåset frigörs endast av den process som har förvärvat låset på mutex-objektet. | Semaphore-värdet kan ändras genom vilken process som helst som skaffar eller frigör resursen genom att utföra wait() och signal() operation. |
Kategorisera | Mutex kategoriseras inte ytterligare. | Semaforen kan kategoriseras i räknande semafor och binär semafor. |
Drift | Mutex-objektet låses eller låses upp genom processen att begära eller släppa resursen. | Semaphore-värdet ändras med hjälp av wait() och signal() operation förutom initialisering. |
Resurser upptagna | Om ett mutex-objekt redan är låst, väntar processen som vill skaffa resurs och köas av systemet tills resursen släpps och mutex-objektet låses upp. | Anta att processen förvärvar alla resurser, och ingen resurs är gratis. I det fallet utför processen som önskar förvärva resurs wait() operation på semaforvariabeln och blockerar sig själv tills antalet semaforer blir större än 0. |
=0);>