Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxゾンビプロセスとその解決策

Linuxゾンビプロセスとその解決策

  

Linuxゾンビプロセスとその解決策

1.原因:

UNIXシステムでは、プロセスは終了しましたが、彼のプロセスは終了しました。親プロセスは彼を待たず(call wait /waitpid)、そして彼はゾンビプロセスになります。 psコマンドを使用して、機能していないフラグを表示します。ゾンビプロセスはすでに死んだプロセスですが、それでもプロセステーブルのスロットを占めています。

しかし、プロセスの親プロセスが最初に終了した場合、そのプロセスはゾンビプロセスにはなりません。各プロセスは終了するので、システムは現在のシステムで実行されているすべてのプロセスをスキャンして、終了したばかりのプロセスの子プロセスがあるかどうかを確認します。親プロセス、つまり各プロセスが親プロセスを持つようにします。 Initプロセスは自動的にその子プロセスを待ちますので、Initによって引き継がれるすべてのプロセスはゾンビプロセスになりません。

2.原則分析:

各Unixプロセスはプロセステーブルにエントリを持ち、コアプロセスがプロセスを実行するために使用するすべての情報はエントリポイントに格納されます。 。 psコマンドを使用してシステム内のプロセス情報を表示すると、プロセステーブルに関連データが表示されます。 fork()システムコールで新しいプロセスが作成されると、コアプロセスはプロセステーブル内の新しいプロセスにエントリポイントを割り当て、そのエントリポイントに対応するプロセステーブル内に関連情報を格納します。これらのメッセージの1つは、その親プロセスのIDです。

子プロセスの終了と親プロセスの実行は非同期プロセスです。つまり、親プロセスは子プロセスの終了時刻を予測できません。それで、それは、親プロセスが子プロセスを待つにはあまりにもビジーであるか、または子プロセスがいつ終了するかを知らず、子プロセスの終わりに状態情報を失うためです。いいえUNIXには、親プロセスが子プロセスの最後に状態情報を知りたいということを保証するためのメカニズムが用意されているので、入手することができます。このメカニズムは、次のとおりです。子プロセスが自身のライフサイクルを終了すると、exit()システムコールを実行し、カーネルは開いているファイルや占有メモリなど、プロセスのすべてのリソースを解放します。ただし、特定の情報(プロセスID、終了コード、プロセスの終了ステータス、プロセスのCPU時間など)は保持され、データはシステムまで保持されます。親プロセスがwait /waitpidによってフェッチされるまで、それをその親プロセスに渡します。

3.解決策:

(1)親プロセスは、waitやwaitpidなどの関数で子プロセスが終了するのを待っているため、親プロセスがハングします。

wait()またはwaitpid()システムコールを実行すると、子プロセスは終了後すぐにプロセステーブル内のデータを親プロセスに返し、システムはただちにエントリポイントを削除します。この場合、無効プロセスは生成されません。

(2)親プロセスが非常にビジーな場合は、signal関数を使ってSIGCHLD用のハンドラをインストールできます。子プロセスが終了した後、親プロセスはシグナルを受信し、ハンドラ内で待機リサイクルを呼び出します。

(3)子プロセスの終了時に親プロセスが気にしない場合は、signal(SIGCLD、SIG_IGN)またはsignal(SIGCHLD、SIG_IGN)を使用して、子プロセスの終了に関心がないことをカーネルに通知できます。プロセスが終了すると、カーネルはリサイクルして親プロセスにシグナルを二度送信することはなくなります。親プロセスは子プロセスを分岐し、それから作業を続け、子プロセスは孫プロセスを分岐して終了します。 Sunのプロセスはinitによって引き継がれ、グランドプロセスが終了した後、initはリサイクルされます。ただし、子プロセスのリサイクルは単独で行わなければなりません。


Copyright © Windowsの知識 All Rights Reserved