Linuxはゾンビプロセスをどのように処理しますか


12

ゾンビプロセスはUnix / Linuxシステムで作成されます。killコマンドを使用して削除できます。

しかし、ゾンビプロセスを処理するための組み込みのクリーンアップメカニズムがLinuxにありますか?

回答:


18

ゾンビプロセスはすでに死んでいます。それらを殺すことはできません。killコマンドまたはシステムコールは、ゾンビプロセスには影響を与えません。(でゾンビを消滅させることができkillますが、すぐにわかるように、ゾンビではなく親を撃つ必要があります。)

ゾンビプロセスは実際にはプロセスではなく、プロセステーブルのエントリにすぎません。ゾンビプロセスに関連付けられている他のリソースはありません。メモリや実行中のコードがなく、ファイルを開いたままにしないなどです。

プロセスが停止した場合、他のすべてのリソースがクリーンアップされた後、最後に行くのはプロセステーブルのエントリです。このプロセスは、親プロセスが子プロセスの終了ステータスを追跡できるように、ゾンビを形成するために保持されます。親waitは、syscallsファミリーの1つを呼び出すことによって終了ステータスを読み取ります。この時点で、ゾンビは消えます。呼び出しwaitは子供を刈り取ると言われ、ゾンビが死んでいるという比metaを広げていますが、まだ何らかの方法で死後まで完全に処理されていません。親は、(SIGCHLDシグナルを無視するかsigactionSA_NOCLDWAITフラグを使用して呼び出すことにより)気にしないことを示すこともできます。この場合、子が死んだときにプロセステーブルのエントリがすぐに削除されます。

したがって、ゾンビは、プロセスが終了し、その親がまだ呼び出されていない場合にのみ存在しwaitます。この状態は、親がまだ実行されている間のみ持続できます。親が子より前に死亡した場合、または子のステータスを読み取らずに死亡した場合、ゾンビの親プロセスはPID 1のプロセスに設定されinitます。の仕事の1つは、ループinitを呼び出しwaitて、親によって残されたゾンビプロセスを回収することです。


6

killゾンビプロセスではありません。すでに死んでいます。

ゾンビプロセスはwait、終了ステータスが収集されるように、親によって編集される必要があります。

Linuxにある唯一の「ビルトインクリーンアップメカニズム」は、親プロセスが子プロセスの終了ステータスを収集する前に停止する場合に機能します。この場合、各子はinitプロセスに継承されます。プロセスはwait、子で終了ステータスを収集し、プロセステーブルのエントリを削除します。


3

プロセスの親が死ぬとすぐに、プロセスは孤児になります-ゾンビであるかどうかは無視します。孤児はどうなりますか?彼らはと呼ばれる新しい親を取得しinitます。initwait、それはこのようにして孤立を刈り取り、収集された各孤児に(つまりもよくとしてゾンビされていてもよいです)。


1
いいえ。正確であっinitてもプロセスを殺すことはありません。それはwait彼らのステータスを収集するためにその子供にのみです。
チャーク14

1
@chrk、フィリップ:通常の用語である刈り取ります
ジル 'SO-悪であるのをやめる' 14

1

いいえ、ゾンビ用の組み込みのクリーニングメカニズムはありません。ゾンビは、親が殺されるとゾンビ天国に行きます。それまで、OSは終了ステータスを親に返すようにそれらを保持します。


だから..これはメモリなどの悪影響を及ぼしていませんか?

1
実際、ゾンビの親が死ぬと、initプロセスが引き継ぎ、それを呼び出しwaitます

いいえ、プロセステーブルのエントリを除き、プロセスに割り当てられたすべてのリソースが解放されます。
unxnut
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.