А.В. Столяров - Введение в операционные системы (1152218), страница 22
Текст из файла (страница 22)
Î âûïîëíåíèè ïðîöåññà âðåæèìå ÿäðà ãîâîðèòñÿ ëèøü ïîñòîëüêó, ïîñêîëüêó âðåìÿ, çàòðà÷èâàåìîå ÿäðîì íà ðàáîòó â èíòåðåñàõ äàííîãî ïðîöåññà, ó÷èòûâàåòñÿ êàê ïîòðåáëåííûéïðîöåññîì ðåñóðñ.Ïðîöåññ ìîæåò îêàçàòüñÿ ñíÿò ñ èñïîëíåíèÿ (ïåðåéòè â ñîñòîÿíèå ãîòîâíîñòè), ìèíóÿ ñòàäèþ âûïîëíåíèÿ â ðåæèìå ÿäðà. Ýòî ìîæåò ïðîèçîéòè, åñëèÿäðî ïðèìåò ðåøåíèå î ñìåíå àêòèâíîãî ïðîöåññà âî âðåìÿ îáðàáîòêè àïïàðàòíîãî ïðåðûâàíèÿ (íàïðèìåð, ïðåðûâàíèÿ òàéìåðà). Âîçîáíîâëåíèå âûïîëíåíèÿ ïðîöåññà â ëþáîì ñëó÷àå òðåáóåò ïîäãîòîâèòåëüíûõ äåéñòâèé â ðåæèìåÿäðà.Ñòîèò îáðàòèòü âíèìàíèå íà òî, ÷òî ïðîöåññ, ïîïàâøèé â ðåæèì áëîêèðîâêè (íàïðèìåð, îæèäàþùèé ðåçóëüòàòîâ ââîäà-âûâîäà), ìîæåò êàê áûòüîòêà÷àí, òàê è îñòàâàòüñÿ â ïàìÿòè, åñëè îòêà÷êà ñèñòåìå íå ïîòðåáîâàëàñü.Îäíàêî, åñëè ïðîöåññ âñå æå áûë îòêà÷àí, îáðàòíàÿ ïîäêà÷êà áóäåò îñóùåñòâëåíà íå ðàíüøå, ÷åì ïðîöåññ îêàæåòñÿ ãîòîâ ê âûïîëíåíèþ (òî åñòü èñ÷åçíåòïðè÷èíà áëîêèðîâêè).15Ñèòóàöèÿ ãîíîê (race condition)Ðàññìîòðèì ïðîãðàììó, ïîðîæäàþùóþ äî÷åðíèé ïðîöåññ è âûäàþùóþäâà ñîîáùåíèÿ, îäíî èç ïîðîæäåííîãî ïðîöåññà, âòîðîå èç ðîäèòåëüñêîãî:int main(){if(fork() == 0) { /* äî÷åðíèé ïðîöåññ */printf("I'm the child\n");} else {/* ðîäèòåëüñêèé ïðîöåññ */printf("I'm the parent\n");}return 0;}Âîçìîæíî äâå ñèòóàöèè.
 ïåðâîé ñèòóàöèè äî÷åðíèé ïðîöåññ íå óñïåâàåòïî òåì èëè èíûì ïðè÷èíàì íà÷àòü èñïîëíåíèå äî òîãî, êàê ðîäèòåëüñêèé äîéäåò äî âûçîâà ôóíêöèè printf(). Íàïðèìåð, ñèñòåìå ìîãëî íå õâàòèòü ïàìÿòè è äî÷åðíèé ïðîöåññ áûë ñîçäàí â îòêà÷àííîì ñîñòîÿíèè (â ñâîï-ïàìÿòè). Â96ýòîì ñëó÷àå ñíà÷àëà áóäåò íàïå÷àòàíà ôðàçà I'm the parent, çàòåì − ôðàçàI'm the child.Ìîæåò ïîëó÷èòüñÿ è èíà÷å. Ê ïðèìåðó, ó ðîäèòåëüñêîãî ïðîöåññà ìîæåòñðàçó ïî âûïîëíåíèè âûçîâà fork() èñòå÷ü êâàíò âðåìåíè. Ïðè ýòîì äî÷åðíèé ïðîöåññ, êîòîðîìó íà ñåé ðàç õâàòèëî ïàìÿòè, ìîæåò ïîëó÷èòü óïðàâëåíèå è óñïåòü çà ñâîé êâàíò âðåìåíè ïðîèçâåñòè ïå÷àòü.
Òîãäà ôðàçû ïîÿâÿòñÿíà ýêðàíå â îáðàòíîì ïîðÿäêå.Ñèòóàöèè, â êîòîðûõ ðåçóëüòàò çàâèñèò îò êîíêðåòíîé ïîñëåäîâàòåëüíîñòè íåçàâèñèìûõ ñîáûòèé (îáû÷íî ñîáûòèé èç ðàáîòàþùèõ ïàðàëëåëüíî ïðîöåññîâ) íàçûâàþòñÿ ñèòóàöèÿìè ãîíîê 7 .Ñèòóàöèè ãîíîê ÷àñòî âîçíèêàþò â ïàðàëëåëüíîì ïðîãðàììèðîâàíèè, òîåñòü ïðè íàëè÷èè áîëåå ÷åì îäíîãî ïîòîêà óïðàâëåíèÿ. Îòíîñèòüñÿ ê âîçíèêíîâåíèþ òàêèõ ñèòóàöèé ñëåäóåò êðàéíå âíèìàòåëüíî, ïîñêîëüêó â íåêîòîðûõñëó÷àÿõ íåó÷òåííûå ñèòóàöèè ñîñòÿçàíèé ìîãóò ïðèâîäèòü ê îøèáêàì è äàæåïðîáëåìàì â áåçîïàñíîñòè.Ê ðàññìîòðåíèþ ñèòóàöèé ãîíîê ìû åùå âåðíåìñÿ â îäíîé èç ïîçäíèõëåêöèé.7 Ñîîòâåòñòâóþùèéàíãëîÿçû÷íûé òåðìèí − race condition.
 ðóññêèõ ïåðåâîäàõ âñòðå÷àåòñÿ òàêæåñèòóàöèÿ ñîñòÿçàíèé.97Ëåêöèÿ 816Óïðàâëåíèå ñâîéñòâàìè ïðîöåññà16.1Òåêóùèé è êîðíåâîé êàòàëîãèÒåêóùèé êàòàëîã ìîæíî ñìåíèòü ñ ïîìîùüþ âûçîâàint chdir(const char* path);ïîäàâ â êà÷åñòâå ïàðàìåòðà ïîëíûé ïóòü íîâîãî êàòàëîãà ëèáî ïóòü îòíîñèòåëüíî òåêóùåãî êàòàëîãà. Ñòðîêà ".." îçíà÷àåò êàòàëîã óðîâíåì âûøå îòíîñèòåëüíî çàäàííîãî (íàïðèìåð, /usr/local/share/.. − ýòî òî æå ñàìîå,÷òî /usr/local).Ñìåíà êîðíåâîãî êàòàëîãà îñóùåñòâëÿåòñÿ âûçîâîìint chroot(const char* path);Ïîñëå âûïîëíåíèÿ ýòîãî âûçîâà êàòàëîãè çà ïðåäåëîì íîâîãî êîðíåâîãî ïåðåñòàþò áûòü âèäíû èëè êàêèì-ëèáî îáðàçîì äîñòóïíû ïðîöåññó è âñåì åãîïîòîìêàì. Îïåðàöèÿ ñìåíû êîðíåâîãî êàòàëîãà íåîáðàòèìà.Âûçîâ chroot() ìîãóò âûïîëíÿòü òîëüêî ïðîöåññû, èìåþùèå ïðàâà ïîëüçîâàòåëÿ root.16.2ÎêðóæåíèåÎêðóæåíèå äîñòóïíî â ïðîãðàììàõ íà C ÷åðåç ãëîáàëüíóþ ïåðåìåííóþextern char **environ;Äëÿ ìàíèïóëÿöèè ïåðåìåííûìè îêðóæåíèÿ ñëóæàò ôóíêöèèchar *getenv(const char *name);int setenv(const char *name, const char *value, int overwrite);void unsetenv(const char *name);Ôóíêöèÿ getenv() âîçâðàùàåò ñòðîêó, ÿâëÿþùóþñÿ çíà÷åíèåì ïåðåìåííîé,èìÿ êîòîðîé çàäàåòñÿ àðãóìåíòîì name.
Åñëè òàêîé ïåðåìåííîé â îêðóæåíèèíåò, âîçâðàùàåòñÿ çíà÷åíèå NULL.Î÷åíü âàæíî ïðîèçâåñòè ïðîâåðêó íàNULLïåðåä àíàëèçîì âîçâðàùåííîé ñòðîêè. Íèêòîíå ìîæåò ãàðàíòèðîâàòü íàëè÷èå êàêîé áû òî íè áûëî ïåðåìåííîé â îêðóæåíèè ïðîöåññà, äàæååñëè ðå÷ü èäåò î ñòàíäàðòíûõ ïåðåìåííûõ, âêëþ÷àÿ98PATH.Ôóíêöèÿ setenv() óñòàíàâëèâàåò íîâîå çíà÷åíèå ïåðåìåííîé, ïðè÷åì åñëè òàêîé ïåðåìåííîé íå áûëî, çíà÷åíèå óñòàíàâëèâàåòñÿ â ëþáîì ñëó÷àå, åñëè æå ñîîòâåòñòâóþùàÿ ïåðåìåííàÿ â îêðóæåíèè óæå åñòü, íîâîå çíà÷åíèåóñòàíàâëèâàåòñÿ òîëüêî ïðè íåíóëåâîì çíà÷åíèè ïàðàìåòðà overwrite; òàêèìîáðàçîì, ïàðàìåòð overwrite ðàçðåøàåò èëè çàïðåùàåò èçìåíÿòü çíà÷åíèåïåðåìåííîé îêðóæåíèÿ, åñëè òàêîâàÿ óæå åñòü.Ôóíêöèÿ unsetenv() óäàëÿåò ïåðåìåííóþ ñ çàäàííûì èìåíåì èç îêðóæåíèÿ.16.3Ïàðàìåòð umaskÏàðàìåòð umask ìîæíî èçìåíèòü ñ ïîìîùüþ ñèñòåìíîãî âûçîâàint umask(int mask);Ýòîò ñèñòåìíûé âûçîâ âñåãäà çàâåðøàåòñÿ óñïåøíî è âîçâðàùàåò ïðåäûäóùååçíà÷åíèå ïàðàìåòðà umask.16.4Ìàíèïóëÿöèÿ òàáëèöåé äåñêðèïòîðîâÍîâûå ôàéëîâûå äåñêðèïòîðû ñîçäàþòñÿ ïðè óñïåøíîì âûïîëíåíèè âûçîâà open(), à òàêæå âî ìíîãèõ äðóãèõ ñëó÷àÿõ (êàê ìû óâèäèì íà ñëåäóþùèõ ëåêöèÿõ, äåñêðèïòîðû èñïîëüçóþòñÿ òàêæå äëÿ êàíàëîâ, ñîêåòîâ è ò.ï.)Ïðè ñîçäàíèè íîâîãî ôàéëîâîãî äåñêðèïòîðà ñèñòåìà âñåãäà âûáèðàåò íàèìåíüøèé ñâîáîäíûé íîìåð; òàê, åñëè çàêðûòü íóëåâîé äåñêðèïòîð, ñëåäóþùèé óñïåøíûé âûçîâ open() âåðíåò íîëü.Äëÿ çàêðûòèÿ äåñêðèïòîðà èñïîëüçóåòñÿ óæå ðàññìàòðèâàâøèéñÿ âûçîâclose().Êðîìå ýòîãî, î÷åíü âàæíû åùå äâà ñèñòåìíûõ âûçîâà, ñîçäàþùèå ñèíîíèìû ñóùåñòâóþùèõ äåñêðèïòîðîâ:int dup(int fd);int dup2(int fd, int new_fd);Âûçîâ dup() ñîçäàåò íîâûé ôàéëîâûé äåñêðèïòîð, ñâÿçàííûé ñ òåì æå ñàìûì ïîòîêîì ââîäà-âûâîäà, ÷òî è fd.
Íîâûé è ñòàðûé äåñêðèïòîðû ðàçäåëÿþò, â ÷èñëå ïðî÷åãî, è óêàçàòåëü òåêóùåé ïîçèöèè â ôàéëå: åñëè íà îäíîì èçíèõ ñìåíèòü ïîçèöèþ ñ ïîìîùüþ lseek(), ïîçèöèÿ íà âòîðîì èç íèõ òàêæåèçìåíèòñÿ.Âûçîâ dup2() îòëè÷àåòñÿ òåì, ÷òî íîâûé äåñêðèïòîð ñîçäàåòñÿ ïîä çàäàííûì íîìåðîì (ïàðàìåòð new_fd). Åñëè ýòîò íîìåð áûë ñâÿçàí ñ îòêðûòûìäåñêðèïòîðîì, òîò äåñêðèïòîð çàêðûâàåòñÿ.99Ðàññìîòðèì äëÿ ïðèìåðà ñèòóàöèþ, êîãäà íåêîòîðàÿ áèáëèîòåêà, êîòîðóþ ìû èñïîëüçóåì, ïðîèçâîäèò âûâîä íóæíîé íàì èíôîðìàöèè âñåãäà íàñòàíäàðòíûé ïîòîê âûâîäà, à íàì æåëàòåëüíî ñîîòâåòñòâóþùóþ èíôîðìàöèþ âûâåñòè â ôàéë.
Ýòî ìîæíî ñäåëàòü ñ ïîìîùüþ òàêîãî ôðàãìåíòà êîäà:int save1, fd;fflush(stdout);/* íà âñÿêèé ñëó÷àé î÷èùàåì áóôåðñòàíäàðòíîãî âûâîäà */save1 = dup(1);/* ñîõðàíÿåì íàø ñòàíäàðòíûé âûâîä */int fd = open("file.dat", O_CREAT|O_WRONLY|O_TRUNC, 0666);/* îòêðûëè ôàéë */if(fd == -1) { /* ... îáðàáîòêà îøèáêè ... */ }dup2(fd, 1);/* cäåëàëè îòêðûòûé ôàéëñòàíäàðòíûì ïîòîêîì âûâîäà */close(fd);/* çàêðûëè "ëèøíèé" äåñêðèïòîð *//* ... ïðîèçâîäèì äåéñòâèÿ ñ íàøåé áèáëèîòåêîé ...âñå ýòî âðåìÿ âûçîâû ôóíêöèé, ðàáîòàþùèõ ñî ñòàíäàðòíûìâûâîäîì (òàêèõ êàê printf, puts è ò.ï.), áóäóò âûâîäèòüèíôîðìàöèþ â íàø ôàéë*/dup2(save1, 1);close(save1);/* âîññòàíîâèëè ñòàðûé ñòàíäàðòíûéïîòîê âûâîäà *//* ôàéë ïðè ýòîì çàêðûëñÿ àâòîìàòè÷åñêè *//* ëèøíÿÿ êîïèÿ íàì íå íóæíà */Ðàññìîòðèì åùå îäèí ïðèìåð.
Äîïóñòèì, ó íàñ âîçíèêëà ïîòðåáíîñòü âïðîãðàììå íà C ñìîäåëèðîâàòü ôóíêöèîíèðîâàíèå êîìàíäû Shellls -l -a -R / > filelist(ïîïðîñòó ãîâîðÿ, ñãåíåðèðîâàòü ôàéë filelist, ñîäåðæàùèé ñïèñîê âñåõôàéëîâ â ñèñòåìå). Ýòî ìîæíî ñäåëàòü ñ ïîìîùüþ ñëåäóþùåãî ôðàãìåíòà:int pid, status;pid = fork();if(pid == -1) { /* ... îáðàáîòêà îøèáêè ...
*/ }if(pid == 0) {/* äî÷åðíèé ïðîöåññ */int fd = open("filelist", O_CREAT|O_WRONLY|O_TRUNC, 0666);if(fd == -1) exit(1);dup2(fd, 1);100close(fd);execlp("ls", "ls", "-l", "-a", "-R", "/", NULL);perror("ls");exit(1);}/* ðîäèòåëüñêèé ïðîöåññ */wait(&status);if(!WIFEXITED(status) || WEXITSTATUS(status)!=0) {/* ... îáðàáîòêà îøèáêè ... */}16.5Óïðàâëåíèå ïðî÷èìè ñâîéñòâàìè ïðîöåññàÓçíàòü çíà÷åíèÿ ïàðàìåòðîâ uid, gid, euid, egid, pid, ppid, sid è pgidìîæíî, ñîîòâåòñòâåííî, ñèñòåìíûìè âûçîâàìè getuid(), getgid() è ò.ä.Ïàðàìåòðû pid, ppid (èäåíòèôèêàòîð ïðîöåññà è åãî ïðåäêà) èçìåíåíèòüíåëüçÿ.Ìàíèïóëÿöèÿ ïàðàìåòðàìè sid è pgid áóäåò ðàññìîòðåíà â íàøåì êóðñåïîçæå, íà ëåêöèè, ïîñâÿùåííîé ñåàíñàì è ãðóïïàì ïðîöåññîâ.Ïàðàìåòðû uid, gid, euid, egid, èäåíòèôèöèðóþùèå ïîëíîìî÷èÿ ïðîöåññà, â íåêîòîðûõ ñëó÷àÿõ ìîãóò áûòü èçìåíåíû.
Îá ýòîì ðå÷ü ïîéäåò ïðèðàññìîòðåíèè ïîëíîìî÷èé ïðîöåññîâ.Íàêîíåö, îáðàáîòêà ñèãíàëîâ áóäåò ðàññìîòðåíà ïðè èçó÷åíèè ñèãíàëîâêàê ñðåäñòâà ìåæïðîöåññíîãî âçàèìîäåéñòâèÿ.17Îáùàÿ êëàññèôèêàöèÿ ñðåäñòâ âçàèìîäåéñòâèÿ ïðîöåññîâ â ÎÑ Unix ðàìêàõ îäíîé Unix-ñèñòåìû ïðîöåññû ìîãóò òàê èëè èíà÷å âçàè-ìîäåéñòâîâàòü ìåæäó ñîáîé. Âîîáùå ãîâîðÿ, îäèí ïðîöåññ ìîæåò ïîâëèÿòüíà ðàáîòó äðóãîãî, íå ïðèáåãàÿ ê ñïåöèàëèçèðîâàííûì ñðåäñòâàì; íàïðèìåð, ïðîöåññ ìîæåò ìîäèôèöèðîâàòü ôàéë, ÷èòàåìûé äðóãèì ïðîöåññîì. Òåìíå ìåíåå, äëÿ îðãàíèçàöèè âçàèìîäåéñòâèÿ ïðîöåññîâ óäîáíåé ïîëüçîâàòüñÿñðåäñòâàìè, êîòîðûå äëÿ ýòîãî ñïåöèàëüíî ïðåäíàçíà÷åíû.Íàèáîëåå ïðèìèòèâíûì èç òàêèõ ñðåäñòâ ÿâëÿþòñÿ ñèãíàëû 1 . Ñèãíàë íåíåñåò â ñåáå íèêàêîé èíôîðìàöèè, êðîìå íîìåðà ñèãíàëà − öåëîãî ÷èñëà èç1 Íåñìîòðÿíà ïðîñòîòó ñàìîãî ñðåäñòâà, êîððåêòíîå èñïîëüçîâàíèå ñèãíàëîâ èíîãäà îêàçûâàåòñÿ ÷ðåçâû÷àéíî ñëîæíîé çàäà÷åé; ãîâîðÿ î ïðèìèòèâíîñòè ñèãíàëîâ, ìû íå ïîäðàçóìåâàåì, ÷òî îíè ïðîñòû âèñïîëüçîâàíèè.101средствавзаимодействияпроцессовлокальныесетевыесигналыканалысокетывирт.
терминалименованныетрассировканеименованныеSystem V IPCочереди сообщенийmmapразделяемая памятьсемафорыÐèñ. 21: Êëàññèôèêàöèÿ ñðåäñòâ âçàèìîäåéñòâèÿ ïðîöåññîâïðåäîïðåäåëåííîãî ìíîæåñòâà.Äëÿ ïåðåäà÷è äàííûõ ìåæäó ïðîöåññàìè ìîæíî èñïîëüçîâàòü îäíîíàïðàâëåííûå êàíàëû, ðàçëè÷àþùèåñÿ íà èìåíîâàííûå è íåèìåíîâàííûå.Ñèñòåìíûé âûçîâ mmap() ïîçâîëÿåò ñîçäàòü îáëàñòü ïàìÿòè, äîñòóïíóþíåñêîëüêèì ïðîöåññàì2 . Òàêàÿ îáëàñòü ïàìÿòè íàçûâàåòñÿ ðàçäåëÿåìîé, àïðîöåññû, ðàáîòàþùèå ñ íåé, ñ÷èòàþòñÿ âçàèìîäåéñòâóþùèìè ÷åðåç ðàçäåëÿåìóþ ïàìÿòü.Ïðè îòëàäêå ïðîãðàìì èñïîëüçóåòñÿ ðåæèì òðàññèðîâêè, ïðè êîòîðîéîäèí ïðîöåññ (îáû÷íî îòëàä÷èê) êîíòðîëèðóåò âûïîëíåíèå äðóãîãî (îòëàæèâàåìîé ïðîãðàììû).Êàê óæå ãîâîðèëîñü íà ëåêöèè, ïîñâÿùåííîé ââåäåíèþ â ÎÑ Unix, âàæíóþ ðîëü â ñèñòåìàõ ñåìåéñòâà Unix èãðàåò ïîíÿòèå òåðìèíàëà.