Semafor vs Mutex
Semafor on andmestruktuur, mida kasutatakse veendumaks, et mitu protsessi ei pääse paralleelsetes programmeerimiskeskkondades korraga juurde ühisele ressursile või kriitilisele lõigule. Surmatud lukkude ja võistlustingimuste vältimiseks kasutatakse semafoore. Mutexit (Mutual Exhibition Object) kasutatakse ka selleks, et vältida samaaegset juurdepääsu mitmele samaaegsele protsessile ühisele ressursile.
Mis on semafor?
Semafor on andmestruktuur, mida kasutatakse kriitiliste lõikude vastastikuse välistamise tagamiseks. Semafoorid toetavad peamiselt kahte operatsiooni, mida nimetatakse ootamiseks (ajalooliselt tuntud kui P) ja signaaliks (ajalooliselt tuntud kui V). Ooteoperatsioon blokeerib protsessi, kuni semafor on avatud ja signaalitoiming võimaldab siseneda uude protsessi (lõime). Iga semafor on seotud ooteprotsesside järjekorraga. Kui ooteoperatsiooni kutsub lõim, siis kui semafor on avatud, saab lõime jätkata. Kui semafor suletakse, kui ootamisoperatsioon kutsub lõime, siis niit blokeeritakse ja see peab järjekorras ootama. Signaalitoiming avab semafori ja kui järjekorras juba ootab niit, siis lastakse sellel protsessil jätkata ja kui järjekorras pole ühtegi lõime, siis jääb signaal meelde järgmiste lõimede jaoks. Seal on kahte tüüpi semafoore, mida nimetatakse mutex semafoorideks ja loendavate semafoorideks. Mutexi semafoorid võimaldavad ressursile ühe juurdepääsu ja semafooride loendamine võimaldab ressurssidele juurde pääseda mitmel niidil (millel on mitu ühikut).
Mis on Mutex?
Kui arvutirakendus käivitatakse, loob see mutexi ja lisab selle ressursile. Kui lõime ressurssi kasutab, on see lukustatud ja teised lõimed ei saa seda kasutada. Kui mõni teine teema soovib sama ressurssi kasutada, peab ta selle esitama. Siis pannakse see niit järjekorda, kuni esimene lõim on ressursiga lõpule viidud. Kui esimene lõim on ressursiga lõpule viidud, eemaldatakse lukk ja järjekorras ootav lõim pääseb ressursile juurde. Kui järjekorras ootab mitu lõime, antakse neile juurdepääs rotatsiooni korras. Kui mutex vahetab ressursile juurdepääsu mitme lõime vahel, on see nähtav, kuna mitu lõime kasutavad ressurssi korraga. Kuid sisemiselt pääseb ressursile teatud aja jooksul juurde ainult üks teema.
Mis vahe on Semaforil ja Mutexil??
Ehkki paralleelsetes programmeerimiskeskkondades kasutatakse vastastikuse välistamise saavutamiseks nii semafoore kui ka mutex-objekte, on neil mõningaid erinevusi. Mutex-objekt lubab ressursil või kriitilisel lõigul tarbida ainult ühte lõime, samas kui semafoorid võimaldavad piiratud arvu samaaegseid juurdepääsu ressurssidele (maksimaalse lubatud arvu piires). Mutex-objektide korral peavad muud ressursile juurde pääsevad lõimed ootama järjekorras, kuni praegune lõim on ressursi abil lõpule viidud.