Ifølge operativsystemterminologi er mutex og semaforer kerneressourcer, der leverer synkroniseringstjenester, også kaldet synkroniseringsprimitiver . Processynkronisering spiller en vigtig rolle i at opretholde konsistensen af delte data. Både software- og hardwareløsningerne er til stede til håndtering af kritiske sektionsproblemer. Men hardwareløsninger til kritiske sektionsproblemer er ret svære at implementere. Mutex og semafor leverer begge synkroniseringstjenester, men de er ikke de samme.
Hvad er Mutex?
Mutex er et gensidigt ekskluderingsobjekt, der synkroniserer adgang til en ressource. Det er oprettet med et unikt navn i starten af et program. Mutex-låsemekanismen sikrer, at kun én tråd kan erhverve mutex'en og komme ind i den kritiske sektion. Denne tråd frigiver kun mutex'en, når den forlader den kritiske sektion.
Det er en speciel type binær semafor, der bruges til at kontrollere adgangen til den delte ressource. Det inkluderer en prioritetsarvsmekanisme for at undgå problemer med udvidet prioritetsinversion. Det gør det muligt at holde aktuelle opgaver med højere prioritet i blokeret tilstand i kortest mulig tid. Prioritetsarv korrigerer dog ikke prioritetsinversion, men minimerer kun dens effekt.
Eksempel
Dette er vist ved hjælp af følgende eksempel,
wait (mutex); ..... Critical Section ..... signal (mutex);
Brug af Mutex
En mutex giver gensidig udelukkelse, enten producent eller forbruger, som kan få nøglen (mutex) og fortsætte med deres arbejde. Så længe producenten fylder bufferen, skal brugeren vente, og omvendt. I Mutex lock kan kun en enkelt tråd hele tiden fungere med hele bufferen.
Når et program starter, anmoder det systemet om at oprette et mutex-objekt for en given ressource. Systemet opretter mutex-objektet med et unikt navn eller ID. Når programtråden ønsker at bruge ressourcen, optager den lås på mutex-objekt, udnytter ressourcen og efter brug frigiver den låsen på mutex-objekt. Derefter får den næste proces lov til at erhverve låsen på mutex-objektet.
I mellemtiden har en proces erhvervet låsen på mutex-objektet, og ingen anden tråd eller proces kan få adgang til den ressource. Hvis mutex-objektet allerede er låst, skal processen, der ønsker at opnå låsen på mutex-objektet, vente og sættes i kø af systemet, indtil mutex-objektet er låst op.
Fordele ved Mutex
Her er følgende fordele ved mutex, såsom:
- Mutex er blot simple låse, der er opnået, før de går ind i dens kritiske sektion og derefter frigiver den.
- Da kun én tråd er i sin kritiske sektion på et givet tidspunkt, er der ingen løbsbetingelser, og data forbliver altid konsistente.
Ulemper ved Mutex
Mutex har også nogle ulemper, såsom:
- Hvis en tråd får en lås og går i dvale eller bliver foregrebet, så bevæger den anden tråd sig muligvis ikke fremad. Dette kan føre til sult.
- Den kan ikke låses eller låses op fra en anden kontekst end den, der erhvervede den.
- Kun én tråd bør tillades i den kritiske sektion ad gangen.
- Den normale implementering kan føre til en travl ventetilstand, hvilket spilder CPU-tid.
Hvad er semafor?
Semafor er simpelthen en variabel, der er ikke-negativ og delt mellem tråde. En semafor er en signalmekanisme, og en anden tråd kan signalere en tråd, der venter på en semafor.
En semafor bruger to atomoperationer,
1. Vent: Vent-operationen formindsker værdien af dets argument S, hvis det er positivt. Hvis S er negativ eller nul, udføres 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 enten tillader eller afviser adgang til ressourcen, afhængigt af hvordan den er sat op.
Brug af semafor
I tilfælde af en enkelt buffer kan vi adskille 4 KB bufferen i fire buffere på 1 KB. Semafor kan forbindes med disse fire buffere, hvilket giver brugere og producenter mulighed for at arbejde på forskellige buffere samtidigt.
Typer af semafor
Semafor er kendetegnet ved operativsystemet i to kategorier Tælle semafor og Binær semafor .
1. Tælle semafor: Semaforens S-værdi initialiseres til antal ressourcer til stede i systemet. Når en proces ønsker at få adgang til ressourcen, udfører den ventetiden() operation på semaforen og falder semaforværdien med én. Når den frigiver ressourcen, udfører den signalet() operation på semaforen og stigninger semaforværdien med én.
Når semaforantallet går til 0, betyder det, at processerne optager alle ressourcer. En proces skal bruge en ressource, når semaforantallet er 0. Den udfører vente() operation og får blokeret indtil semaforværdien bliver større end 0.
2. Binær semafor: Værdien af en semafor ligger mellem 0 og 1 . Det ligner mutex-lås, men mutex er en låsemekanisme, hvorimod semaforen er en signaleringsmekanisme. I binær semafor, hvis en proces ønsker at få adgang til ressourcen, udfører den ventetiden() operation på semaforen og nedsætter værdien af semaforen fra 1 til 0. Når den frigiver ressourcen, udfører den en signal () operation på semaforen og øger dens værdi til 1. Antag, at værdien af semaforen er 0, og en proces ønsker at få adgang til ressourcen. I så fald præsterer den vente() drift og blokerer sig selv, indtil den aktuelle proces, der bruger ressourcerne, frigiver ressourcen.
Fordele ved Semafor
Her er følgende fordele ved semafor, såsom:
- Det giver mere end én tråd adgang til den kritiske sektion.
- Semaforer er maskinuafhængige.
- Semaforer er implementeret i mikrokernens maskinuafhængige kode.
- De tillader ikke, at flere processer kommer ind i den kritiske sektion.
- Da der er travlt og ventende i semaforen, er der aldrig spild af procestid og ressourcer.
- De er maskinuafhængige, som skal køres i mikrokernens maskinuafhængige kode.
- De tillader fleksibel styring af ressourcer.
Ulempen ved semaforer
Semaforer har også nogle ulemper, såsom:
- En af de største begrænsninger ved en semafor er prioritetsinversion.
- Operativsystemet skal holde styr på alle opkald for at vente og signalere semafor.
- Deres brug håndhæves aldrig, men det er kun ved konvention.
- Vente- og signaloperationerne skal udføres i den rigtige rækkefølge for at undgå dødvande i semaforen.
- Semaforprogrammering er en kompleks metode, så der er chancer for ikke at opnå gensidig udelukkelse.
- Det er heller ikke en praktisk metode til brug i stor skala, da deres anvendelse fører til tab af modularitet.
- Semafor er mere tilbøjelig til programmørfejl
- , og det kan forårsage dødvande eller brud på gensidig udelukkelse på grund af programmørfejl.
Forskellen mellem Mutex og Semafor
Den grundlæggende forskel mellem semafor og mutex er, at semafor er en signaleringsmekanisme, dvs. processer udfører wait() og signal() operationer for at indikere, om de erhverver eller frigiver ressourcen. I modsætning hertil er en mutex en låsemekanisme, og processen skal erhverve låsen på et mutex-objekt, hvis den ønsker at erhverve ressourcen. Her er nogle flere forskelle mellem semafor og mutex, såsom:
Betingelser | Mutex | Semafor |
---|---|---|
Definition | Mutex er en låsemekanisme, da for at erhverve en ressource skal en proces låse mutex-objektet, og mens en ressource frigives, skal en proces låse mutex-objektet op. | Semafor er en signaleringsmekanisme, da wait() og signal() operationer udført på semaforvariablen indikerer, om en proces erhverver eller frigiver ressourcen. |
Eksistens | En mutex er et objekt. | Semafor er en heltalsvariabel. |
Fungere | Mutex tillader flere programtråde at få adgang til en enkelt ressource, men ikke samtidigt. | Semafor giver flere programtråde adgang til en begrænset forekomst af ressourcer. |
Ejendomsret | Mutex objektlås frigives kun af den proces, der har erhvervet låsen på mutex objektet. | Semaforværdi kan ændres ved enhver proces, der erhverver eller frigiver ressourcen ved at udføre wait() og signal() operation. |
Kategoriser | Mutex er ikke kategoriseret yderligere. | Semaforen kan kategoriseres i tællende semafor og binær semafor. |
Operation | Mutex-objektet låses eller låses op af processen med at anmode om eller frigive ressourcen. | Semaforværdien ændres ved hjælp af wait() og signal() operation bortset fra initialisering. |
Ressourcer besat | Hvis et mutex-objekt allerede er låst, venter den proces, der ønsker at erhverve ressource, og sættes i kø af systemet, indtil ressourcen frigives, og mutex-objektet låses op. | Antag, at processen erhverver alle ressourcerne, og ingen ressource er gratis. I dette tilfælde udfører processen, der ønsker at erhverve ressource, wait()-operation på semaforvariabel og blokerer sig selv, indtil antallet af semaforer bliver større end 0. |
=0);>