Процесс завершения
После создания процесса, как он заканчивает работу? Завершение процесса является критически важной частью жизненного цикла процесса, обеспечивающей эффективное управление системными ресурсами.
A process typically terminates by calling the _exit system call. This action signals the kernel that the process is finished and its resources, like memory and file descriptors, can be reclaimed. Upon exiting, the process provides a termination status to the kernel, which is an integer value. By convention, a status of 0 indicates successful execution, while a non-zero value signals an error.
Однако вызов _exit не удаляет процесс немедленно. Родительский процесс должен подтвердить завершение своего дочернего процесса, используя системный вызов wait. Этот вызов позволяет родителю получить статус завершения дочернего процесса. Этот двухэтапный механизм необходим для корректной очистки процесса. Другой способ linux kill child process — использование сигналов, тему которого мы рассмотрим на следующем уроке.
Процессы-сироты (Orphan Processes)
Что произойдет, если родительский процесс завершится раньше своего дочернего? Дочерний процесс становится «сиротой» (orphan). Поскольку его первоначальный родитель больше не может вызывать wait, ядро вмешивается. Процесс-сирота немедленно усыновляется специальным системным процессом, обычно init (ID процесса 1), который считается предком всех процессов. Затем процесс init берет на себя роль родителя, периодически вызывая wait для сбора статуса завершения любого из усыновленных им дочерних процессов, что позволяет им корректно завершиться.
Процессы-зомби (Zombie Processes)
Иная ситуация возникает, когда дочерний процесс завершается, но его родитель еще не вызвал wait. В этом состоянии дочерний процесс становится «зомби» (zombie). Ядро освобождает большую часть ресурсов зомби, но сохраняет запись в таблице процессов. Эта запись содержит идентификатор процесса и статус завершения, ожидая, пока родительский процесс его заберет.
Процессы-зомби уже мертвы, поэтому они не потребляют время ЦП. Их нельзя завершить сигналами, поскольку они не выполняются. Процесс вызова родителем wait для очистки зомби называется «сбор урожая» (reaping). Если родительский процесс никогда не вызывает wait, эти зомби могут накапливаться. Хотя небольшое их количество безвредно, большое число может заполнить таблицу процессов, не позволяя создавать новые процессы. В случаях, когда родительский процесс также завершается, init усыновит и соберет зомби.
Зомби против Сироты (Zombie vs Orphan Process)
Понимание различий между zombie vs orphan process является ключом к диагностике проблем, связанных с процессами.
- Процесс-сирота — это активный, выполняющийся процесс, родитель которого умер. Он усыновляется
initи продолжает выполняться до своего завершения. - Процесс-зомби — это мертвый процесс, который завершил свое выполнение, но все еще имеет запись в таблице процессов. Он ждет, пока родительский процесс прочитает его статус выхода.
Короче говоря, сирота жив, но без родителя, а зомби мертв, но еще не полностью собран родителем.