Як Linux обробляє процес зомбі


12

Процеси зомбі створюються в системах Unix / Linux. Ми можемо видалити їх за допомогою killкоманди.

Але чи є вбудований механізм очищення в Linux для управління процесами зомбі?

Відповіді:


18

Процеси зомбі вже мертві. Ви не можете їх вбити. killВиклик команди або система не робить ніякого впливу на процес зомбі. (Ви можете змусити зомбі піти kill, але вам доведеться застрелити батьків, а не зомбі, як ми побачимо через хвилину.)

Процес зомбі насправді не є процесом, це лише запис у таблиці процесів. Немає інших ресурсів, пов’язаних із зомбі-процесом: у нього немає пам'яті та будь-якого запущеного коду, не тримає жодних файлів відкритих тощо.

Коли процес вмирає, останнє, що після закінчення очищення інших ресурсів, - це запис у таблиці процесів. Цей запис зберігається навколо, утворюючи зомбі, щоб дозволити батьківському процесу відстежувати статус виходу дитини. Батько зчитує стан виходу, зателефонувавши до однієї з waitсімейних системних дзвінків ; в цей момент зомбі зникає. waitКажуть, що дзвінок пожинає дитину, поширюючи метафору мертвого зомбі, але якимось чином ще не повністю перероблений у потойбічне життя. Батько також може вказати, що це не хвилює (ігноруючи сигнал SIGCHLD або зателефонувавши sigactionз SA_NOCLDWAITпрапором), у цьому випадку запис у таблицю процесу видаляється негайно, коли дитина помирає.

Таким чином, зомбі існує лише тоді, коли процес загинув і його батько ще не зателефонував wait. Цей стан може тривати лише до тих пір, поки батьків ще не працює. Якщо батько помирає перед дитиною або помирає, не читаючи статусу дитини, батьківський процес зомбі встановлюється на процес з PID 1, який є init. Одне з завдань init- зателефонувати waitв цикл і, таким чином, скористатися будь-яким зомбі-процесом, який залишив його батько.


6

Ви не killзаймаєтеся зомбі, оскільки він уже мертвий.

Процеси зомбі повинні waitредагувати батьки, щоб зібрати їх статус виходу.

Єдиний "вбудований механізм очищення", який існує в Linux, працює в тому випадку, коли будь-який батьківський процес помирає, перш ніж він збирає статус виходу своїх дітей. У цьому випадку кожна дитина успадковується initпроцесом, який waitздійснюватиме дитину, збирає її вихідний статус та видаляє його запис у таблиці процесів.


3

Як тільки батько процесу помирає, процес стає сиротою - ігноруючи, чи це зомбі чи ні. Що відбувається з сиротами? Вони отримують нового батька, називають init. initбуде waitна кожного сироту, яке вона зібрала, тим самим пожинаючи сироту (що, можливо, теж було зомбі).


1
Ні. Якщо бути точним, initце не вбиває жодного процесу. Тільки waitдіти повинні зібрати свій статус.
chrk

1
@chrk, Philipp: звичайний термін пожинати .
Жил 'ТАК - перестань бути злим'

1

Ні, немає вбудованого механізму очищення від зомбі. Зомбі йдуть на небо зомбі, коли їх батька вбивають. До цього часу ОС зберігає їх, щоб повернути вихідний статус батьківському.


так .. чи не це негативно впливає на пам'ять тощо?

1
насправді, коли батько зомбі помирає, initпроцес бере на себе і називатиме waitйого

Ні, всі ресурси, виділені для процесу, звільнені, крім запису в таблиці процесів.
unxnut
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.