Процесс-зомби
Материал из Википедии — свободной энциклопедии
Проце́сс-зо́мби, зо́мби (англ. zombie process, англ. defunct process) — дочерний процесс в Unix-системе, завершивший своё выполнение, но еще присутствующий в списке процессов операционной системы, чтобы дать родительскому процессу считать код завершения.
Содержание |
[править] Этимология
Происходит от слова «зомби», означающего «живой мертвец» (оксюморон, англ. undead). Термин является яркой метафорой о том, что процесс «умер», но не «погребён».
[править] Возникновение зомби
При завершении процесса, он освобождает все свои ресурсы (за исключением PID — идентификатора процесса) и становится «зомби» — пустой записью в таблице процессов, хранящей код завершения для родительского процесса.
Родительский процесс информируется системой о завершении дочернего с помошью сигнала SIGCHLD, предполагается, что после его получения он считает код возврата с помощью системного вызова wait()
, после чего, запись зомби будет удалена из списка процессов.
Однако, программы часто игнорируют SIGCHLD (он игнорируется по умолчанию), из-за чего зомби остаются до завершения родительского процесса.
[править] Проблемы зомби
Игнорирование SIGCHLD может быть приемлемым вариантом для короткоживущих программ (некоторые программы, могут делать это намеренно, например для исключения повторения PID). Но для долгоживущих и часто создающих дочерние процессы, программ это неприемлемо, потому что накапливание зомби приводит к «утечке ресурсов» (то есть их постепенному блокированию).
Зомби не занимают памяти (как процессы-сироты), но блокируют записи в таблице процессов, размер которой ограничен для каждого пользователя и системы в целом. При достижении лимита, пользователь, от имени которого выполняется программа и все его программы не будут способны создавать новые дочерние процессы.
Кроме всего прочего, пользователь не сможет зайти на консоль (локальную или удаленную) или выполнить какие-либо команды на уже открытой консоли (потому что для этого командный интерпретатор sh должен создать новый процесс для этой команды), и для восстановления работоспособности (завершения виновной программы) будет необходимо вмешательство системного администратора.
Если же процесс выполнялся от имени суперпользователя, то проблему решит только перезагрузка системы.
[править] Разное
- Зомби не могут принимать сигналов, и поэтому их нельзя убрать с помошью утилиты или вызова kill. Убрать их может либо родительский процесс, либо его завершение.
- Все процессы в Unix имеют своих родителей — процессы не имеющие или потерявшие родителей («осиротевшие» процессы; англ. orphan process) являются дочерними для init (процесс с PID = 1), который в свою очередь является дочерним для ядра (процесса с PID = 0). init всегда обрабатывает SIGCHLD, поэтому от таких процессов никогда не остается зомби.
- Зомби можно узнать в списке процессов (выводимых утилитой ps) по флагу «Z» в колонке STAT.
- Хорошим стилем программирования считается всегда обрабатывать SIGCHLD.
- Языки скриптов Perl и Python неявно обрабатывают SIGCHLD, если программа настраивает его игнорирование.