Semafori vs Mutex
Semafori on tietorakenne, jota käytetään varmistamaan, että useat prosessit eivät käytä yhteistä resurssia tai kriittistä osaa samanaikaisesti rinnakkaisissa ohjelmointiympäristöissä. Semaforeja käytetään estämään kuolleet lukot ja kilpailuolosuhteet. Mutexia (Mutual Exclusion Object) käytetään myös välttämään pääsy yhteiseen resurssiin samanaikaisesti useiden samanaikaisten prosessien avulla.
Mikä on semafori?
Semafori on tietorakenne, jota käytetään kriittisten osien vastavuoroiseen poissulkemiseen. Semaforit tukevat pääasiassa kahta operaatiota, joita kutsutaan odotukseksi (historiallisesti P) ja signaaliksi (tunnetaan historiallisesti nimellä V). Odotustoiminto estää prosessin, kunnes semafori on auki ja signaalitoiminto sallii toisen prosessin (säikeen) saapumisen. Jokainen semafori liittyy odotusprosessien jonoon. Kun lanka kutsuu odotusoperaatiota, jos semafori on auki, säiettä voi jatkaa. Jos semafori suljetaan, kun lanka kutsuu odotusoperaatiota, säiettä on estetty ja sen on odotettava jonossa. Signaalioperaatio avaa semaforin ja jos jonossa on jo odottamassa säiettä, prosessi saa edetä ja jos jonossa ei ole yhtään lankaa odottamassa, signaali muistetaan seuraaville säikeille. On olemassa kahdenlaisia semaforeja, joita kutsutaan mutex-semaforeiksi ja laskentasemaforeiksi. Mutex-semaforit mahdollistavat yhden pääsyn resurssiin ja laskentasemaforit mahdollistavat useiden säikeiden pääsyn resurssiin (jossa on useita yksiköitä).
Mikä on Mutex?
Kun tietokonesovellus käynnistetään, se luo mutexin ja liittää sen resurssiin. Kun säie käyttää resurssia, se lukitaan, eivätkä muut säikeet voi käyttää sitä. Jos toinen säie haluaa käyttää samaa resurssia, sen on tehtävä pyyntö. Sitten tämä säie sijoitetaan jonoon, kunnes ensimmäinen säie on valmis resurssin kanssa. Kun ensimmäinen säie on valmis resurssin kanssa, lukitus poistetaan ja jonossa odottava säie pääsee käsiksi resurssiin. Jos jonossa on useita säikeitä, niille annetaan käyttöoikeus kiertävästi. Käytännössä, kun mutex vuorottelee pääsyä resurssiin useiden säikeiden välillä, se näkyy, koska useat säikeet kuluttavat resurssia samanaikaisesti. Mutta sisäisesti vain yksi säie käyttää resurssia tiettynä aikana.
Mitä eroa on Semaphorella ja Mutexilla?
Vaikka sekä semaforeja että mutex-objekteja käytetään saavuttamaan vastavuoroinen poissulkeminen rinnakkaisissa ohjelmointiympäristöissä, niillä on joitain eroja. Mutex-objekti sallii vain yhden säikeen kuluttaa resurssin tai kriittisen osan, kun taas semaforit sallivat rajoitetun määrän samanaikaisia pääsyjä resurssiin (alle sallitun enimmäismäärän). Mutex-objektien kanssa muiden säikeiden, jotka haluavat käyttää resurssia, on odotettava jonossa, kunnes nykyinen säie on valmis käyttämään resurssia.