Семафорлар

1965 жылы Дейкстра(Dijkstra) процесстердің синхрондалуын жүргізетін механизмдердің бірі семафораны сипаттап берді. Семафор өзі теріс емес мәндерді қабылдайтын бүтін айнымалыны көрсетеді, оның инициализацияланған моменттен басқа кез келген процесстің қол жеткізуі екі атомарлық операциялар арқылы жүзеге асады: P ( дат тілінен аударғанда proberen – тексеру) және V (verhogen – арттыру). Бұлардың классикалық түрдегі сипаттамасы мынадай: P(S): S 0 болғанша процесс блокталады; S = S – 1; V(S): S = S + 1; Бұл жазудың түсіндірмесі: S семефорына P операциясының орындалуы кезінде бірінші оның мәні тесеріледі. Егер ол 0 ден үлкен болса, онда S тан 1 алынады. Егер ол кіші немесе тең 0 ге болса, процесс S 0 ден үлкен болғанға дейін блокталынады, содан кейін S тан 1алынады. S семефорына V операциясының орындалуы кезінде оның мәніне 1 қосылады. Құрылған кезде семафор кез келген теріс емес мәнмен инициялизияланған болуы мүмкін. Осындай айнымалы семафорлар процесстердің өзара байланысын ұйымдастырудағы есептер үшін қолданылуы мүмкін. Програмамалау тілінде ол мысалға, ALGOL-68 тілінің синтаксисына енгізілген болатын, ал басқа жағдайларда арнайы жүйелік шақырулар арқылы жүзеге асырылады. Осы бүтін айнымалы операциялық жүйенің ядросының адрестік кеңістігінде жайғасады. Операциялық жүйе P және V операцияларының атомарлығын қамтамасыз етеді, мысалға, сәйкес келетін жүйелік шақырулардың орындалуы кезінде үзілісті болдырмау әдісі. Егер P операцясының орындалу кезінде бірнеше операция блокталып қалса, онда оларды блоктан алып тастау еркімен болуы мүмкін, мысалға FIFO. Producer-consumer мәселесін семафорлар арқылы шешу. Процестердің өзара байланысын ұйымдастыруды қажет ететін есептердің бірі producer-consumer (өндіруші-тұтынушы) есебі. Екі процесс шектелген өлшемі бар буфер арқылы ақпаратпен алмасып жатыр делік. Өндіруші буферге ақпаратты салады, ал тұтынушы одан ақпаратты алады. Бұл деңгейде мына түрде жазуға болады: Producer: while(1) { produce_item; put_item; } Consumer: while(1) { get_item; consume_item; } Егер буфер толық болса, онда өндіруші жаңа ақпаратқа орын табылғанша күтуі қажет. Ал егер буфер бос болса, тұтынушы жаңа хатты күтуі қажет. Бұл шарттарды семафорлар арқылы қалай жүзеге асыруға болады? Empty, full и mutex деген үш семафор алайық. Full семафорын тұтынушы буферде ақпарат келгенше күтуі үшін қолданайық. Empty семафорын буфер толып қалған кездегі өндірушінің күтуін ұйымдастыру үшін қолданайық, ал mutex семафорасын критикалық облыстардағы өзара шығаруды ұйымдастыру үшін, бұл іс әрекеттер put_item и get_item ( "ақпаратты салу" және "ақпаратты алу" қиылыса алмайды, бұл жағдайда ақпараттың бұзылуы болуы мүмкін). C-тілінде жүзеге асырылуы: Semaphore mutex 1; Semaphore empty N; /* где N – емкость буфера*/ Semaphore full = 0; Producer: while(1) { produce_item; P(empty); P(mutex); put_item; V(mutex); V(full); } Consumer: while(1) { P(full); P(mutex); get_item; V(mutex); V(empty); consume_item; } Сонымен семафорлар бұл жерде екі мақсатта қолданды: критикалық облыста өзара шығаруды ұйымдастыруы үшін және процестердің жұмысының жылдамдығының өзара синхрондалуы үшін. Дереккөздер 1. http://os-pc.ru/proc/122-semafory.html 2. http://www.intuit.ru/department/os/osintro/6/#sect4 3. http://cs.mipt.ru/docs/courses/osstud/06/ch6.html