O Torvalds Linus

Сайт о *nix системах и всем что с ними связано

Операционная система Unix позволяет процессу опрашивать ядро на предмет идентификатора процесса родителя или состояния любого своего потомка. Например, процесс может создать процесс – потомок для решения конкретной задачи, а затем вызвать какую-нибудь wait ()подобную библиотечную функцию, чтобы проверить, завершилось ли выполнение потомка. Если завершилось, код завершения позволит родителю судить об успешности решения задачи.

Чтобы не возникло противоречий с такими возможностями, ядрам Unix не разрешается уничтожать данные, содержащиеся в дескрипторе процесса, сразу после завершения процесса. Им можно сделать это только после того, как процесс – родитель сделает wait ()подобный системный вызов в отношении завершившегося процесса. Именно поэтому было введено состояние exit zombie: хотя в техническом смысле процесса больше нет, его дескриптор хранится, пока процесс – родитель не будет уведомлен.

Что происходит, если родитель завершает выполнение раньше своих потомков? В этом случае система может оказаться переполненной процессами – зомби, дескрипторы которых навсегда остались бы в оперативной памяти. Как было сказано ранее, эта проблема решается принудительным переводом всех осиротевших”процессов в потомки процесса init. Тогда процесс init уничтожит зомби при проверке завершения одного из своих законных потомков с помощью wait ()подобного системного вызова.

Функция reiease tasko отсоединяет последние структуры от дескриптора процесса – зомби. Она применяется к зомби одним из двух способов: либо с помощью функции do exito, если родитель не заинтересован в получении сигналов от потомка, либо с помощью системных вызовов wait4() или waitpid (), после того как сигнал был отправлен потомку. В последнем случае функция также произведет утилизацию памяти, занятой дескриптором процесса, а в первом —утилизация памяти будет произведена планировщиком. Эта функция выполняет следующие действия:

1. Уменьшает количество процессов, принадлежащих пользователю – владельцу завершившегося процесса. Это значение хранится в структуре user struct, упомянутой ранее в этой главе (см. шаг 4 функции сору_ process ()).

2. Если процесс отслеживается, функция удаляет его из списка ptrace_ children отладчика и возвращает оригинальному родителю.

3. Вызывает функцию exit signai о, чтобы отменить все ожидающие доставки сигналы и освободить дескриптор signai struct процесса. Если дескриптор больше не используется другими облегченными процессами, функция удаляет эту структуру. Кроме того, она вызывает функцию exit itimers (), чтобы отсоединить от процесса POSIX – таймер интервалов, если таковой имеется.

4. Вызывает функцию exit sighando, чтобы убрать обработчики сигналов.

5. Вызывает функцию unhash process (), которая:

•уменьшает переменную nr threads на 1;

•дважды вызывает функцию detach pid (), чтобы удалить дескриптор процесса из хеш – таблиц pidhash типа pidtype_pid и pidtype_tgid;

•если процесс является лидером группы, опять дважды вызывает функцию detach pid (), чтобы удалить дескриптор процесса из хеш – таблиц

PIDTYPE_PGID И PIDTYPE_SID;

•вызывает макрос remove links, чтобы удалить дескриптор процесса из списка процессов.

6. Если процесс не является лидером группы, значит, лидер уже стал процессом – зомби, и данный процесс является последним членом группы потоков.

Функция отправляет сигнал родителю лидера, чтобы уведомить его о “гибели”процесса.

7. Вызывает функцию sched exitо, чтобы отрегулировать отрезок времени процесса – родителя (этот шаг логически дополняет шаг 17 в описании функции copy_process ()).

8. Вызывает функцию put task structо, чтобы изменить счетчик обращений у дескриптора процесса. Если этот счетчик сравняется с нулем, функция отменяет все оставшиеся ссылки на процесс:

•уменьшает счетчик обращений (поле count) структуры user struct,

принадлежащей пользователю – владельцу процесса и освобождает эту структуру, если счетчик обращений становится равным 0;

•освобождает дескриптор процесса и область памяти, занимаемую дескриптором thread infо и стеком режима ядра.

Add A Comment