А.В. Столяров - Введение в операционные системы (1152218), страница 30
Текст из файла (страница 30)
Àíàëîãè÷íîå ðåøåíèå âîçìîæíî è äëÿ íàøåãî ïðîöåññà. Ìîæíî ñ ïîìîùüþ âûçîâà 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âûõ äåñêðèïòîðîâ, äëÿ êîòîðûõ íàñ èíòåðåñóåò, ñîîòâåòñòâåííî, âîçìîæíîñòüíåìåäëåííîãî ÷òåíèÿ, âîçìîæíîñòü íåìåäëåííîé çàïèñè è íàëè÷èå èñêëþ÷èòåëüíîé ñèòóàöèè. Ïàðàìåòð n óêàçûâàåò, êàêîå êîëè÷åñòâî ýëåìåíòîâ â ýòèõìíîæåñòâàõ ÿâëÿåòñÿ çíà÷àùèì. Ýòîò ïàðàìåòð íåîáõîäèìî óñòàíîâèòü ðàâíûì max_d+1, ãäå max_d − ìàêñèìàëüíûé íîìåð äåñêðèïòîðà ñðåäè ïîäëåæèùèõ îáðàáîòêå. Íàêîíåö, ïàðàìåòð timeout çàäàåò ïðîìåæóòîê âðåìåíè,ñïóñòÿ êîòîðûé ñëåäóåò âåðíóòü óïðàâëåíèå, äàæå åñëè íèêàêèõ ñîáûòèé,ñâÿçàííûõ ñ äåñêðèïòîðàìè, íå ïðîèçîøëî.Îáúåêò ìíîæåñòâî äåñêðèïòîðîâ çàäàåòñÿ ïåðåìåííîé òèïà fd_set.Âíóòðåííÿÿ ðåàëèçàöèÿ ïåðåìåííûõ ýòîãî òèïà, âîîáùå ãîâîðÿ, äëÿ ðàçëè÷íûõ ñèñòåì ìîæåò îêàçàòüñÿ ðàçíîé, íî ïðîùå âñåãî åå ïðåäñòàâëÿòü ñåáå êàêáèòîâóþ ñòðîêó, ãäå êàæäîìó äåñêðèïòîðó ñîîòâåòñòâóåò îäèí áèò.
Äëÿ ðàáîòû ñ ïåðåìåííûìè ýòîãî òèïà ñèñòåìà ïðåäîñòàâëÿåò â íàøå ðàñïîðÿæåíèåñëåäóþùèå ìàêðîñû:FD_ZERO(fd_set *set);/*FD_CLR(int fd, fd_set *set);/*FD_SET(int fd, fd_set *set);/*FD_ISSET(int fd, fd_set *set);/*î÷èñòèòü ìíîæåñòâî */óáðàòü äåñêðèïòîð èç ìí-âà */äîáàâèòü äåñêðèïòîð ê ìí-âó */âõîäèò ëè äåñêð-ð â ìí-âî? */Ñòðóêòóðà timeval, ñëóæàùàÿ äëÿ çàäàíèÿ ïîñëåäíåãî ïàðàìåòðà, èìååòäâà ïîëÿ òèïà long. Ïîëå tv_sec çàäàåò êîëè÷åñòâî ñåêóíä, ïîëå tv_usec −êîëè÷åñòâî ìèêðîñåêóíä (ìèëëèîííûõ äîëåé ñåêóíäû). Òàêèì îáðàçîì, íàïðèìåð, çàäàòü òàéì-àóò â 5.3 ñåêóíäû ìîæíî ñëåäóþùèì îáðàçîì:struct timeval t;t.tv_sec = 5;t.tv_usec = 300000; êà÷åñòâå ëþáîãî èç ïàðàìåòðîâ, êðîìå ïåðâîãî (êîëè÷åñòâà äåñêðèïòîðîâ), ìîæíî óêàçûâàòü íóëåâîé óêàçàòåëü, åñëè çàäàíèå äàííîãî ïàðàìåòðàíàì íå òðåáóåòñÿ.
Òàê, åñëè íóæíî ïðîñòî íåêîòîðîå âðåìÿ ïîäîæäàòü, ìîæíîóêàçàòü NULL âìåñòî âñåõ òðåõ ìíîæåñòâ äåñêðèïòîðîâ.Âûçîâ select() âîçâðàùàåò óïðàâëåíèå â ñëåäóþùèõ ñëó÷àÿõ:•  ñëó÷àå, åñëè ïðîèçîøëà îøèáêà (â ÷àñòíîñòè, â îäíîì èç ìíîæåñòâäåñêðèïòîðîâ îêàçàëîñü ÷èñëî, íå ñîîòâåòñòâóþùåå íè îäíîìó èç îòêðûòûõ äåñêðèïòîðîâ); â ýòîì ñëó÷àå âûçîâ âîçâðàùàåò -1.•  ñëó÷àå, åñëè ïðîãðàììà ïîëó÷èëà íåèãíîðèðóåìûé ñèãíàë.  ýòîìñëó÷àå òàêæå âîçâðàùàåòñÿ -1; îòëè÷èòü ýòó ñèòóàöèþ îò îøèáî÷íîéìîæíî ïî çíà÷åíèþ ãëîáàëüíîé ïåðåìåííîé errno, êîòîðàÿ â ýòîì ñëó÷àå áóäåò ðàâíà êîíñòàíòå EINTR.137• Èñòåê òàéì-àóò, òî åñòü ñ ìîìåíòà âõîäà â âûçîâ ïðîøëî áîëüøå âðåìåíè, ÷åì óêàçàíî â ïàðàìåòðå timeout (åñëè, êîíå÷íî, ýòîò ïàðàìåòð íåáûë íóëåâûì óêàçàòåëåì).