Процесс-зомби: различия между версиями

[отпатрулированная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
м →‎См. также: обработка источников, мелкие правки
Строка 5:
 
== Возникновение зомби ==
Процесс при завершении освобождает(как всенормальном, своитак ресурсыи (зав исключениемрезультате PID —не идентификатораобрабатываемого процессасигнала) освобождает все свои ресурсы и становится «зомби» — пустой записью в таблице процессов, хранящей кодстатус завершения предназначенный для родительскогочтения процессародительским процессом.
 
Система уведомляет родительскийЗомби процесс осуществует завершениидо дочернего с помощью сигнала [[SIGCHLD]].тех Предполагаетсяпор, чтопока послеродительский полученияпроцесс [[SIGCHLD]]не онпрочитает считаетего код возвратастатус с помощью [[системный вызов|системного вызова]] <code>wait(),</code>, послев результате чего запись зомбив будеттаблице удаленапроцессов избудет списка процессовосвобождена.
 
При завершении процесса система уведомляет родительский процесс о завершении дочернего с помощью сигнала [[SIGCHLD]], таким образом может быть удобно(но не обязательно) осуществлять вызов <code>wait()</code> в обработчике данного сигнала.
Если родительский процесс игнорирует SIGCHLD (а он игнорируется по умолчанию), то зомби остаются до завершения родительского процесса.
 
== Проблемы зомби ==
Игнорирование [[SIGCHLD]] в принципе не является правильным, но может быть приемлемо для короткоживущих программ (некоторые программы могут делать это намеренно, например, для исключения повторения PID). Но для долгоживущих и часто создающих дочерние процессы программ это неприемлемо, потому что накапливание зомби приводит к «утечке ресурсов» (то есть к их постепенному блокированию).
 
Зомби не занимают памяти (как [[Процесс-сирота|процессы-сироты]]), но блокируют записи в таблице процессов, размер которой ограничен для каждого пользователя и системы в целом.
 
При достижении лимита пользователь, от имени которого выполняется программа, и все его программы не будут способны создавать новые дочерние процессы. Кроме всего прочего, пользователь, от имени которого выполняется родительский процесс, не сможет зайти на консоль (локальную или удалённую) или выполнить какие-либо команды на уже открытой консоли (потому что для этого командный интерпретатор ''sh'' должен создать новый процесс), и для восстановления работоспособности (завершения виновной программы) будет необходимо вмешательство системного администратора.
 
Если же процесс выполнялся от имени суперпользователя, то проблему может решить только перезагрузка (причём зачастую — только аппаратным рестартом). Некоторые операционные системы (например, [[Solaris|Sun Solaris]]) при возникновении такой ситуации аварийно завершают часть выполняющихся процессов, восстанавливая работоспособность системы. Одна из компьютерных баек утверждает, что Solaris может таким образом аварийно завершить выполнение корневого родительского процесса [[init]] (что приведёт к остановке системы).
 
Всякий процесс при завершении и до считывания статуса завершения предком пребывает в состоянии зомби, это совершенно нормально и короткоживущие зомби процессы не представляют проблемы в системе. При этом ряд ошибок программирования может приводить к возникновению и накоплению в системе не обрабатываемых процессов зомби (т.е. уже завершившихся процессов, предок которых не считает их статус).
 
Игнорирование обработки завершения дочерних процессов не является правильным, но обычно не приводит к проблемам для короткоживущих программ, так как при завершении процесса, все его потомки становятся потомками предка завершившегося процесса, в конечном счёте все процессы являются потомками процесса init, который постоянно считывает статус своих потомков зомби, очищая таблицу процессов. Но для долгоживущих и часто создающих дочерние процессы программ, необходима корректная обработка контроля завершения дочерних программ, потому что накапливание не обрабатываемых зомби приводит к «утечке ресурсов» (то есть к их постепенному блокированию).
 
== Примеры программ, создающих зомби, на разных языках программирования ==