А.В. Столяров - Введение в операционные системы (1114673), страница 30
Текст из файла (страница 30)
Ïàðàìåòð 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 (åñëè, êîíå÷íî, ýòîò ïàðàìåòð íåáûë íóëåâûì óêàçàòåëåì).
 ýòîì ñëó÷àå âûçîâ âîçâðàùàåò 0.• Íà êàêîé-ëèáî èç äåñêðèïòîðîâ, âõîäÿùèõ â ìíîæåñòâî readfds, ïðèøëè äàííûå, êîòîðûå ìîæíî ïðî÷èòàòü âûçîâîì read() (òî åñòü âûçîâread() íå çàáëîêèðóåòñÿ); â ñëó÷àå ñëóøàþùåãî ñîêåòà â ðîëè äàííûõâûñòóïàþò çàïðîñû íà ñîåäèíåíèå, òî åñòü, ñîîòâåòñòâåííî, ìîæíî ãàðàíòèðîâàòü, ÷òî âûçîâ accept() íå çàáëîêèðóåòñÿ; â ñëó÷àå íåïîòîêîâûõ ñîêåòîâ ãàðàíòèðóåòñÿ, ÷òî íå áóäåò çàáëîêèðîâàí ñîîòâåòñòâóþùèé âûçîâ recvfrom() è ò.ï. Ñëåäóåò îáðàòèòü âíèìàíèå, ÷òî ñèòóàöèÿêîíåö ôàéëà òàêæå èñòîëêîâûâàåòñÿ êàê ãîòîâíîñòü ñîêåòà íà ÷òåíèå, ïîñêîëüêó â ýòîé ñèòóàöèè âûçîâ read() òàêæå íå áëîêèðóåòñÿ.• Êàêîé-ëèáî èç äåñêðèïòîðîâ, âõîäÿùèõ â writefds, ãîòîâ ê íåìåäëåííîé çàïèñè, òî åñòü, åñëè ïðèìåíèòü ê íåìó âûçîâ write(), send() èëèåùå êàêîé-òî ïîäîáíûé, òî îí íå çàáëîêèðóåò ïðîöåññ.
Ñëåäóåò îòìåòèòü, ÷òî áîëüøèíñòâî äåñêðèïòîðîâ, îòêðûòûõ íà çàïèñü, ê çàïèñèãîòîâû â ëþáîé ìîìåíò, òàê ÷òî, åñëè âíåñòè êàêîé-òî èç íèõ â ìíîæåñòâî writefds, âûçîâ âåðíåò óïðàâëåíèå íåìåäëåííî. Îáû÷íî ïàðàìåòðwritefds èñïîëüçóåòñÿ ïðè ïåðåäà÷å â ñåòü áîëüøèõ îáúåìîâ äàííûõ,êîãäà áóôåð èñõîäÿùåé èíôîðìàöèè ìîæåò ïåðåïîëíèòüñÿ è ñòàòü ïðè÷èíîé áëîêèðîâàíèÿ ïðîöåññà íà âûçîâå write().• Íà êàêîì-ëèáî èç äåñêðèïòîðîâ, âõîäÿùèõ âî ìíîæåñòâî exceptfds,âîçíèêëà èñêëþ÷èòåëüíàÿ ñèòóàöèÿ. Íà ñàìîì äåëå, ýòî âîçìîæíî òîëüêî íà ñåòåâûõ ñîêåòàõ è òîëüêî â ñëó÷àå èñïîëüçîâàíèÿ ìåõàíèçìà OOB(out-of-band), à îí èñïîëüçóåòñÿ ñðàâíèòåëüíî ðåäêî.
Ïîýòîìó è ñàì ïàðàìåòð exceptfds èñïîëüçóåòñÿ ðåäêî, îáû÷íî óêàçûâàåòñÿ NULL. ïîñëåäíèõ òðåõ ñëó÷àÿõ âûçîâ select() âîçâðàùàåò êîëè÷åñòâî äåñêðèïòîðîâ, èçìåíèâøèõ ñòàòóñ.Âñå ìíîæåñòâà äåñêðèïòîðîâ, ïåðåäàííûõ âûçîâó select(), â ýòîì ñëó÷àåèçìåíÿþòñÿ: â íèõ îñòàþòñÿ òîëüêî òå äåñêðèïòîðû, ñòàòóñ êîòîðûõ èçìåíèëñÿ. Òàêèì îáðàçîì, ïðîâåðèâ ñ ïîìîùüþ ìàêðîñà FD_ISSET èíòåðåñóþùèå íàñäåñêðèïòîðû, ìîæíî óçíàòü, íà êàêîì èç íèõ òðåáóåòñÿ âûïîëíèòü îïåðàöèþ÷òåíèÿ (èëè ïðèíÿòèÿ ñîåäèíåíèÿ, èëè çàïèñè, è ò.ï.)Òàêèì îáðàçîì, ðàáîòó ñ âûçîâîì select() ìîæíî ïîñòðîèòü ïî íèæåïðèâåäåííîé ñõåìå.  ïðèâåäåííîì êîäå ïðåäïîëàãàåòñÿ, ÷òî íîìåð ñëóøàþùåãîñîêåòà õðàíèòñÿ â ïåðåìåííîé ls; îðãàíèçîâàòü õðàíåíèå äåñêðèïòîðîâ êëèåíòñêèõ ñîêåòîâ ìîæíî ñàìûìè ðàçíûìè ñïîñîáàìè, â çàâèñèìîñòè îò çàäà÷è.Êðîìå òîãî, ïðåäïîëàãàåòñÿ, ÷òî out-of-band data íå èñïîëüçóåòñÿ, è ÷òî ïåðåäàâàåìûå â ñåòü îáúåìû äàííûõ íåâåëèêè, òàê ÷òî èñïîëüçóåòñÿ òîëüêîìíîæåñòâî readfds.138for(;;) { /* ãëàâíûé öèêë */int fd;fd_set readfds;int max_d = ls;/* èçíà÷àëüíî ïîëàãàåì, ÷òî ìàêñèìàëüíûì ÿâëÿåòñÿíîìåð ñëóøàþùåãî ñîêåòà */FD_ZERO(&readfds); /* î÷èùàåì ìíîæåñòâî */FD_SET(ls, &readfds);/* ââîäèì â ìíîæåñòâîäåñêðèïòîð ñëóøàþùåãî ñîêåòà *//* îðãàíèçóåì öèêë ïî ñîêåòàì êëèåíòîâ */for(fd=/*äåñêðèïòîð ïåðâîãî êëèåíòà*/ ;/*êëèåíòû åùå íå èñ÷åðïàíû?*/;fd=/*äåñêðèïòîð ñëåäóþùåãî êëèåíòà*/){/* çäåñü fd - î÷åðåäíîé êëèåíòñêèé äåñêðèïòîð *//* âíîñèì åãî â ìíîæåñòâî */FD_SET(fd, &readfds);/* ïðîâåðÿåì, íå áîëüøå ëè îí,íåæåëè òåêóùèé ìàêñèìóì */if(fd > max_d) max_d = fd;}timeout.tv_sec = /*çàïîëíÿåì*/;timeout.tv_usec = /*òàéì-àóò*/;int res = select(max_d+1, &readfds, NULL, NULL, NULL);if(res < 1) {if(errno != EINTR) {/* îáðàáîòêà îøèáêè, ïðîèñøåäøåé â select()'å */} else {/* îáðàáîòêà ñîáûòèÿ "ïðèøåäøèé ñèãíàë */}continue; /* äåñêðèïòîðû ïðîâåðÿòü áåñïîëåçíî */}if(res == 0) {/* îáðàáîòêà ñîáûòèÿ "òàéì-àóò" */continue; /* äåñêðèïòîðû ïðîâåðÿòü áåñïîëåçíî */}if(FD_ISSET(ls, &readfds)) {139}}/* ïðèøåë íîâûé çàïðîñ íà ñîåäèíåíèå *//* çäåñü åãî íåîáõîäèìî ïðèíÿòüâûçîâîì accept() è çàïîìíèòüäåñêðèïòîð íîâîãî êëèåíòà *//* òåïåðü ïåðåáèðàåì âñå êëèåíòñêèå äåñêðèïòîðû */for(fd=/*äåñêðèïòîð ïåðâîãî êëèåíòà*/ ;/*êëèåíòû åùå íå èñ÷åðïàíû?*/;fd=/*äåñêðèïòîð ñëåäóþùåãî êëèåíòà*/){if(FD_ISSET(fd, &readfds)) {/* ïðèøëè äàííûå îò êëèåíòà ñ ñîêåòîì fd *//* ÷èòàåì èõ âûçîâîì read() èëèrecv() è îáðàáàòûâàåì */}}/* êîíåö ãëàâíîãî öèêëà */Ñïîñîá ïîñòðîåíèÿ ïðîãðàìì, ïðè êîòîðîì ïðîãðàììà èìååòãëàâíûé öèêë, îäíà èòåðàöèÿ êîòîðîãî ñîîòâåòñòâóåò íàñòóïëåíèþ íåêîòîðîãî ñîáûòèÿ èç îïðåäåëåííîãî ìíîæåñòâà, à âñå äåéñòâèÿ ïðîãðàììû ïîñòðîåíû êàê ðåàêöèÿ íà ñîáûòèå, íàçûâàåòñÿñîáûòèéíî-óïðàâëÿåìûì ïðîãðàììèðîâàíèåì (àíãë.
event-drivenprogramming)2525.1Ãðóïïû ïðîöåññîâ è ñåàíñû â ÎÑ UnixÎáùèå ñâåäåíèÿÏðîöåññû â ÎÑ Unix îáúåäèíÿþòñÿ â ãðóïïû ïðîöåññîâ è â ñåàíñû.Ñåàíñû èçíà÷àëüíî çàäóìûâàëèñü äëÿ îáúåäèíåíèÿ âñåõ ïðîöåññîâ, çàïóùåííûõ ïîëüçîâàòåëåì ñ îäíîãî êîíêðåòíîãî òåðìèíàëà. Òàêèì îáðàçîì,ñåàíñ ìîæåò èìåòü íå áîëåå îäíîãî óïðàâëÿþùåãî òåðìèíàëà, è òåðìèíàë íåìîæåò áûòü óïðàâëÿþùèì äëÿ áîëåå ÷åì îäíîãî ñåàíñà. Êàê ìîæíî äîãàäàòüñÿ, ñåàíñ îáû÷íî ñîçäàåòñÿ êàê ðàç â òîò ìîìåíò, êîãäà ïîëüçîâàòåëü âîøåë âñèñòåìó ïî òåðìèíàëüíîé ëèíèè èëè, íàïðèìåð, çàïóñòèë ïðîãðàììó xterm. ðàìêàõ îäíîãî ñåàíñà ïðîöåññû ìîãóò áûòü ðàçáèòû íà ãðóïïû. Ãðóïïàïðîöåññîâ âõîäèò â ñåàíñ öåëèêîì, òî åñòü â îäíó ãðóïïó íå ìîãóò âõîäèòü1402573группа 2573сеанс257325992581426172597нссеа2762582группа 258130772764группа 2617Ðèñ.
24: Ñåàíñû è ãðóïïû ïðîöåññîâïðîöåññû èç ðàçíûõ ñåàíñîâ. Ìèíèìóì îäíà ãðóïïà â ñåàíñå âñåãäà ïðèñóòñòâóåò, îíà ñîçäàåòñÿ ïðè ñîçäàíèè ñåàíñà. êàæäîì ñåàíñå, èìåþùåì óïðàâëÿþùèé òåðìèíàë, îäíà ãðóïïà ïðîöåññîâ íàçûâàåòñÿ îñíîâíîé ãðóïïîé 2 , à âñå îñòàëüíûå ãðóïïû òîãî æå ñåàíñà,åñëè òàêîâûå åñòü, − ôîíîâûìè ãðóïïàìè.Ãðóïïû ïðîöåññîâ èçíà÷àëüíî çàäóìàíû äëÿ îáúåäèíåíèÿ ïðîöåññîâ, ðàáîòàþùèõ íàä îáùåé çàäà÷åé. Êîìàíäíûé èíòåðïðåòàòîð îáû÷íî ñîçäàåò íîâóþ ãðóïïó ïðîöåññîâ äëÿ âûïîëíåíèÿ êàæäîé ïîäàííîé êîìàíäû, òàê ÷òîâñå ïðîöåññû, ïîðîæäåííûå â îòâåò íà êàæäóþ êîíêðåòíóþ êîìàíäó ïîëüçîâàòåëÿ, îêàçûâàþòñÿ îáúåäèíåíû â îäíó ãðóïïó (â ÷àñòíîñòè, ïðè çàïóñêåêîíâåéåðà âñå åãî ýëåìåíòû îáúåäèíÿþòñÿ â ãðóïïó).Ïðîöåññ íàñëåäóåò ïðèíàäëåæíîñòü ê ñåàíñó è ãðóïïå îò ñâîåãî íåïîñðåäñòâåííîãî ïðåäêà (êàê óæå ãîâîðèëîñü, ïðè âûçîâå fork() ïàðàìåòðû sidè pgid íå èçìåíÿþòñÿ).
Îäíàêî ïðîöåññ ìîæåò ïðè æåëàíèè óéòè â íîâóþãðóïïó èëè äàæå â íîâûé ñåàíñ. Ãîâîðÿ êîíêðåòíåå, ïðîöåññ ìîæåò:• ñîçäàòü ñåàíñ (ïðè ýòîì â ýòîì ñåàíñå ñîçäàåòñÿ è ãðóïïà, ïðè÷åì ïðîöåññ, ñîçäàâøèé ñåàíñ, àâòîìàòè÷åñêè ñòàíîâèòñÿ ëèäåðîì è ñåàíñà, èãðóïïû; îòìåòèì, ÷òî èäåíòèôèêàòîð ñåàíñà è èäåíòèôèêàòîð ãðóïïûðàâíû èäåíòèôèêàòîðó ïðîöåññà, èõ ñîçäàâøåãî);• ñîçäàòü ãðóïïó â ðàìêàõ òîãî æå ñåàíñà (ïðè ýòîì ïðîöåññ ñòàíîâèòñÿëèäåðîì ãðóïïû);2 Àíãëèéñêèé îðèãèíàë ýòîãî òåðìèíà − foreground group, ÷òî ìîæíî áóêâàëüíî ïåðåâåñòè êàê ãðóï-ïà ïåðåäíåãî ïëàíà; â ðóññêîÿçû÷íîé ëèòåðàòóðå âñòðå÷àåòñÿ òàêæå òåðìèí141òåêóùàÿ ãðóïïà• ïåðåéòè â äðóãóþ ãðóïïó òîãî æå ñàíñà.Îòìåòèì åùå îäèí ìîìåíò: ïðîöåññ íå ìîæåò ñîçäàòü íîâûé ñåàíñ, åñëè îíóæå ÿâëÿåòñÿ ëèäåðîì ñåàíñà (òî åñòü åãî sid ñîâïàäàåò ñ pid'îì) è íå ìîæåòñîçäàòü íîâóþ ãðóïïó, åñëè óæå ÿâëÿåòñÿ ëèäåðîì ãðóïïû (òî åñòü åãî pgidñîâïàäàåò ñ pid'îì).Âñå ýòè ìåõàíèçìû ââåäåíû â ÎÑ Unix äëÿ îáëåã÷åíèÿ óïðàâëåíèÿ ïðîöåññàìè.