Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 21
Текст из файла (страница 21)
Командный интерпретатор также может запрашивать статус выхода процесса-потомка, так как дальнейшие действия пользователя зависят от того, завершился ли процесс успешно или имела место ошибка. В системах БЫХ поддерживаются следующие системные вызовы, дающие возможность отслеживания завершения работы процессов: иа11(з1а( )ос); I* 5узтеы У, В50 и Р051Х. 1 */ иа113(з1а1озр. ор11опз, гозачер): !* В50 *! иа(тр)О(р(о, з1ат )ос, ор11опз); /* Р051Х.1 *! иа(11О(1птуре. 1О, (пуор, ор11опэ); !* 5УР4 *!' Системный вызов в(а(1 позволяет процессу ожидать завершения работы его потомка. Так как потомок может уже оказаться завершенным к моменту совершения вызова, то ему необходимо уметь распознавать такую ситуацию.
После запуска вызов (иа(1 первоначально проверяет, имеет ли вызывающий его процесс потомков, функционирование которых завершено или приостановлено. Если он находит такие процессы, то немедленно происходит возврат из этого системного вызова.
Если таких процессов нет, то уеа(1 блокирует вызвавший его процесс до тех пор, пока один из потомков не завершит свою работу, после чего последует возврат из вызова. В обоих случаях вызов (ваИ возвратит Р1Р завершившегося процесса, запишет его статус выхода в з1аг 1ос и освободит его структуру ргос (если более одного процесса-потомка завершили свою работу, туа(1 обработает только первый из найденных). Если процесс-потомок находится в режиме трассировки, возврат из в(а(1 также произойдет, когда процесс-потомок получит сигнал.
Ошибку в(а(1 вернет в случае, когда родительский процесс не имеет ни одного потомка (функционирующего или уже завершенного) либо если его работа была прервана поступившим сигналом. Система 4.3ВЯ) поддерживает вызов уча(13 (названный так потому, что он имеет три аргумента), который также возвращает информацию об использовании ресурсов потомком (время работы в режиме ядра и в режиме задачи процесса-потомка, а также о всех его завершенных потомках). В стандарте РОЯХ.1 16] описан системный вызов у(а(101((, в котором используется аргумент рЫ для ожидания потомка, имеющего определенный идентификатор процесса или группы процесса. Системные вызовы уча(1З и у(а(1рЫ поддерживают две опции: УУМОНАМ6 и УУ()МТ((АСЕ0. Опция УУМОНАМ6 заставляет вызов ' В операционной системе 5ЧН4 поддержка команд иацэ и иацрм реализована в виде библиотечных функций.
2.8. Новые процессы и программы 93 игайЗ немедленно завершить работу, если он не нашел ни одного завершившегося процесса. Опция 1М1)МТВАСЕО завершает работу вызова, если потомок приостанавливается, или вновь продолжает функционирование. В ОС "о'к'Р4 системный вызов ига1Во поддерживает все вышеописанные возможности. Он позволяет вызывающему его процессу задавать Р1Р или О1Р процесса, завершения которого должен ждать, а также определять события, по которым также произойдет возврат из вызова.
Возвращает более подробную информацию о процессе-потомке. 2.8.7. Процессы-зомби Когда процесс завершается, он остается в состоянии «зомби» (хошЬ1е) до тех пор, пока окончательно не будет «вытерт» родительским процессом. В этом режиме единственным занимаемым ресурсом остается структура ргос, в которой хранится статус выхода, а также информация об использовании ресурсов системы'. Эта информация может быть важна для родительского процесса, который получает ее посредством вызова игаг1, который также освобождает структуру ргос потомка. Если родительский процесс завершается раньше, чем его потомок, то тот усыновляется процессом 1пИ. После завершения работы потомка процесс гпй вызовет ьгай для освобождения его структуры ргос.
Определенная проблема возникает в том случае, если процесс завершится раньше своего родителя и последний не вызовет ига!1. Тогда структура процесса-потомка ргос не будет освобождена, а потомок останется в состоянии зомби до тех пор, пока система не будет перезагружена. Такая ситуация возникает очень редко, так как разработчики командных интерпретаторов знают о существовании проблемы и стараются не допустить ее возникновения в своих программах.
Однако потенциальная возможность такой ситуации остается, когда недостаточно внимательно написанные программы не следят за всеми своими процессами-потомками. Это может быть достаточно раздражительным, так как процессы-зомби видимы при помощи рз, а пользователи никак не могут их завершить„так как огггг уже завершены. Более того, они продолжают занимать структуру ргос, уменьшая тем самым максимальное количество активных процессов.
В некоторых более поздних реализациях БИ1Х поддерживается возможность указания на то, что процесс не будет ожидать завершения работы своих потомков. Например, в системе ЗЧК4 процесс может выставить флаг 5А МОССОтгА1Т в системном вызове з1йастгоп, определяя действие на сигнал 516СНСО. Это дает возможность ядру системы не создавать процессы-зомби, если потомок вызывающего процесса завершит функционирование.
' В некоторых реализациях ГЛЧ1Х для хранения таких данных используются специальные структуры гоюьге, 94 Глава 2. Ядро и процессы 2.9. Заключение В этой главе мы обсудили взаимодействие ядра системы и прикладных процессов в традиционных системах 1Лч1Х. Эти вопросы требуют более широкого обзора, поэтому нам необходимо рассмотреть специфические части системы подробнее. Современные варианты 1)Н1Х, такие как БЧК4 или Бо!а1з 2.х, предлагают дополнительные возможности, описание которых можно найти в следующих главах книги.
2.10. Упражнения 1. Какие элементы контекста процесса необходимо сохранять ядру при обработке. переключения контекста; прерывания; системного вызова? 2. В чем преимушества и недостатки динамического размешения таких объектов, как структура ргос, и блоков таблицы дескрипторов? 3. Каким образом ядро системы узнает о том, какой из системных вызовов был сделан? Каким образом происходит доступ к аргументам вызова (храняшимся в пользовательском стеке)? 4. Найдите сходства и различия в обработке системных вызовов и исключений. В чем производимые действия сходны и чем они отличаются друг от друга? 5. Многие реализации 1)Х1Х совместимы с другими версиями системы при помощи функций пользовательских библиотек, реализующих системные вызовы других версий ОС.
Объясните, различается ли с точки зрения разработчика приложений реализация такой функции в виде библиотеки и в виде системного вызова. 6. На что должен обратить внимание разработчик библиотеки, если он решает реализовать свою функцию в библиотеке как альтернативную системному вызову? Что нужно дополнительно учитывать, если библиотеке необходимо использовать несколько системных вызовов для реализации этой функции? 7. Почему необходимо ограничивать объем работы, выполняемой обработчиком прерывания? 8.
Дана система с и различными уровнями приоритетов прерываний. Какое максимальное количество прерываний может поддерживаться системой одновременно? Как влияет это количество на размеры различных стеков? 2.11. Дополнительная литература Аг!Йзоп-Жез!еу, Кеайпя, МА, 1989. 6. 1пзг!гаге 1ог Е1есгйса! апд Е!есггоп!с Еп8!пеегя 1п1огвайоп ТссЬпо!ояу, «РоггаЫе Орегаг!п8 5узгев 1пгег(асе (РО51Х) Рагс 1: 5узгев Арр!!саг!оп Ргоягав 1пгег1асе (АР1) 1С 1.ап8ца8е]», 1003.1 — 1990, 1ЕЕЕ, Рес. 1990.
9. 10. 11. 12. 13. 14. 15. 2.11. Дополнительная литература 95 Архитектура процессора 1пге! 80х86 не предусматривает приоритетов прерываний. Для управления прерываниями используются две инструкции: С~1 для запрещения всех прерываний и 571 для обратного действия. Опишите алгоритм программной поддержки уровней приоритетов для этого процессора. Когда определенный ресурс системы становится доступным, вызывается процедура тта!гецр(), которая будит все процессы, ожидающие его освобождения. Какие есть недостатки у описанного подхода? Какие вы видите альтернативные решения? Представьте, что существует некоторый системный вызов, комбинирующий функции вызовов Гог!г и ехес.