Книга: Разработка ядра Linux
Удаление дескриптора процесса
Удаление дескриптора процесса
После возврата из функции do_exit()
дескриптор завершенного процесса все еще существует в системе, но процесс находится в состоянии TASK_ZOMBIE
и не может выполняться. Как уже рассказывалось выше, это позволяет системе получить информацию о порожденном процессе после его завершения. Следовательно, завершение процесса и удаление его дескриптора происходят в разные моменты времени. После того как родительский процесс получил информацию о завершенном порожденном процессе, структура task_struct
порожденного процесса освобождается.
Семейство функций wait()
реализовано через единственный (и достаточно сложный) системный вызов wait4()
. Стандартное поведение этой функции — приостановить выполнение вызывающей задачи до тех пор, пока один из ее порожденных процессов не завершится. При этом возвращается идентификатор PID
завершенного порожденного процесса. В дополнение к этому, в данную функцию передается указатель на область памяти, которая после возврата из функции будет содержать код завершения завершившегося порожденного процесса.
Когда приходит время окончательно освободить дескриптор процесса, вызывается функция release_task()
, которая выполняет указанные ниже операции.
• Вызывается функция free_uid()
для декремента счетчика ссылок на информацию о пользователе процесса. В системе Linux поддерживается кэш с информацией о каждом пользователе, в частности сколько процессов и открытых файлов имеет пользователь. Если счетчик ссылок достигает значения нуль, то пользователь больше не имеет запущенных процессов и открытых файлов, в результате кэш уничтожается.
• Вызывается функция unhash_process()
для удаления процесса из хеш-таблицы идентификаторов процессов pidhash
и удаления задачи из списка задач.
• Если задача была в состоянии трассировки (ptrace), то родительским для нее снова назначается первоначальный родительский процесс и задача удаляется из списка задач, которые находятся в состоянии трассировки (ptrace) данным процессом.
• В конце концов вызывается функция put_task_struct()
для освобождения страниц памяти, содержащих стек ядра процесса и структуру thread_info
, a также освобождается слябовый кэш, содержащий структуру task_struct
.
На данном этапе дескриптор процесса, а также все ресурсы, которые принадлежали только этому процессу, освобождены.
- Сущность процесса миграции
- V Совершенствование процесса
- Использование сервера Yaffil внутри процесса
- 4. Стадии бизнес-процесса взаимодействия с клиентами
- 2.2.2.2 Состояния процесса
- 1.2 Процесс, контекст процесса и потоки
- Вытеснение процесса
- Удаление шаблонов узлов STP
- Удаление учебного узла
- Удаление файлов занятий
- Удаление узла
- Добавление, изменение и удаление элементов списка