А.В. Столяров - Введение в операционные системы (1114673), страница 34
Текст из файла (страница 34)
Îïåðàöèÿ ìîæåò áûòü ðåàëèçîâàíà êàê áóëåâñêàÿ ôóíêöèÿ. Ïðè ïðèìåíåíèè åå ê îòêðûòîìó ìüþòåêñó îíà çàêðûâàåò åãî è âîçâðàùàåò çíà÷åíèå èñòèíà (óñïåõ). Ïðè ïðèìåíåíèè ê çàêðûòîìó ìüþòåêñó ôóíêöèÿâîçâðàùàåò çíà÷åíèå ëîæü (íåóäà÷à). Òàêîé âàðèàíò ðåàëèçàöèè íàçûâàåòñÿ íåáëîêèðóþùèì.2.
Îïåðàöèþ ìîæíî ðåàëèçîâàòü è êàê ïðîöåäóðó, íå âîçâðàùàþùóþ íèêàêîãî çíà÷åíèÿ.  ýòîì ñëó÷àå ïðè ïðèìåíåíèè åå ê îòêðûòîìó ìüþòåêñó îíà çàêðûâàåò åãî è âîçâðàùàåò óïðàâëåíèå; ïðè ïðèìåíåíèè åå êçàêðûòîìó ìüþòåêñó îíà áëîêèðóåò âûçâàâøèé ïðîöåññ äî òåõ ïîð, ïîêà ìüþòåêñ íå îêàæåòñÿ îòêðûò, ïîñëå ÷åãî çàêðûâàåò åãî è âîçâðàùàåòóïðàâëåíèå.Âàæíåéøèì ñâîéñòâîì îïåðàöèé lock() è unlock() ÿâëÿåòñÿ èõàòîìàðíîñòü .Ýòî îçíà÷àåò, ÷òî îáå îïåðàöèè âûïîëíÿþòñÿ êàê åäèíîå5 Êîíå÷íî,ñëîæíîñòü àòîìàðíûõ îïåðàöèé äîëæíà îñòàâàòüñÿ â ðàçóìíûõ ïðåäåëàõ, ò.ê. äëèòåëüíûéçàïðåò ïðåðûâàíèé ìîæåò îòðèöàòåëüíî ñêàçàòüñÿ íà ôóíêöèîíèðîâàíèè âñåé âû÷èñëèòåëüíîé ñèñòåìû:íàïðèìåð, ìîãóò ñáèòüñÿ îïåðàöèè ÷òåíèÿ/çàïèñè äèñêîâ, è ò.ï.6 Àíãë.
mutex − ñîêðàùåíèå îò ñëîâ mutual exception156öåëîå è íå ìîãóò áûòü ïðåðâàíû7 .  ÷àñòíîñòè, îïåðàöèÿ lock() íå ìîæåòáûòü ïðåðâàíà ìåæäó ïðîâåðêîé òåêóùåãî çíà÷åíèÿ ìüþòåêñà è èçìåíåíèåìýòîãî çíà÷åíèÿ íà çàêðûòî.Âñïîìíèì òåïåðü íàøó ïîïûòêó âûïîëíèòü âçàèìîèñêëþ÷åíèå ñ ïîìîùüþ áëîêèðîâî÷íîé ïåðåìåííîé (27.3.1). Èñïîëüçóåì âìåñòî îáû÷íîé ïåðåìåííîé ìüþòåêñ (îáîçíà÷èì åãî, êàê è áëîêèðîâî÷íóþ ïåðåìåííóþ, áóêâîés), à âìåñòî ïðèñâàèâàíèé s = 0 è s = 1 − ñîîòâåòñòâåííî îïåðàöèè lock()è unlock().
Ðàññìîòðèì äëÿ íà÷àëà íåáëîêèðóþùóþ ðåàëèçàöèþ lock():while(!lock(s)) {} /* æäåì, ïîêà íå óäàñòñÿ çàêðûòü ìüþòåêñ */section();/* ... ðàáîòà ñ ðàçäåëÿåìûìè äàííûìè ... */unlock(s);/* ðàçðåøàåì äðóãèì ïðîöåññàì äîñòóï */ îòëè÷èå îò âàðèàíòà ñ èñïîëüçîâàíèåì áëîêèðóþùåé ïåðåìåííîé, äàííûéâàðèàíò ÿâëÿåòñÿ êîððåêòíûì. Ïîñêîëüêó îïåðàöèÿ lock() àòîìàðíà, âûõîäèç öèêëà (ïî èñòèííîìó çíà÷åíèþ ôóíêöèè lock()) îçíà÷àåò, ÷òî â íåêèéìîìåíò ìüþòåêñ îêàçàëñÿ îòêðûò (òî åñòü íèêòî â ýòî âðåìÿ íå ðàáîòàë ñðàçäåëÿåìûìè äàííûìè), è íàøåìó ïðîöåññó óäàëîñü åãî çàêðûòü, ïðè÷åìíèêòî äðóãîé âêëèíèòüñÿ ìåæäó ïðîâåðêîé è çàêðûòèåì íå ìîã.Åñëè ïðèìåíèòü âòîðîé òèï ðåàëèçàöèè îïåðàöèè lock() (ïðè êîòîðîìîíà áëîêèðóåòñÿ äî òåõ ïîð, ïîêà íå óäàñòñÿ çàêðûòü îòêðûòûé ìüþòåêñ),íàø êîä ñòàíåò åùå ïðîùå, è èç íåãî èñ÷åçíåò öèêë àêòèâíîãî îæèäàíèÿ:lock(s);section();unlock(s);/* æäåì, ïîêà íå óäàñòñÿ çàêðûòü ìüþòåêñ *//* ...
ðàáîòà ñ ðàçäåëÿåìûìè äàííûìè ... *//* ðàçðåøàåì äðóãèì ïðîöåññàì äîñòóï */ßñíî, ÷òî òàêîé ìüþòåêñ ìîæåò áûòü ðåàëèçîâàí òîëüêî ïðè ñîäåéñòâèè ÿäðà îïåðàöèîííîé ñèñòåìû: ëèáî öåëèêîì êàê îáúåêò ÿäðà, ëèáî êàê íàáîðîïåðàöèé, îñóùåñòâëÿåìûõ ÿäðîì íàä ïåðåìåííîé, ðàñïîëîæåííîé â ïîëüçîâàòåëüñêîì ïðîöåññå8 . Îòìåòèì ñ äðóãîé ñòîðîíû, ÷òî ââåäåíèå òàêîãî ñðàâíèòåëüíî ïðîñòîãî ñåðâèñà â ÿäðå ÎÑ ïîçâîëÿåò èçáàâèòüñÿ ðàçîì îò âñåõíåäîñòàòêîâ ðàññìîòðåííûõ âûøå ïîäõîäîâ ê âçàèìíîìó èñêëþ÷åíèþ.27.4.3Ñåìàôîðû ÄåéêñòðûÏðåäëîæåííûå Ýäñãåðîì Äåéêñòðîé ñåìàôîðû ïðåäñòàâëÿþò ñîáîé îáîáùåíèå ïîíÿòèÿ ìüþòåêñà.7 Êðîìåñëó÷àÿ, êîãäà îïåðàöèÿ lock() áëîêèðóåò âûçâàâøèé ïðîöåññ − òîãäà íà âðåìÿ áëîêèðîâêèïðåðûâàíèÿ ðàçðåøàþòñÿ8 Êàê ìû óâèäèì èç äàëüíåéøåãî, ìüþòåêñ, â êîòîðîì lock() ñäåëàí íåáëîêèðóþùèì, ìîæíî ðåàëèçîâàòü íà íåêîòîðûõ àðõèòåêòóðàõ è áåç ó÷àñòèÿ ÿäðà157â êëàññè÷åñêîì âàðèàíòå ïðåäñòàâëÿåò ñîáîé öåëî÷èñëåííóþ ïåðåìåííóþ, ïðî êîòîðóþ èçâåñòíî, ÷òî îíà ïðèíèìàåò òîëüêîíåîòðèöàòåëüíûå çíà÷åíèÿ, è íàä êîòîðîé îïðåäåëåíû äâå îïåðàöèè: up() èdown().
Îïåðàöèÿ up() âñåãäà ïðîõîäèò óñïåøíî, óâåëè÷èâàÿ çíà÷åíèå ïåðåìåííîé íà 1, è íåìåäëåííî âîçâðàùàåò óïðàâëåíèå. Îïåðàöèÿ down() äîëæíà,íàîáîðîò, óìåíüøàòü çíà÷åíèå íà 1, íî ñäåëàòü ýòî îíà ìîæåò òîëüêî â ñëó÷àå,åñëè òåêóùåå çíà÷åíèå ñòðîãî áîëüøå íóëÿ, âåäü çíà÷åíèå ñåìàôîðà íå ìîæåòáûòü îòðèöàòåëüíûì. Ñîîòâåòñòâåííî, ïðè ïîëîæèòåëüíîì çíà÷åíèè ñåìàôîðà îïåðàöèÿ down() óìåíüøàåò åãî çíà÷åíèå íà 1 è íåìåäëåííî âîçâðàùàåòóïðàâëåíèå.  ñëó÷àå æå íóëåâîãî çíà÷åíèÿ ñåìàôîðà îïåðàöèÿ áëîêèðóåòâûçâàâøèé ïðîöåññ äî òåõ ïîð, ïîêà çíà÷åíèå íå ñòàíåò ïîëîæèòåëüíûì, ïîñëå ÷åãî óìåíüøàåò çíà÷åíèå è âîçâðàùàåò óïðàâëåíèå.Ñåìàôîð ÄåéêñòðûÊàê è â ñëó÷àå ñ ìüþòåêñîì, îïåðàöèè íàä ñåìàôîðîì îáÿçàòåëüíî äîëæíû áûòü ðåàëèçîâàíû àòîìàðíî: íåîáõîäèìî ïîëíîñòüþ èñêëþ÷èòü ñèòóàöèè, êîãäà ðåçóëüòàò íåñêîëüêèõ íåçàâèñèìûõ îïåðàöèé íàä ñåìàôîðîì ìîæåò çàâèñåòü îò âðåìåíè âûçîâà îïåðàöèé ïðîöåññàìè (êàê ýòî ïðîèñõîäèëîâ ïðèìåðå, ïðèâåäåííîì â íà÷àëå ëåêöèè).
Ñåìàôîð, êàê è ìüþòåêñ, ìîæåòáûòü ðåàëèçîâàí öåëèêîì êàê îáúåêò ÿäðà, ëèáî êàê íàáîð îïåðàöèé ÿäðàíàä ïåðåìåííîé èç ïàìÿòè ïîëüçîâàòåëüñêîãî ïðîöåññà.ßñíî, ÷òî ñ ïîìîùüþ ñåìàôîðà ìîæíî èìèòèðîâàòü ôóíêöèîíèðîâàíèåìüþòåêñà, åñëè ñ÷èòàòü çíà÷åíèå 0 ñîñòîÿíèåì çàêðûò, çíà÷åíèå 1 − ñîñòîÿíèåì îòêðûò, à îïåðàöèè lock() è unlock() çàìåíèòü íà down() è up().Íåîáõîäèìî òîëüêî ñëåäèòü, ÷òîáû îïåðàöèÿ up() íèêîãäà íå ïðèìåíÿëàñü êïîëîæèòåëüíîìó ñåìàôîðó, à ýòîãî ìîæíî äîñòè÷ü, åñëè ïðèìåíÿòü îïåðàöèþup() òîëüêî â íà÷àëå ïðîãðàììû (îäèí ðàç), à òàêæå ïîñëå òîãî, êàê ïðîøëàîïåðàöèÿ down(), è íèêîãäà èíà÷å. Îäíàêî ñåìàôîð ìîæíî èñïîëüçîâàòü âáîëåå ñëîæíîé ðîëè, à èìåííî, êàê ñ÷åò÷èê äîñòóïíûõ ðåñóðñîâ.Íåêîòîðûå ðåàëèçàöèè îáîáùàþò îïåðàöèè íàä ñåìàôîðàìè, ââîäÿ äîïîëíèòåëüíûé öå-ëî÷èñëåííûé ïàðàìåòð.
Îïåðàöèÿ up(sem, n) óâåëè÷èâàåò çíà÷åíèå ñåìàôîðà íà n, îïåðàöèÿdown(sem, n) æäåò, ïîêà çíà÷åíèå íå îêàæåòñÿ áîëüøèì ëèáî ðàâíûì n, è ïîñëå ýòîãî óìåíüøàåò çíà÷åíèå íà n. Êðîìå òîãî, ðåàëèçàöèè îáû÷íî èìåþò íåáëîêèðóþùèé âàðèàíò îïåðàöèèdown(), àíàëîãè÷íûé íàøåé îïåðàöèè lock() äëÿ ìüþòåêñîâ, ðåàëèçîâàííîé â âèäå ëîãè÷åñêîé ôóíêöèè.  îòëè÷èå îò êëàññè÷åñêîãî âàðèàíòà, ýòîò âàðèàíò âìåñòî îæèäàíèÿ ñðàçóâîçâðàùàåò óïðàâëåíèå, óêàçûâàÿ, ÷òî îïåðàöèÿ ïðîøëà íåóäà÷íî. Áîëüøèíñòâî ñóùåñòâóþùèõ ðåàëèçàöèé ïîçâîëÿåò óçíàòü òåêóùåå çíà÷åíèå ñåìàôîðà èëè äàæå óñòàíîâèòü åãî áåçâñÿêèõ áëîêèðîâîê è ïðîâåðîê, ÷òî áûâàåò óäîáíî ïðè èíèöèàëèçàöèè ïðîãðàììû.Èçâåñòíàÿ ðåàëèçàöèÿ ñåìàôîðîâ èç System V IPC (ñì. [5]) ïðåäîñòàâëÿåò ìàññèâû ñåìàôîðîâ, íàä êîòîðûìè ìîæíî ïðîèçâîäèòü ñëîæíûå àòîìàðíûå îïåðàöèè, íàïðèìåð, óâåëè÷èòüòðåòèé ñåìàôîð íà äâà, à ÷åòâåðòûé óìåíüøèòü íà òðè çà îäíî (àòîìàðíîå!) äåéñòâèå.
Êðîìå òîãî, â ýòîé ðåàëèçàöèè åñòü äîïîëíèòåëüíàÿ îïåðàöèÿ áëîêèðîâàòüñÿ, ïîêà ñåìàôîð íåñòàíåò ðàâåí íóëþ.15827.4.4Êîìàíäà TSLÍà íåêîòîðûõ àðõèòåêòóðàõ ìîæíî ðåàëèçîâàòü ìüþòåêñ áåç îáðàùåíèÿê ÿäðó. Äëÿ ýòîãî íåîáõîäèìà ïðîöåññîðíàÿ êîìàíäà TSL (test and set lock,ïðîâåðèòü è çàêðûòü). Êîìàíäà èìååò äâà îïåðàíäà: ðåãèñòð è àäðåñ â ïàìÿòè. Ñóòü êîìàíäû â òîì, ÷òîáû çà îäíî íåäåëèìîå (àòîìàðíîå) äåéñòâèåïîìåñòèòü â ðåãèñòð ñîäåðæèìîå ÿ÷åéêè ïàìÿòè, ðàñïîëîæåííîé ïî óêàçàííîìó àäðåñó, à â ñàìó ÿ÷åéêó çàíåñòè íåêîòîðîå ôèêñèðîâàííîå çíà÷åíèå,íàïðèìåð 1. Òàêèì îáðàçîì, ìîæíî â îäíî äåéñòâèå óñòàíîâèòü ïåðåìåííîéìüþòåêñó çíà÷åíèå (êîòîðîå áóäåò ñîîòâåòñòâîâàòü ñîñòîÿíèþ çàïåðò) èñîõðàíèòü äëÿ ïðîâåðêè òî çíà÷åíèå, êîòîðîå áûëî â ïåðåìåííîé-ìüþòåêñåðàíüøå. Åñëè ðàíüøå ìüþòåêñ ñîäåðæàë çíà÷åíèå îòêðûò − çíà÷èò, íàøàîïåðàöèÿ ïðîøëà óñïåøíî.
Åñëè æå çíà÷åíèå óæå áûëî çàêðûò, íåîáõîäèìî ïîäîæäàòü.Ðåàëèçàöèÿ ôóíêöèé lock() è unlock() íà àññåìáëåðå áóäåò âûãëÿäåòüïðèìåðíî òàê:mutex: DB 0lock:TSL RX, mutexCMP RX, 0JE okJMP lockok:RETunlock: MOV mutex, 0RETÊàê ìîæíî çàìåòèòü, çäåñü ìû ñíîâà âîçâðàùàåìñÿ ê àêòèâíîìó îæèäàíèþ.ßñíî, ÷òî îñóùåñòâèòü áëîêèðîâêó áåç ó÷àñòèÿ îïåðàöèîííîé ñèñòåìû íåâîçìîæíî. Îäíàêî ïðè íåêîòîðûõ óñëîâèÿõ â ïðîãðàììàõ, èñïîëüçóþùèõ ëåãêîâåñíûå ïðîöåññû (òðåäû), òàêàÿ ðåàëèçàöèÿ ìüþòåêñà9 îêàçûâàåòñÿ áîëååýôôåêòèâíîé çà ñ÷åò ýêîíîìèè íà ïåðåêëþ÷åíèè êîíòåêñòîâ (ñ ïðîöåññà íàÿäðî è îáðàòíî).Ïðè ðàáîòå ñ ëåãêîâåñíûìè ïðîöåññàìè ìîæíî ïåðåä ïåðåõîäîì íà íà÷àëî ïðîöåäóðûlock()(ò.å.
ñðàçó ïîñëå êîìàíäû óñëîâíîãî ïåðåõîäà) âñòàâèòü îáðàùåíèå ê ïðîöåäóðå ïåðå-êëþ÷åíèÿ ëåãêîâåñíûõ ïðîöåññîâ, ÷òîáû óìåíüøèòü ïîòåðè îò àêòèâíîãî îæèäàíèÿ.9Âàíãëîÿçû÷íîé ëèòåðàòóðå åå èíîãäà íàçûâàþòspinlock.159Ëåêöèÿ 13Íà ýòîé ëåêöèè ìû ðàññìîòðèì íåñêîëüêî êëàññè÷åñêèõ ïðèìåðîâ ïðîãðàììèðîâàíèÿ ñ èñïîëüçîâàíèåì ìüþòåêñîâ è ñåìàôîðîâ.2828.1Ïðèìåðû âçàèìîèñêëþ÷åíèéÇàäà÷à ïðîèçâîäèòåëåé è ïîòðåáèòåëåéÏóñòü èìåþòñÿ íåñêîëüêî ïðîöåññîâ, ïðîèçâîäÿùèõ äàííûå, ïîäëåæàùèåäàëüíåéøåé îáðàáîòêå.
Ýòî ìîãóò áûòü, íàïðèìåð, ïðîöåññû, îïðàøèâàþùèåêàêèå-ëèáî äàò÷èêè; òàêæå ýòî ìîãóò áûòü ïðîöåññû, ïîëó÷àþùèå îïðåäåëåííûå äàííûå ïî ñåòè ñ äðóãèõ ìàøèí è ïðåîáðàçóþùèå èõ â íåêîòîðîåâíóòðåííåå ïðåäñòàâëåíèå; âîçìîæíî, ÷òî äàííûå ïîëó÷àþòñÿ â ðåçóëüòàòåèíòåðàêòèâíîãî âçàèìîäåéñòâèÿ ñ ïîëüçîâàòåëåì èëè, íàîáîðîò, âû÷èñëÿþòñÿ â õîäå ìàòåìàòè÷åñêèõ ðàñ÷åòîâ.