回答:
SIGKILLはオペレーティングシステム/カーネルによって完全に処理されるため、プログラムは実際にはSIGKILLシグナルを受信することはありません。
特定のプロセスのSIGKILLが送信されると、カーネルのスケジューラーはすぐにそのプロセスにユーザー空間コードを実行するためのCPU時間を与えることを停止します。スケジューラがこの決定を行うときに、プロセスに他のCPU /コアでユーザー空間コードを実行するスレッドがある場合、それらのスレッドも停止します。(シングルコアシステムでは、これははるかに単純でした。システム内の唯一のCPUコアがスケジューラを実行している場合、定義上、同時にプロセスを実行していませんでした!)
プロセス/スレッドがSIGKILLの時点でカーネルコード(たとえば、システムコール、またはメモリマップファイルに関連付けられたI / O操作)を実行している場合、少し複雑になります。一部のシステムコールのみが割り込み可能です。カーネルは、システムコールまたはI / O操作が解決されるまで、プロセスを特別な「死にかけている」状態として内部的にマークします。これらを解決するためのCPU時間は、通常どおりスケジュールされます。割り込み可能なシステムコールまたはI / O操作は、それらを呼び出したプロセスが適切な停止ポイントで停止しているかどうかを確認し、その場合は早期に終了します。割り込み不可能な操作は完了するまで実行され、ユーザー空間コードに戻る直前に「死にかけている」状態をチェックします。
インプロセスカーネルルーチンが解決されると、プロセスの状態が「死んでいる」から「デッド」に変更され、プログラムが正常に終了したときと同様に、カーネルがクリーンアップを開始します。クリーンアップが完了すると、128を超える結果コードが割り当てられ(プロセスがシグナルによって強制終了されたことを示します。乱雑な詳細についてはこの回答を参照してください)、プロセスは「ゾンビ」状態に移行します。 。強制終了されたプロセスの親は、SIGCHLDシグナルで通知されます。
その結果、プロセス自体は、SIGKILLを受け取った情報を実際に処理する機会を得ることはありません。
プロセスが「ゾンビ」状態にある場合、そのプロセスはすでに死んでいますが、その親プロセスは、wait(2)
システムコールを使用して死んだプロセスの終了コードを読み取ることでこれをまだ確認していません。基本的に、ゾンビプロセスが消費する唯一のリソースは、PID、終了コード、およびその終了時のプロセスの他の「重要な統計」を保持するプロセステーブルのスロットです。
親プロセスが子プロセスの前に停止した場合、孤立した子プロセスは自動的にPID#1に採用されますwait(2)
。
ゾンビプロセスがクリアされるのに数分かかる場合は、ゾンビの親プロセスが悪戦苦闘しているか、ジョブを適切に実行していないことを示唆しています。
Unixライクなオペレーティングシステムでゾンビの問題が発生した場合の対処方法については、「ゾンビ自体はすでに死んでいるので、何もできません。代わりに、邪悪なゾンビマスターを殺してください」という言葉があります。(つまり、面倒なゾンビの親プロセス)
ps
。「S」は、シグナルを配信するためにカーネルがキャンセルできるI / O待機を表し、「D」は、配信できないものを表します。