logo

Mutex vs Semafor

Podle terminologie operačního systému jsou mutex a semafory prostředky jádra, které poskytují synchronizační služby, nazývané také synchronizační primitiva . Synchronizace procesů hraje důležitou roli při udržování konzistence sdílených dat. Pro řešení problémů s kritickými sekcemi jsou k dispozici softwarová i hardwarová řešení. Ale hardwarová řešení problémů s kritickými sekcemi je poměrně obtížné implementovat. Mutex a semafor poskytují synchronizační služby, ale nejsou stejné.

Co je Mutex?

Mutex je objekt vzájemného vyloučení, který synchronizuje přístup ke zdroji. Je vytvořen s jedinečným názvem na začátku programu. Uzamykací mechanismus mutexu zajišťuje, že pouze jedno vlákno může získat mutex a vstoupit do kritické sekce. Toto vlákno uvolní mutex pouze tehdy, když opustí kritickou sekci.

Mutex vs Semafor

Jedná se o speciální typ binárního semaforu používaného pro řízení přístupu ke sdílenému zdroji. Zahrnuje mechanismus dědičnosti priorit, aby se zabránilo rozšířeným problémům s inverzí priorit. Umožňuje udržet aktuální úkoly s vyšší prioritou v blokovaném stavu po co nejkratší dobu. Dědičnost priority však inverzi priority neopravuje, ale pouze minimalizuje její účinek.

Příklad

To je znázorněno pomocí následujícího příkladu,

 wait (mutex); ..... Critical Section ..... signal (mutex); 

Použití Mutexu

Mutex poskytuje vzájemné vyloučení, buď výrobce nebo spotřebitel, který může mít klíč (mutex) a pokračovat ve své práci. Dokud výrobce naplní vyrovnávací paměť, uživatel musí čekat a naopak. V zámku Mutex může vždy pracovat pouze jedno vlákno s celým bufferem.

Když se program spustí, požádá systém o vytvoření objektu mutex pro daný zdroj. Systém vytvoří objekt mutex s jedinečným názvem nebo ID. Kdykoli chce programové vlákno použít prostředek, obsadí zámek na mutexovém objektu, využije prostředek a po použití uvolní zámek na mutexovém objektu. Poté je dalšímu procesu umožněno získat zámek na objektu mutex.

Mezitím proces získal zámek na objektu mutex a žádné jiné vlákno nebo proces nemá k tomuto prostředku přístup. Pokud je objekt mutex již zamčen, proces, který chce získat zámek na objektu mutex, musí čekat a je systémem zařazen do fronty, dokud objekt mutex není odemčen.

Výhody Mutexu

Zde jsou následující výhody mutexu, jako například:

  • Mutex jsou jen jednoduché zámky získané před vstupem do kritické sekce a poté ji uvolníte.
  • Vzhledem k tomu, že v kritické sekci je v daný okamžik pouze jedno vlákno, neexistují žádné sporné podmínky a data zůstávají vždy konzistentní.

Nevýhody Mutexu

Mutex má také některé nevýhody, jako například:

  • Pokud vlákno získá uzamčení a přejde do režimu spánku nebo je zabráněno, druhé vlákno se nemusí posunout vpřed. To může vést k hladovění.
  • Nelze jej zamknout ani odemknout z jiného kontextu, než ve kterém byl získán.
  • V kritické sekci by mělo být vždy povoleno pouze jedno vlákno.
  • Normální implementace může vést k zaneprázdněnému čekání, což plýtvá časem CPU.

Co je Semafor?

Semafor je jednoduše proměnná, která je nezáporná a sdílená mezi vlákny. Semafor je signalizační mechanismus a další vlákno může signalizovat vlákno, které čeká na semaforu.

Mutex vs Semafor

Semafor používá dvě atomické operace,

1. Počkejte: Operace čekání sníží hodnotu svého argumentu S, pokud je kladný. Pokud je S záporné nebo nulové, neprovede se žádná operace.

 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);>

Semafor buď povolí, nebo zamítne přístup ke zdroji, v závislosti na tom, jak je nastaven.

Použití Semaforu

V případě jedné vyrovnávací paměti můžeme 4 KB vyrovnávací paměť rozdělit na čtyři vyrovnávací paměti po 1 KB. Semafor může být spojen s těmito čtyřmi buffery, což umožňuje uživatelům a producentům pracovat na různých bufferech současně.

Typy semaforů

Semafor se rozlišuje podle operačního systému ve dvou kategoriích Počítací semafor a Binární semafor .

1. Počítací semafor: Hodnota semaforu S je inicializována na počet zdrojů přítomný v systému. Kdykoli chce proces získat přístup ke zdroji, provede to čekání() provoz na semaforu a dekrementy hodnotu semaforu o jednu. Když uvolní prostředek, provede se signál() provoz na semaforu a přírůstky hodnotu semaforu o jednu.

Když počet semaforů klesne na 0, znamená to, že procesy zabírají všechny zdroje. Proces potřebuje použít prostředek, když je počet semaforů 0. Spustí Počkejte() operaci a dostane blokováno dokud nebude hodnota semaforu větší než 0.

Mutex vs Semafor

2. Binární semafor: Hodnota semaforu se pohybuje mezi 0 a 1 . Je to podobné jako mutex lock, ale mutex je uzamykací mechanismus, zatímco semafor je signalizační mechanismus. V binárním semaforu, pokud chce proces získat přístup ke zdroji, provede to čekání() operaci na semaforu a sníží hodnotu semaforu z 1 na 0. Když uvolní zdroj, provede signál () operace na semaforu a zvýší jeho hodnotu na 1. Předpokládejme, že hodnota semaforu je 0 a proces chce získat přístup ke zdroji. V tom případě funguje Počkejte() operaci a zablokuje se, dokud aktuální proces využívající zdroje neuvolní zdroj.

Mutex vs Semafor

Výhody Semaforu

Zde jsou následující výhody semaforu, jako například:

  • Umožňuje více než jednomu vláknu přístup ke kritické sekci.
  • Semafory jsou strojově nezávislé.
  • Semafory jsou implementovány ve strojově nezávislém kódu mikrokernelu.
  • Neumožňují více procesům vstoupit do kritické sekce.
  • Jelikož je v semaforu rušno a čekání, nedochází k plýtvání procesním časem a zdroji.
  • Jsou strojově nezávislé, což by mělo být spuštěno ve strojově nezávislém kódu mikrokernelu.
  • Umožňují flexibilní řízení zdrojů.

Nevýhoda semaforů

Semafory mají také některé nevýhody, jako například:

  • Jedním z největších omezení semaforu je inverze priority.
  • Operační systém musí sledovat všechna volání na počkání a signalizovat semafor.
  • Jejich použití není nikdy vynuceno, ale je to pouze konvence.
  • Operace Wait a Signal vyžadují, aby byly provedeny ve správném pořadí, aby se zabránilo uváznutí v semaforu.
  • Semaforové programování je komplexní metoda, takže existuje šance, že nedosáhneme vzájemného vyloučení.
  • Není to také praktická metoda pro použití ve velkém měřítku, protože jejich použití vede ke ztrátě modularity.
  • Semafor je náchylnější k chybám programátora
  • a může způsobit uváznutí nebo porušení vzájemného vyloučení kvůli chybě programátora.

Rozdíl mezi Mutexem a Semaforem

Základní rozdíl mezi semaforem a mutexem je v tom, že semafor je signalizační mechanismus, tj. procesy provádějí operace wait() a signal(), aby indikovaly, zda získávají nebo uvolňují zdroj. Naproti tomu mutex je zamykací mechanismus a proces musí získat zámek na objektu mutex, pokud chce získat prostředek. Zde jsou některé další rozdíly mezi semaforem a mutexem, jako například:

Mutex vs Semafor
Podmínky Mutex Semafor
Definice Mutex je zamykací mechanismus, protože k získání zdroje musí proces uzamknout objekt mutexu a při uvolnění procesu zdroje musí objekt mutex odemknout. Semafor je signalizační mechanismus, protože operace wait() a signal() prováděné na proměnné semaforu indikují, zda proces získává nebo uvolňuje zdroj.
Existence Mutex je objekt. Semafor je celočíselná proměnná.
Funkce Mutex umožňuje více programovým vláknům přistupovat k jedinému prostředku, ale ne současně. Semafor umožňuje více programovým vláknům přístup k omezené instanci zdrojů.
Vlastnictví Zámek objektu mutex je uvolněn pouze procesem, který získal zámek na objektu mutex. Hodnotu semaforu lze změnit jakýmkoli procesem, který získává nebo uvolňuje zdroj provedením operace wait() a signal().
Kategorizovat Mutex není dále kategorizován. Semafor lze rozdělit na počítací semafor a binární semafor.
Úkon Objekt mutex je uzamčen nebo odemčen procesem vyžádání nebo uvolnění zdroje. Hodnota semaforu se kromě inicializace upravuje pomocí operací wait() a signal().
Zdroje obsazené Pokud je objekt mutex již uzamčen, pak proces, který chce získat zdroj, čeká a systém ho zařadí do fronty, dokud nebude zdroj uvolněn a objekt mutex nebude odemčen. Předpokládejme, že proces získává všechny zdroje a žádný zdroj není volný. V takovém případě proces, který chce získat zdroj, provede operaci wait() na proměnné semaforu a zablokuje se, dokud počet semaforu nebude větší než 0.