Semaforas ir „Mutex“
Semaforas yra duomenų struktūra, naudojama užtikrinti, kad keli procesai nepatektų prie bendro šaltinio ar kritinio skyriaus tuo pačiu metu, lygiagrečiose programavimo aplinkose. Semaforai naudojami siekiant išvengti negyvų spynų ir lenktynių sąlygų. „Mutex“ (savitarpio išskyrimo objektas) taip pat naudojamas siekiant išvengti prieigos prie bendro šaltinio tuo pačiu metu keliais vienalaikiais procesais.
Kas yra semaforas?
Semaforas yra duomenų struktūra, naudojama abipusiam kritinių skyrių atskyrimui užtikrinti. Semaforos daugiausia palaiko dvi operacijas, vadinamas palaukimu (istoriškai žinomu kaip P) ir signalu (istoriškai žinomu kaip V). Laukimo operacija blokuoja procesą, kol atidaromas semaforas, o signalo operacija leidžia patekti kitam procesui (gijai). Kiekvienas semaforas yra susijęs su laukimo procesų eiga. Kai laukimo operacija iškviečiama sriegiu, jei semaforas atidarytas, sriegis gali tęstis. Jei semaforas uždaromas, kai laukimo operacija iškviečiama sriegiu, siūlas užblokuojamas ir jis turi laukti eilėje. Signalo operacija atidaro semaforą ir, jei eilėje jau laukiama gijų, šiam procesui leidžiama tęsti, o jei eilėje nėra siūlų, signalas atsimenamas kitiems gijams. Yra dviejų tipų semaforos, vadinamos mutex semaforomis ir skaičiuojančiomis semaforomis. „Mutex“ semaforos suteikia galimybę vienkartine prieiga prie resurso, o skaičiuojant semaforomis, prieiga prie šaltinio leidžiama kelioms sriegoms (kuriose yra keli vienetai).
Kas yra „Mutex“?
Paleidus kompiuterio programą, ji sukurs „mutex“ ir pridės ją prie šaltinio. Kai resursą naudoja gija, jis yra užrakintas, o kiti gijos negali jo naudoti. Jei kita gija nori naudoti tą patį šaltinį, ji turės pateikti prašymą. Tuomet šis siūlas bus dedamas į eilę, kol pirmasis resursas bus baigtas. Kai pirmasis šaltinis bus baigtas su šaltiniu, užraktas bus pašalintas, o eilutėje laukiantis siūlas gali gauti prieigą prie šaltinio. Jei eilėje laukia keli gijos, jiems suteikiama prieiga besisukančia tvarka. Praktiškai, kai „mutex“ pakaitomis pateks į išteklius iš kelių gijų, jis bus matomas, nes keli gijos sunaudoja išteklius tuo pačiu metu. Tačiau tam tikru metu išteklius gali pasiekti tik viena gija.
Kuo skiriasi „Semaphore“ ir „Mutex“?
Nors ir semaforai, ir mutex objektai yra naudojami abipusiam atskirties lygiagrečiam programavimo aplinkai pasiekti, jie turi tam tikrų skirtumų. „Mutex“ objektas leidžia tik vienai gijai sunaudoti išteklius ar kritinę sekciją, tuo tarpu semaforos leidžia ribotą skaičių prieigų prie išteklių vienu metu (neviršijant didžiausio leidžiamo skaičiaus). Naudojant „mutex“ objektus, kiti gijos, norintys pasiekti išteklius, turi laukti eilėje, kol dabartinis gija bus baigta naudojant išteklius.