Käyttöjärjestelmän terminologian mukaan mutex ja semaforit ovat ydinresursseja, jotka tarjoavat synkronointipalveluita, joita kutsutaan myös nimellä synkronointiprimitiivit . Prosessien synkronointi on tärkeä rooli jaetun tiedon johdonmukaisuuden ylläpitämisessä. Sekä ohjelmisto- että laitteistoratkaisut ovat olemassa kriittisten osien ongelmien käsittelyyn. Mutta laitteistoratkaisuja kriittisten osien ongelmiin on melko vaikea toteuttaa. Sekä Mutex että semafori tarjoavat synkronointipalveluita, mutta ne eivät ole samoja.
Mikä on Mutex?
Mutex on keskinäinen poissulkemisobjekti, joka synkronoi pääsyn resurssiin. Se luodaan ainutlaatuisella nimellä ohjelman alussa. Mutex-lukitusmekanismi varmistaa, että vain yksi lanka voi saada mutexin ja päästä kriittiseen osaan. Tämä säie vapauttaa mutexin vain, kun se poistuu kriittisestä osiosta.
Se on erityinen binaarisemafori, jota käytetään jaetun resurssin pääsyn hallintaan. Se sisältää prioriteetin periytymismekanismin laajennetun prioriteetin inversio-ongelmien välttämiseksi. Sen avulla nykyiset korkeamman prioriteetin tehtävät voidaan pitää estettyinä mahdollisimman lyhyen ajan. Prioriteetin periytyminen ei kuitenkaan korjaa prioriteetin inversiota, vaan vain minimoi sen vaikutusta.
Esimerkki
Tämä näkyy seuraavan esimerkin avulla,
wait (mutex); ..... Critical Section ..... signal (mutex);
Mutexin käyttö
Mutex tarjoaa molemminpuolisen poissulkemisen, joko tuottajan tai kuluttajan, joka voi saada avaimen (mutex) ja jatkaa työtään. Niin kauan kuin tuottaja täyttää puskurin, käyttäjän on odotettava ja päinvastoin. Mutex lockissa vain yksi säie voi toimia koko puskurin kanssa koko ajan.
Kun ohjelma käynnistyy, se pyytää järjestelmää luomaan mutex-objektin tietylle resurssille. Järjestelmä luo mutex-objektin, jolla on yksilöllinen nimi tai tunnus. Aina kun ohjelmasäie haluaa käyttää resurssia, se varaa lock on mutex -objektin, hyödyntää resurssia ja käytön jälkeen vapauttaa lukon mutex-objektille. Sitten seuraavan prosessin sallitaan hankkia lukko mutex-objektiin.
Samaan aikaan prosessi on saanut lukon mutex-objektiin, eikä mikään muu säie tai prosessi voi käyttää tätä resurssia. Jos mutex-objekti on jo lukittu, prosessin, joka haluaa saada lukon mutex-objektiin, on odotettava ja järjestelmä asettaa sen jonoon, kunnes mutex-objektin lukitus avataan.
Mutexin edut
Tässä ovat seuraavat mutexin edut, kuten:
- Mutex on vain yksinkertaisia lukkoja, jotka on hankittu ennen kriittiseen osaan siirtymistä ja sen vapauttamista.
- Koska vain yksi lanka on sen kriittisessä osassa kerrallaan, kilpailuolosuhteita ei ole ja tiedot pysyvät aina yhdenmukaisina.
Mutexin haitat
Mutexilla on myös joitain haittoja, kuten:
- Jos lanka saa lukon ja menee lepotilaan tai ennaltaehkäisee, toinen lanka ei välttämättä liiku eteenpäin. Tämä voi johtaa nälkään.
- Sitä ei voi lukita tai avata eri kontekstista kuin se, joka sen hankki.
- Vain yksi lanka tulisi sallia kriittiseen osioon kerrallaan.
- Normaali toteutus voi johtaa kiireiseen odotustilaan, mikä tuhlaa CPU-aikaa.
Mikä on semafori?
Semafori on yksinkertaisesti muuttuja, joka ei ole negatiivinen ja jaetaan säikeiden kesken. Semafori on signalointimekanismi, ja toinen säie voi signaloida säiettä, joka odottaa semaforissa.
Semafori käyttää kahta atomioperaatiota,
1. Odota: Odotustoiminto pienentää argumenttinsa S arvoa, jos se on positiivinen. Jos S on negatiivinen tai nolla, toimintoa ei suoriteta.
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);>
Semafori joko sallii tai hylkää pääsyn resurssiin riippuen siitä, miten se on määritetty.
Semaforin käyttö
Yhden puskurin tapauksessa voimme jakaa 4 kilotavun puskurin neljään 1 kilotavun puskuriin. Semaphore voidaan yhdistää näihin neljään puskuriin, jolloin käyttäjät ja tuottajat voivat työskennellä eri puskureissa samanaikaisesti.
Semaforien tyypit
Semaphore erottuu käyttöjärjestelmästä kahdessa kategoriassa Semaforin laskenta ja Binäärinen semafori .
1. Semaforien laskeminen: Semaforin S arvo alustetaan arvoon resurssien määrä läsnä järjestelmässä. Aina kun prosessi haluaa käyttää resurssia, se suorittaa odotus() toiminta semaforilla ja vähennyksiä semaforin arvo yhdellä. Kun se vapauttaa resurssin, se toimii signaali() toiminta semaforilla ja lisäyksiä semaforin arvo yhdellä.
Kun semaforien määrä menee nollaan, se tarkoittaa, että prosessit vievät kaikki resurssit. Prosessin on käytettävä resurssia, kun semaforien määrä on 0. Se suorittaa odota() toimintaa ja saa tukossa kunnes semaforin arvo on suurempi kuin 0.
2. Binäärinen semafori: Semaforin arvo vaihtelee välillä 0 ja 1 . Se on samanlainen kuin mutex-lukko, mutta mutex on lukitusmekanismi, kun taas semafori on signalointimekanismi. Jos prosessi haluaa käyttää resurssia binäärisemaforissa, se suorittaa sen odotus() toiminto semaforilla ja pienentää semaforin arvoa 1:stä 0:aan. Kun se vapauttaa resurssin, se suorittaa signaali () toiminto semaforilla ja kasvattaa sen arvoa 1:ksi. Oletetaan, että semaforin arvo on 0 ja prosessi haluaa käyttää resurssia. Siinä tapauksessa se toimii odota() ja estää itsensä, kunnes nykyinen resursseja hyödyntävä prosessi vapauttaa resurssin.
Semaforin edut
Tässä ovat seuraavat semaforin edut, kuten:
- Se sallii useamman kuin yhden säikeen pääsyn kriittiseen osaan.
- Semaforit ovat koneista riippumattomia.
- Semaforit on toteutettu mikroytimen koneista riippumattomassa koodissa.
- Ne eivät salli useiden prosessien pääsyä kriittiseen osioon.
- Koska semaforissa on kiirettä ja odottelua, prosessiaikaa ja resursseja ei koskaan tuhlata.
- Ne ovat koneriippumattomia, jotka tulisi ajaa mikroytimen koneriippumattomassa koodissa.
- Ne mahdollistavat resurssien joustavan hallinnan.
Semaforien haittapuoli
Semaforeilla on myös joitain haittoja, kuten:
- Yksi semaforin suurimmista rajoituksista on prioriteetin inversio.
- Käyttöjärjestelmän on pidettävä kirjaa kaikista puheluista odottaakseen ja signaloidakseen semaforia.
- Niiden käyttöä ei koskaan pakoteta, vaan se tapahtuu vain sopimuksella.
- Odotus- ja signaalitoiminnot on suoritettava oikeassa järjestyksessä, jotta vältetään semaforin lukkiutuminen.
- Semaforiohjelmointi on monimutkainen menetelmä, joten on mahdollisuuksia, että molemminpuolista poissulkemista ei saavuteta.
- Se ei myöskään ole käytännöllinen menetelmä laajamittaiseen käyttöön, koska niiden käyttö johtaa modulaarisuuden menettämiseen.
- Semafori on alttiimpi ohjelmoijavirheille
- , ja se voi aiheuttaa lukkiutumisen tai molemminpuolisen poissulkemisen rikkomisen ohjelmointivirheen vuoksi.
Ero Mutexin ja Semaphoren välillä
Perusero semaforin ja mutexin välillä on se, että semafori on signalointimekanismi, eli prosessit suorittavat wait()- ja signal()-operaation osoittaakseen, hankkivatko vai vapauttavatko ne resurssia. Sitä vastoin mutex on lukitusmekanismi, ja prosessin on hankittava lukko mutex-objektiin, jos se haluaa hankkia resurssin. Tässä on joitain lisää eroja semaforin ja mutexin välillä, kuten:
Ehdot | Mutex | Semafori |
---|---|---|
Määritelmä | Mutex on lukitusmekanismi, sillä resurssin hankkimiseksi prosessin on lukittava mutex-objekti ja resurssia vapauttaessaan prosessin on avattava mutex-objekti. | Semafori on signalointimekanismi, koska semaforimuuttujalle suoritetut wait()- ja signal()-operaatiot osoittavat, onko prosessi hankkimassa vai vapauttamassa resurssia. |
Olemassaolo | Mutex on esine. | Semafori on kokonaislukumuuttuja. |
Toiminto | Mutex sallii useiden ohjelmasäikeiden pääsyn yhteen resurssiin, mutta ei samanaikaisesti. | Semaforin avulla useat ohjelmasäikeet voivat käyttää rajallista resurssien esiintymää. |
Omistajuus | Mutex-objektin lukituksen vapauttaa vain prosessi, joka on saanut lukon mutex-objektiin. | Semaforin arvoa voidaan muuttaa millä tahansa prosessilla, joka hankkii tai vapauttaa resurssin suorittamalla wait()- ja signal()-operaation. |
Luokitella | Mutexia ei luokitella enempää. | Semafori voidaan luokitella laskevaan semaforiin ja binäärisemaforiin. |
Operaatio | Mutex-objekti lukitaan tai avataan resurssin pyytämisen tai vapauttamisen yhteydessä. | Semaforin arvoa muutetaan käyttämällä wait()- ja signal()-operaatioita alustuksen lisäksi. |
Varatut resurssit | Jos mutex-objekti on jo lukittu, prosessi, joka haluaa hankkia resurssin, odottaa ja joutuu järjestelmän jonoon, kunnes resurssi vapautetaan ja mutex-objektin lukitus avataan. | Oletetaan, että prosessi hankkii kaikki resurssit, eikä mikään resurssi ole ilmaista. Siinä tapauksessa resurssia hankkiva prosessi suorittaa wait()-operaation semaforimuuttujalle ja estää itsensä, kunnes semaforien määrä on suurempi kuin 0. |
=0);>