logo

Mutex vs Semafor

Podľa terminológie operačného systému sú mutex a semafory prostriedky jadra, ktoré poskytujú synchronizačné služby, tiež tzv. synchronizačné primitíva . Synchronizácia procesov zohráva dôležitú úlohu pri udržiavaní konzistencie zdieľaných údajov. Na riešenie problémov s kritickými časťami sú k dispozícii softvérové ​​aj hardvérové ​​riešenia. Hardvérové ​​riešenia problémov s kritickými sekciami sa však implementujú pomerne ťažko. Mutex a semafor poskytujú synchronizačné služby, ale nie sú rovnaké.

Čo je Mutex?

Mutex je objekt vzájomného vylúčenia, ktorý synchronizuje prístup k prostriedku. Vytvára sa s jedinečným názvom na začiatku programu. Uzamykací mechanizmus mutexu zaisťuje, že iba jedno vlákno môže získať mutex a vstúpiť do kritickej sekcie. Toto vlákno uvoľní mutex iba vtedy, keď opustí kritickú sekciu.

Mutex vs Semafor

Ide o špeciálny typ binárneho semaforu, ktorý sa používa na riadenie prístupu k zdieľanému zdroju. Zahŕňa mechanizmus dedenia priorít, aby sa predišlo problémom s rozšírenou inverziou priority. Umožňuje udržať aktuálne úlohy s vyššou prioritou v zablokovanom stave čo najkratší čas. Dedenie priority však neopravuje inverziu priority, ale iba minimalizuje jej účinok.

Príklad

Toto je znázornené pomocou nasledujúceho príkladu,

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

Použitie Mutexu

Mutex poskytuje vzájomné vylúčenie, či už výrobcu alebo spotrebiteľa, ktorý môže mať kľúč (mutex) a pokračovať vo svojej práci. Kým výrobca naplní vyrovnávaciu pamäť, používateľ musí čakať a naopak. V zámku Mutex môže vždy pracovať iba jedno vlákno s celou vyrovnávacou pamäťou.

Keď sa program spustí, požiada systém, aby vytvoril objekt mutex pre daný zdroj. Systém vytvorí objekt mutex s jedinečným názvom alebo ID. Kedykoľvek chce programové vlákno použiť zdroj, obsadí zámok na objekt mutex, využije zdroj a po použití uvoľní zámok na objekte mutex. Potom môže ďalší proces získať zámok na objekte mutex.

Medzitým proces získal zámok na objekte mutex a žiadne iné vlákno ani proces nemá prístup k tomuto prostriedku. Ak je objekt mutex už zamknutý, proces, ktorý chce získať zámok na objekte mutex, musí počkať a systém ho zaradí do frontu, kým sa objekt mutex neodomkne.

Výhody Mutexu

Tu sú nasledujúce výhody mutexu, ako napríklad:

  • Mutex sú len jednoduché zámky získané pred vstupom do kritickej časti a následným uvoľnením.
  • Keďže v kritickej sekcii je v danom čase iba jedno vlákno, neexistujú žiadne závodné podmienky a údaje zostávajú vždy konzistentné.

Nevýhody Mutexu

Mutex má tiež niektoré nevýhody, ako napríklad:

  • Ak vlákno získa uzamknutie a prejde do režimu spánku alebo je preemptované, ďalšie vlákno sa nemusí posunúť dopredu. To môže viesť k hladovaniu.
  • Nedá sa zamknúť ani odomknúť z iného kontextu, ako je ten, ktorý ho získal.
  • V kritickej sekcii by malo byť súčasne povolené iba jedno vlákno.
  • Normálna implementácia môže viesť k zaneprázdnenému stavu čakania, čo mrhá časom CPU.

Čo je Semafor?

Semafor je jednoducho premenná, ktorá nie je negatívna a zdieľaná medzi vláknami. Semafor je signalizačný mechanizmus a ďalšie vlákno môže signalizovať vlákno, ktoré čaká na semafore.

Mutex vs Semafor

Semafor používa dve atómové operácie,

1. Počkajte: Operácia čakania zníži hodnotu svojho argumentu S, ak je kladný. Ak je S záporné alebo nulové, nevykoná sa žiadna operácia.

 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ď povoľuje alebo odmieta prístup k zdroju, v závislosti od toho, ako je nastavený.

Použitie Semaforu

V prípade jednej vyrovnávacej pamäte môžeme 4 KB vyrovnávaciu pamäť rozdeliť na štyri vyrovnávacie pamäte s veľkosťou 1 KB. Semafor môže byť spojený s týmito štyrmi vyrovnávacími pamäťami, čo umožňuje používateľom a výrobcom pracovať na rôznych vyrovnávacích pamäťách súčasne.

Typy semaforov

Semafor sa rozlišuje podľa operačného systému v dvoch kategóriách Počítací semafor a Binárny semafor .

1. Počítanie semaforu: Hodnota semaforu S je inicializovaná na počet zdrojov prítomný v systéme. Vždy, keď chce proces získať prístup k prostriedku, vykoná to čakanie () prevádzka na semafore a úbytky hodnotu semaforu o jeden. Keď uvoľní zdroj, vykoná sa signál () prevádzka na semafore a prírastky hodnotu semaforu o jeden.

Keď počet semaforov klesne na 0, znamená to, že procesy zaberajú všetky zdroje. Proces potrebuje použiť zdroj, keď je počet semaforov 0. Spustí sa počkaj () operáciu a dostane zablokované kým hodnota semaforu nebude väčšia ako 0.

Mutex vs Semafor

2. Binárny semafor: Hodnota semaforu sa pohybuje medzi 0 a 1 . Je to podobné ako mutex lock, ale mutex je uzamykací mechanizmus, zatiaľ čo semafor je signalizačný mechanizmus. V binárnom semafore, ak chce proces získať prístup k zdroju, vykoná to čakanie () operáciu na semafore a zníži hodnotu semaforu z 1 na 0. Keď uvoľní zdroj, vykoná signál () operácie na semafore a zvýši jeho hodnotu na 1. Predpokladajme, že hodnota semaforu je 0 a proces chce získať prístup k zdroju. V takom prípade vykonáva počkaj () operáciu a zablokuje sa, kým aktuálny proces využívajúci zdroje neuvoľní zdroj.

Mutex vs Semafor

Výhody Semaforu

Tu sú nasledujúce výhody semaforu, ako napríklad:

  • Umožňuje viac ako jednému vláknu prístup ku kritickej sekcii.
  • Semafory sú strojovo nezávislé.
  • Semafory sú implementované v strojovo nezávislom kóde mikrojadra.
  • Neumožňujú viacerým procesom vstúpiť do kritickej sekcie.
  • Keďže v semafore je veľa práce a čakania, nikdy nedochádza k plytvaniu procesným časom a zdrojmi.
  • Sú strojovo nezávislé, čo by malo byť spustené v strojovo nezávislom kóde mikrojadra.
  • Umožňujú flexibilné riadenie zdrojov.

Nevýhoda semaforov

Semafory majú aj svoje nevýhody, napr.

  • Jedným z najväčších obmedzení semaforu je inverzia priority.
  • Operačný systém musí sledovať všetky volania na počkanie a signalizovať semafor.
  • Ich použitie nie je nikdy vynútené, ale je to len konvenciou.
  • Operácie Wait a Signal vyžadujú vykonanie v správnom poradí, aby sa zabránilo uviaznutiu v semafore.
  • Semaforové programovanie je komplexná metóda, takže existuje šanca, že sa nedosiahne vzájomné vylúčenie.
  • Nie je to ani praktická metóda na použitie vo veľkom meradle, pretože ich použitie vedie k strate modularity.
  • Semafor je náchylnejší na chyby programátora
  • a môže spôsobiť zablokovanie alebo porušenie vzájomného vylúčenia v dôsledku chyby programátora.

Rozdiel medzi Mutexom a Semaforom

Základný rozdiel medzi semaforom a mutexom je v tom, že semafor je signalizačný mechanizmus, t.j. procesy vykonávajú operácie wait() a signal(), aby indikovali, či získavajú alebo uvoľňujú zdroj. Naproti tomu mutex je uzamykací mechanizmus a proces musí získať zámok na objekte mutex, ak chce získať zdroj. Tu je niekoľko ďalších rozdielov medzi semaforom a mutexom, ako napríklad:

Mutex vs Semafor
Podmienky Mutex Semafor
Definícia Mutex je uzamykací mechanizmus, pretože na získanie zdroja musí proces uzamknúť objekt mutex a pri uvoľnení procesu zdroja musí objekt mutex odomknúť. Semafor je signalizačný mechanizmus, pretože operácie wait() a signal() vykonávané na premennej semaforu indikujú, či proces získava alebo uvoľňuje zdroj.
Existencia Mutex je objekt. Semafor je celočíselná premenná.
Funkcia Mutex umožňuje viacerým programovým vláknam pristupovať k jednému zdroju, ale nie súčasne. Semafor umožňuje viacerým programovým vláknam pristupovať ku konečnej inštancii zdrojov.
Vlastníctvo Zámok objektu mutex je uvoľnený iba procesom, ktorý získal zámok na objekte mutex. Hodnota semaforu môže byť zmenená akýmkoľvek procesom, ktorý získava alebo uvoľňuje zdroj vykonaním operácie wait() a signal().
Kategorizovať Mutex nie je ďalej kategorizovaný. Semafor môže byť kategorizovaný na počítací semafor a binárny semafor.
Prevádzka Objekt mutex je uzamknutý alebo odomknutý procesom vyžiadania alebo uvoľnenia zdroja. Hodnota semaforu sa okrem inicializácie upravuje pomocou operácií wait() a signal().
Obsadené zdroje Ak je objekt mutex už uzamknutý, potom proces, ktorý chce získať zdroj, čaká a systém ho zaradí do frontu, kým sa zdroj neuvoľní a objekt mutex sa neodomkne. Predpokladajme, že proces získa všetky zdroje a žiadny zdroj nie je voľný. V takom prípade proces, ktorý chce získať zdroj, vykoná operáciu wait() na premennej semaforu a zablokuje sa, kým počet semaforov nebude väčší ako 0.