回答:
Zombieプロセスはシステムリソースを使い果たしないため、Zombieプロセスはパフォーマンスや速度に影響を与えません。
注:- 実際には、PID(限られたリソース)を使用しており、プロセスのカーネルデータ構造はまだ割り当てられています。通常、これはそれほど重要ではありませんが、カーネルメモリの使用量は、メモリが非常に限られているシステムでは非常に大きくなる可能性があります。
ゾンビプロセスが原因の問題
各ゾンビプロセスは、プロセスIDを保持します。LinuxシステムのプロセスIDの数は有限です(32ビットシステムではデフォルトで32767)。ゾンビが非常に速い速度で蓄積している場合、利用可能なPIDのプール全体が最終的にゾンビプロセスに割り当てられ、他のプロセスの起動を防ぎます。
注:64ビットシステムでは、最大PIDを増やすことができます。https: //unix.stackexchange.com/a/16884/170373を参照してください
ただし、いくつかのゾンビプロセスがぶらぶらしていても問題はありません。ただし、システム上の親プロセスのバグを示しています。
説明:
Linuxでプロセスが停止しても、すべてがすぐにメモリから削除されるわけではありません。プロセス記述子はメモリに残ります。
プロセスのステータスがEXIT_ZOMBIE
なり、プロセスの親は、子プロセスがSIGCHLD
シグナルで停止したことを通知されます。
次に、親プロセスはwait()システムコールを実行して、デッドプロセスの終了ステータスとその他の情報を読み取ることになっています。これにより、親プロセスはデッドプロセスから情報を取得できます。wait()が呼び出された後、ゾンビプロセスはメモリから完全に削除されます。
通常、これは非常に迅速に行われるため、システムにゾンビプロセスが蓄積することはありません。ただし、親プロセスが適切にプログラミングされておらず、wait()を呼び出さない場合、ゾンビの子はクリーンアップされるまでメモリ内に残ります。
解決:
SIGKILLシグナルで通常のプロセスを強制終了できるため、ゾンビのプロセスを強制終了できません。ゾンビのプロセスはすでに停止しています。
ゾンビを殺す1つの方法は、SIGCHLDシグナルを親プロセスに送信することです。このシグナルは、親プロセスにwait()システムコールを実行し、ゾンビの子をクリーンアップするように指示します。killコマンドでシグナルを送信し、以下のコマンドのpidを親プロセスのPIDに置き換えます。
kill -s SIGCHLD pid
ゾンビを作成したプロセスが終了すると、initはゾンビプロセスを継承し、新しい親になります。(initは、ブート時にLinuxで開始される最初のプロセスであり、PID 1が割り当てられます。)
注: -Linux 3.4以降では、プロセスはPR_SET_CHILD_SUBREAPERオプションを使用してprctl()システムコールを発行できます。その結果、プロセス#1ではなく、それらが孤立した子孫プロセスの親になります。参照:https : //unix.stackexchange.com/a/177361/5132
次に、INITはwait()システムコールを実行してゾンビの子をクリーンアップするため、initはゾンビを短時間で処理します。親プロセスを閉じた後に再起動できます。
ほとんどの場合、ゾンビは大きな問題ではありません。これらは「デッド」のようなプロセスであり、CPU時間はかかりません。また、割り当てられたメモリは、死ぬ前にプロセスによって解放されていなければなりません。実際に使用するリソースは、プロセスリストのエントリのみです。システムによっては、許可されるスレッドの最大数を設定できます。ゾンビを使用すると、理由もなくこの制限にすばやく到達できます。
ただし、ゾンビは通常、プログラマーがその子プロセスの状態を確認するのを忘れた不良/バギーコードのために表示されます。これは意図的なものですが、多くの場合そうではありません。不良/バグコードは、多くの場合、メモリを不適切 な特別な方法で処理し、割り当てられたリソースを解放しません。この場合、これらのリソースは、ゾンビが完全に終了するまで割り当てられたままになります。
編集:プロセスがJavaプログラムである場合、Javaガベージコレクターがすべてを処理するため、メモリの解放は問題になりません。