ゾンビの状態がクリアされないと問題ないですか?

ゾンビの状態がクリアされないと問題ないですか?

私はJavaプロセスがゾンビになってしばらくそこにとどまった生産単位を持っています。端末を再起動すると削除されます。ただし、デバイスは再起動せず、他のJavaプロセスが起動して実行されます。このゾンビの状態がクリアされず、そのまま残っていれば問題ありませんか?どのように(パフォーマンスやスピードの低下)影響を与えますか?

ベストアンサー1

ゾンビプロセスはパフォーマンスや速度には影響しません。ゾンビプロセスはシステムリソースを占有しません。

メモ:- 実際に制限されたリソースであるPIDを引き続き使用し、プロセスのカーネルデータ構造を割り当てます。一般に、これは重要ではありませんが、メモリが非常に制限されているシステムでは、カーネルのメモリ使用量がかなりの場合があります。

ゾンビプロセスによる問題

各ゾンビプロセスは対応するプロセスIDを保持します。 LinuxシステムのプロセスIDの数は制限されています。3276732ビットシステムでは、基本的に。ゾンビプロセスが非常に高速で蓄積されると、利用可能な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はゾンビプロセスをすばやく処理できます。親プロセスを閉じた後に再起動できます。

おすすめ記事