А.В. Столяров - Введение в операционные системы (1114673), страница 29
Текст из файла (страница 29)
ìû èõ äàæå íå ïðî÷èòàåì.Ñ äðóãîé ñòîðîíû, åñëè ïîïûòàòüñÿ ïðîèçâåñòè ÷òåíèå ñ òîãî èëè èíîãîêëèåíòñêîãî ñîêåòà, åñòü ðèñê, ÷òî êëèåíò ïî êàêèì-ëèáî ïðè÷èíàì íå ïðèøëåò íàì íèêàêèõ äàííûõ â òå÷åíèå äëèòåëüíîãî ïåðèîäà âðåìåíè. Âñå ýòîâðåìÿ íàøà ïðîãðàììà áóäåò íàõîäèòüñÿ âíóòðè âûçîâà read() èëè recv(),íå âûïîëíÿÿ íèêàêîé ðàáîòû, â òîì ÷èñëå íå ïðèíèìàÿ íîâûõ ñîåäèíåíèé èíå îáðàáàòûâàÿ äàííûå, ïîñòóïèâøèå îò äðóãèõ (óæå ïðèñîåäèíåííûõ) êëèåíòîâ.Ïðîèëëþñòðèðîâàòü ïðîáëåìó ìîæíî íà ïðèìåðå èç ñîâñåì íåêîìïüþòåðíîé îáëàñòè. Ïðåäñòàâèì ñåáå îáûêíîâåííûé ðåñòîðàí, òîëüêî î÷åíü äîðîãîé,â êîòîðîì êàæäûé ñòîëèê ðàçìåùåí â îòäåëüíîé êàáèíêå, òàê ÷òî, â êàêîìáû ìåñòå ìû íè ñòîÿëè, íåëüçÿ îäíîâðåìåííî óâèäåòü âñå ñòîëèêè è âõîäíûåäâåðè.Ïðåäñòàâèì ñåáå òåïåðü, ÷òî íà âåñü ðåñòîðàí åñòü òîëüêî îäèí îôèöèàíò,èñïîëíÿþùèé åùå è îáÿçàííîñòè ìåòðîäîòåëÿ.
 íàøåé àíàëîãèè îôèöèàíòáóäåò èãðàòü ðîëü ïðîöåññà.Ñðàçó ïîñëå îòêðûòèÿ ðåñòîðàíà îôèöèàíò, åñòåñòâåííî, ïîäîéäåò ê âõîäíûì äâåðÿì è áóäåò ïîäæèäàòü íîâûõ êëèåíòîâ (âûçîâ accept()), ÷òîáû,âñòðåòèâ èõ, ïðîâîäèòü èõ ê ñòîëèêó. Îäíàêî ñðàçó ïîñëå òîãî, êàê ïåðâûå132êëèåíòû çàéìóò ñòîëèê è ïðèìóòñÿ èçó÷àòü ìåíþ, îôèöèàíò îêàæåòñÿ ïåðåäïðîáëåìîé: ñëåäóåò ëè åìó ñòîÿòü îêîëî ñòîëèêà â îæèäàíèè, ïîêà êëèåíòûîïðåäåëÿòñÿ ñ çàêàçîì, èëè æå ñëåäóåò ïîéòè ê äâåðÿì ïðîâåðèòü, íå ïðèøåëëè åùå êòî-íèáóäü.Êîãäà æå êëèåíòîâ çà ñòîëèêàìè ñòàíåò ìíîãî, îôèöèàíòó è âîâñå ïðèäåòñÿ òÿæåëî. Âåäü êàæäîìó êëèåíòó çà ëþáûì èç ñòîëèêîâ â ëþáîé ìîìåíò ìîæåò ÷òî-òî ïîíàäîáèòüñÿ − îí ìîæåò ðåøèòü çàêàçàòü åùå êàêîå-ëèáî áëþäî,ìîæåò ñëó÷àéíî óðîíèòü íà ïîë âèëêó è ïîïðîñèòü ïðèíåñòè íîâóþ, ìîæåò,íàêîíåö, ðåøèòü, ÷òî åìó ïîðà èäòè, è ïîòðåáîâàòü ñ÷åò.
Ñ äðóãîé ñòîðîíû,â ëþáîé ìîìåíò ìîãóò ïðèéòè è íîâûå êëèåíòû, è åñëè íèêòî íå âñòðåòèòèõ ó äâåðåé, îíè ìîãóò îáèäåòüñÿ è óéòè, à ðåñòîðàí íåäîïîëó÷èò äåíåã. Íàïîìíèì, ÷òî ïî óñëîâèÿì íàøåé àíàëîãèè îôèöèàíò íå ìîæåò íàéòè òàêîåìåñòî â ðåñòîðàíå, îòêóäà áûëî áû âèäíî è ñòîëèêè, è âõîäíûå äâåðè; òî÷íååãîâîðÿ, èç ëþáîãî ìåñòà âèäíî ëèáî îäèí ñòîëèê (íî íå áîëüøå), ëèáî äâåðè,ëèáî âîîáùå íè òî, íè äðóãîå.Ñàìîå ïðîñòîå ðåøåíèå, ïðèõîäÿùåå â ãîëîâó − ýòî áåãàòü ïî âñåìó ðåñòîðàíó, ïîäáåãàÿ ïî î÷åðåäè ê êàæäîìó èç ñòîëèêîâ, à òàêæå è ê äâåðÿì,óçíàâàòü, ÷òî âíèìàíèå îôèöèàíòà òàì íå òðåáóåòñÿ è èäòè, âåðíåå, áåæàòüíà ñëåäóþùèé êðóã. Àíàëîãè÷íîå ðåøåíèå âîçìîæíî è äëÿ íàøåãî ïðîöåññà.
Ìîæíî ñ ïîìîùüþ âûçîâà fcntl() ïåðåâåñòè âñå ñîêåòû (è ñëóøàþùèé, è êëèåíòñêèå) â íåáëîêèðóþùèé ðåæèì, ïðè êîòîðîì âûçîâû read() èaccept() âñåãäà âîçâðàùàþò óïðàâëåíèå íåìåäëåííî, íè÷åãî íå îæèäàÿ (åñëè íå áûëî äàííûõ èëè âõîäÿùåãî ñîåäèíåíèÿ, âîçâðàùàåòñÿ îøèáêà). Ïîñëåýòîãî ìîæíî íà÷àòü èõ îïðàøèâàòü ïî î÷åðåäè â áåñêîíå÷íîì öèêëå. Ýòîíàçûâàåòñÿ àêòèâíûì îæèäàíèåì.Ñëåäóåò îòìåòèòü, ÷òî òàêîé âàðèàíò ñ÷èòàåòñÿ ñîâåðøåííî íåïðèåìëåìûì â ìíîãîçàäà÷íûõ ñèñòåìàõ. Àíàëîãè÷íî òîìó, êàê îôèöèàíò áóäåò ïîïóñòó óñòàâàòü, âõîëîñòóþ íàðåçàÿ êðóãè ïî ðåñòîðàíó (âïîëíå âîçìîæíî, ÷òîçà íåñêîëüêî òàêèõ êðóãîâ îò íåãî íè÷åãî íèêîìó òàê è íå ïîíàäîáèòñÿ) èâ èòîãå, ñêîðåå âñåãî, ïîïðîñòó óïàäåò îò ïåðåóòîìëåíèÿ, ïðîöåññ, áåñêîíå÷íî îïðàøèâàþùèé íàáîð ñîêåòîâ ñ ïîìîùüþ ñèñòåìíûõ âûçîâîâ, òîæå áóäåòâõîëîñòóþ òðàòèòü ðåñóðñû.
Êîíå÷íî, â îòëè÷èå îò îôèöèàíòà ïðîöåññ íåóñòàíåò, íî îí ïðè ýòîì áóäåò ïðîíàïðàñíó ðàñõîäîâàòü ïðîöåññîðíîå âðåìÿ,êîòîðîå ìîãëî áû ïðèãîäèòüñÿ äðóãèì çàäà÷àì.  íåêîòîðûõ ñèñòåìàõ ïðîöåññ ìîæåò èñ÷åðïàòü ñâîé ëèìèò ïðîöåññîðíîãî âðåìåíè è áóäåò ïîïðîñòóóíè÷òîæåí ÿäðîì. Ïðîáëåìà äåéñòâèòåëüíî ñåðüåçíà: íåêîòîðûå ñåðâåðà ìîãóò ñóòêàìè íàõîäèòüñÿ â áåçäåéñòâèè, è áûëî áû î÷åíü ñòðàííî, åñëè áûâñå ýòî âðåìÿ ïðîãðàììà, êîòîðàÿ ñîâåðøåííî íè÷åãî íå äåëàåò, çàíèìàëà áûïðîöåññîð.133Äðóãîå ðåøåíèå (äëÿ ðåñòîðàíà) ñîñòîèò â òîì, ÷òîáû íàíÿòü â ðåñòîðàíàäåêâàòíîå êîëè÷åñòâî ïåðñîíàëà.
Âî-ïåðâûõ, ðàçóìååòñÿ, ó äâåðåé äîëæåíñòîÿòü ìåòðîäîòåëü, íåìåäëåííî âñòðå÷àÿ êàæäûõ ïðèõîäÿùèõ êëèåíòîâ èïðîâîäÿ èõ ê ñâîáîäíîìó ñòîëèêó. Âî-âòîðûõ, äîðîãîé ðåñòîðàí âïîëíå ìîæåò ñåáå ïîçâîëèòü ïðèêðåïèòü ê êàæäîìó ñòîëèêó ñâîåãî îôèöèàíòà. Àíàëîãè÷íûì îáðàçîì ïðè íàïèñàíèè ñåðâåðíîé ïðîãðàììû ìû ìîæåì ñîçäàòüîòäåëüíûé ïðîöåññ äëÿ îáñëóæèâàíèÿ êàæäîãî ïðèøåäøåãî êëèåíòà.Åñëè æå ýòîò âàðèàíò íåïðèåìëåì (íàïðèìåð, åñëè áîëüøóþ ÷àñòü âðåìåíè âåñü ïåðñîíàë âñå ðàâíî ïðîñòàèâàåò), ìîæíî ñäåëàòü è èíà÷å. Îôèöèàíòìîæåò, íàðåçàâ ïàðî÷êó êðóãîâ, ñîîáðàçèòü, ÷òî òàê äåëî íå ïîéäåò è, íàïðèìåð, ïîäâåñèòü êîëîêîëü÷èê ê âõîäíûì äâåðÿì, à êàæäûé ñòîëèê ñíàáäèòüêíîïêîé çâîíêà. Ïîñëå ýòîãî ìîæíî áóäåò ñïîêîéíî óñåñüòüñÿ â óêðîìíûéóãîë è ñïàòü (èëè, íàïðèìåð, ðàçãàäûâàòü êðîññâîðä), ïîêà îäèí èç êîëîêîëü÷èêîâ èëè çâîíêîâ íå çàçâîíèò.
Ïîñêîëüêó ðåñòîðàí èìååò ñâîéñòâî âíåêèé ìîìåíò çàêðûâàòüñÿ, â äîïîëíåíèå ê ýòèì çâîíêàì ñëåäóåò, âèäèìî,çàâåñòè åùå è áóäèëüíèê íà îïðåäåëåííîå âðåìÿ. Àíàëîãè÷íûé âàðèàíò âïðîãðàììèðîâàíèè íàçûâàåòñÿ ìóëüòèïëåêñèðîâàíèåì ââîäà-âûâîäà.Ðàññìîòðèì äâà ïîñëåäíèõ âàðèàíòà ïîäðîáíåå.24.2Ðåøåíèå íà îñíîâå îáñëóæèâàþùèõ ïðîöåññîâ ýòîì âàðèàíòå íàø ãëàâíûé ïðîöåññ âûïîëíÿåò îáÿçàííîñòè ìåòðîäîòåëÿ, íàõîäÿñü áîëüøóþ ÷àñòü âðåìåíè â âûçîâå accept(). Ïðèíÿâ î÷åðåäíîå ñîåäèíåíèå, ìåòðîäîòåëü ïîðîæäàåò äî÷åðíèé ïðîöåññ (îôèöèàíòà)äëÿ îáñëóæèâàíèÿ äàííîãî ñîåäèíåíèÿ.
Ïîñëå ïîðîæäåíèÿ ðîäèòåëüñêèé ïðîöåññ çàêðûâàåò ñîêåò êëèåíòñêîãî ñîåäèíåíèÿ, à äî÷åðíèé ïðîöåññ çàêðûâàåòñëóøàþùèé ñîêåò. Ñîîòâåòñòâåííî, âñå îáÿçàííîñòè ïî îáñëóæèâàíèþ ïðèøåäøåãî êëèåíòà âîçëàãàþòñÿ íà äî÷åðíèé ïðîöåññ; ïîñëå çàâåðøåíèÿ ñåàíñàñâÿçè ñ êëèåíòîì äî÷åðíèé ïðîöåññ çàâåðøàåòñÿ. Âñå ýòî âðåìÿ ðîäèòåëüñêèé ïðîöåññ áåñïðåïÿòñòâåííî ïðîäîëæàåò èñïîëíÿòü îáÿçàííîñòè ìåòðîäîòåëÿ, âûçûâàÿ accept().Ñîîòâåòñòâóþùèé êîä áóäåò âûãëÿäåòü ïðèìåðíî òàê:int ls;struct sockaddr_in addr;ls = socket(AF_INET, SOCK_STREAM, 0);if(ls == -1){ /* ...
îøèáêà ... */ }addr.sin_family = AF_INET;addr.sin_port = htons(port);134addr.sin_addr.s_addr = INADDR_ANY;if(-1 == bind(ls, &addr, sizeof(addr)){ /* ... îøèáêà ... */ }for(;;) {socklen_t slen = sizeof(addr);int cls = accept(ls, &addr, &slen);if(fork() == 0) { /* äî÷åðíèé ïðîöåññ */close(ls);/* ...ðàáîòàåì ñ êëèåíòîì ÷åðåç ñîêåò clsÊëèåíò ïðèøåë ñ àäðåñà, õðàíÿùåãîñÿòåïåðü â ñòðóêòóðå addr...*/exit(0);}/* ðîäèòåëüñêèé ïðîöåññ */close(cls);/* ïðîâåðèòü, íå çàâåðøèëèñü ëè êàêèå-ëèáîäî÷åðíèå ïðîöåññû (óáðàòü çîìáè) */while(wait4(-1, NULL, WNOHANG, NULL)>0);/* òåëî öèêëà ïóñòîå */}24.3Ìóëüòèïëåêñèðîâàíèå ââîäà-âûâîäà. Ñîáûòèéíîóïðàâëÿåìîå ïðîãðàììèðîâàíèåÐàññìîòðèì òåïåðü ñëó÷àé, êîãäà ïîðîæäåíèå îòäåëüíîãî ïðîöåññà íàêàæäîå êëèåíòñêîå ñîåäèíåíèå íåïðèåìëåìî.
Ýòî ìîæåò ïîëó÷èòüñÿ â ñëó÷àå, åñëè ñåðâåð äîñòàòî÷íî ñåðüåçíî çàãðóæåí: îïåðàöèÿ ïîðîæäåíèÿ ïðîöåññà ñðàâíèòåëüíî äîðîãà, òàê ÷òî ïðè çàãðóçêàõ ïîðÿäêà òûñÿ÷ ñîåäèíåíèéâ ñåêóíäó çàòðàòû íà ïîðîæäåíèå ïðîöåññîâ ìîãóò îêàçàòüñÿ íåïðèåìëåìûìè.Êðîìå òîãî, ìîæåò îêàçàòüñÿ, ÷òî ìåæäó ñåàíñàìè îáñëóæèâàíèÿ ðàçíûõ êëèåíòîâ ïðîèñõîäèò àêòèâíîå âçàèìîäåéñòâèå. Íàïðèìåð, ñåðâåð ìîæåòïîääåðæèâàòü êîìïüþòåðíóþ èãðó ïî ñåòè, òàê ÷òî äåéñòâèÿ êàæäîãî èãðîêàâëèÿþò íà ñèòóàöèþ â îäíîì èãðîâîì ïðîñòðàíñòâå è ñêàçûâàþòñÿ íà äðóãèõ èãðîêàõ.  ýòîì ñëó÷àå ðàçäåëåíèå ñåðâåðíîé ïðîãðàììû íà îòäåëüíûåïðîöåññû ïîòðåáóåò âûñîêèõ íàêëàäíûõ ðàñõîäîâ íà âçàèìîäåéñòâèå ìåæäóýòèìè ïðîöåññàìè; ê òîìó æå ïðîáëåìà î÷åðåäíîñòè äåéñòâèé âñòàíåò ñíîâà,135òîëüêî óæå â êàæäîì èç ïðîöåññîâ: äåéñòâèòåëüíî, ñëåäóåò ëè ïðîöåññó â êîíêðåòíûé ìîìåíò âðåìåíè àíàëèçèðîâàòü èçìåíåíèÿ â èãðå èëè æå ïðèíèìàòüäàííûå ñ êëèåíòñêîãî ñîêåòà?Èòàê, íåîáõîäèìî îñòàâèòü îáñëóæèâàíèå âñåõ êëèåíòîâ â ðàìêàõ îäíîãîïðîöåññà, ïðè÷åì àêòèâíîå îæèäàíèå, åñòåñòâåííî, ïðèåìëåìûì íå ñ÷èòàåòñÿ.Íà ïðîáëåìó ìîæíî âçãëÿíóòü è øèðå.
Åñòü íåêîòîðîå êîëè÷åñòâî òèïîâñîáûòèé, êàæäîå èç êîòîðûõ òðåáóåò ñâîåé îáðàáîòêè. Íåêîòîðûå ñèñòåìíûåâûçîâû, ïðåäíàçíà÷åííûå äëÿ îáðàáîòêè ñîáûòèé, èìåþò òàêîå ñâîéñòâî, ÷òî,áóäó÷è âûçâàííûìè äî íàñòóïëåíèÿ ñîáûòèÿ, îíè ýòîãî ñîáûòèÿ îæèäàþò,áëîêèðóÿ âûçâàâøèé ïðîöåññ è äåëàÿ, òàêèì îáðàçîì, íåâîçìîæíîé îáðàáîòêó äðóãèõ ñîáûòèé. Ñ äðóãîé ñòîðîíû, âîçìîæíî è òàêîå, ÷òî íè îäíî èçñîáûòèé â òå÷åíèå äîëãîãî ïåðèîäà âðåìåíè íå ïðîèçîéäåò. Ïðè ýòîì íåîáõîäèìî èñêëþ÷èòü õîëîñòîé ðàñõîä ïðîöåññîðíîãî âðåìåíè.Ïîëó÷àåòñÿ òàê, ÷òî íàì íåîáõîäèìà âîçìîæíîñòü îòäàòü óïðàâëåíèå îïåðàöèîííîé ñèñòåìå, îòêàçàâøèñü îò ïðîöåññîðíîãî âðåìåíè äî òåõ ïîð, ïîêàíå ïðîèçîéäåò îäíî èç èíòåðåñóþùèõ íàñ ñîáûòèé.
Íàñòóïëåíèå ñîáûòèÿ îïåðàöèîííàÿ ñèñòåìà äîëæíà îòñëåäèòü ñàìà è âåðíóòü óïðàâëåíèå ïðîöåññó,ïðè ýòîì, æåëàòåëüíî, ñîîáùèâ åìó î òîì, êàêîå èìåííî ñîáûòèå íàñòóïèëî. ÎÑ Unix òàêîé ìåõàíèçì ïðåäîñòàâëÿþò ñèñòåìíûå âûçîâû select()è poll()1 . Ìû áóäåì ðàññìàòðèâàòü âûçîâ select() êàê áîëåå ïðîñòîé; èçó÷èòü âûçîâ poll() ÷èòàòåëü ïðè æåëàíèè ìîæåò ñàìîñòîÿòåëüíî, ïðèáåãíóâê òåõíè÷åñêîé äîêóìåíòàöèè.Âûçîâ select() ïîçâîëÿåò îáðàáàòûâàòü ñîáûòèÿ òðåõ òèïîâ:• èçìåíåíèå ñîñòîÿíèÿ ôàéëîâîãî äåñêðèïòîðà (ïîÿâëåíèå äàííûõ, äîñòóïíûõ íà ÷òåíèå, èëè âõîäÿùåãî çàïðîñà íà ñîåäèíåíèå; îñâîáîæäåíèåìåñòà â áóôåðå èñõîäÿùåé èíôîðìàöèè; èñêëþ÷èòåëüíàÿ ñèòóàöèÿ);• èñòå÷åíèå çàäàííîãî êîëè÷åñòâà âðåìåíè ñ ìîìåíòà âõîäà â âûçîâ;• ïîëó÷åíèå ïðîöåññîì íåèãíîðèðóåìîãî ñèãíàëà.Ïðîôèëü âûçîâà âûãëÿäèò ñëåäóþùèì îáðàçîì:int select(int n, fd_setfd_setfd_setstruct*readfds,*writefds,*exceptfds,timeval *timeout);Ïàðàìåòðû readfds, writefds è exceptfds îáîçíà÷àþò ìíîæåñòâà ôàéëî1 Âîîáùåãîâîðÿ, select() è poll() ïðåäíàçíà÷åíû äëÿ îäíèõ è òåõ æå äåéñòâèé.
select() íåñêîëüêîïðîùå â ðàáîòå, poll() íåñêîëüêî áîëåå óíèâåðñàëåí.  íåêîòîðûõ ñèñòåìàõ ÿäðî ðåàëèçóåò òîëüêî îäèíâàðèàíò èíòåðôåéñà, ïðè ýòîì âòîðîé ýìóëèðóåòñÿ ÷åðåç íåãî â âèäå áèáëèîòå÷íîé ôóíêöèè. Òàê, â ñèñòåìå Solaris ïðèñóòñòâóåò ñèñòåìíûé âûçîâ poll(), à select() ÿâëÿåòñÿ áèáëèîòå÷íîé ôóíêöèåé. Êðîìåòîãî, â íåêîòîðûõ ñîâðåìåííûõ ñèñòåìàõ ïðèñóòñòâóåò òàêæå âûçîâ kqueue(), ðåàëèçóþùèé àëüòåðíàòèâíûé ïîäõîä ê âûáîðêå ñîáûòèÿ.136âûõ äåñêðèïòîðîâ, äëÿ êîòîðûõ íàñ èíòåðåñóåò, ñîîòâåòñòâåííî, âîçìîæíîñòüíåìåäëåííîãî ÷òåíèÿ, âîçìîæíîñòü íåìåäëåííîé çàïèñè è íàëè÷èå èñêëþ÷èòåëüíîé ñèòóàöèè.