プロセステーブルからゾンビプロセスを削除する

プロセステーブルからゾンビプロセスを削除する

親プロセスが死んだ子プロセスの終了ステータスを受け取ると、wait実際に子プロセスのメモリを再割り当てし、プロセステーブルから削除する人が誰であるかを説明できますか?

答え1

プロセステーブルとメモリマップの操作は常にカーネルの操作です。プロセスがシステムコールを行うと、カーネルはアクションを取ります。プロセスが終了すると、プロセスが使用したすべてのリソース(プロセステーブルのエントリを除くメモリを含む)が削除されます。これが_exitシステムコールが実行するアクションです。次に、親プロセスがまたはをwait呼び出すとき、waitpidそのシステムコール操作の一部はプロセステーブルエントリをクリーンアップすることです。親プロセスはwait必要に応じて呼び出すことができます(親プロセスがあればほぼ常にinit呼び出さwaitれます)。

答え2

カーネルは、親プロセスが自分が分岐する子プロセスの結果を知りたいと仮定します。子プロセスが終了すると、自動的にSIGCHLD親プロセスにシグナルを送信します。親プロセスが明示的にSIGCHLDシグナルを無視すると、子プロセスはすぐにクリーンアップされ、完全に削除されます(そしてゾンビプロセスにはなりません)。それ以外の場合、親プロセスが子プロセスwaitから終了ステータスを取得する関数の1つを呼び出すまで、子プロセスはゾンビプロセスになります。

状態が検索されない場合、子はゾンビのままです。ただし、親プロセスが子プロセスの前に終了すると、子プロセスがinit採用され(プロセス1)、すぐに状態を収集してゾンビプロセスを効果的に削除します。

関連情報