SIGKILL信号を送信するときにプログラムは何をしますか?

SIGKILL信号を送信するときにプログラムは何をしますか?

プログラムを終了するとkillall -9 name状態がゾンビになります。数分後に実際に停止しました。それでは、この数分間何が起こったのでしょうか。

ベストアンサー1

SIGKILLはオペレーティングシステム/カーネルによって完全に処理されるため、プログラムは実際にSIGKILL信号を受信しません。

特定のプロセスに対して SIGKILL が送信されると、カーネルスケジューラはそのプロセスにユーザー空間コードを実行するためのより多くの CPU 時間の提供を即座に停止します。スケジューラがこの決定を下すと、プロセスに別のCPU /コアでユーザースペースコードを実行するスレッドがある場合、そのスレッドも停止します。 (シングルコアシステムでは、これははるかに簡単でした。システムの唯一のCPUコアがスケジューラを実行している場合、定義上、そのプロセスを同時に実行しません!)

SIGKILLが呼び出されたときにプロセス/スレッドがカーネルコード(たとえば、メモリマッピングファイルに関連するシステムコールまたはI / O操作)を実行すると、状況は少し難しくなります。特定のシステムコールのみが割り込み可能であるため、カーネルは内部的にプロセスを次のように表示します。システムコールまたはI / O操作が解決されるまで、特別な「死んだ」状態にあります。これらの問題を解決するためのCPU時間は通常どおり割り当てられます。割り込み可能なシステムコールまたはI / O操作は、それを呼び出すプロセスが適切な停止点で終了したかどうかを確認し、その場合は早く終了します。中断されていないジョブは完了するまで実行され、ユーザー空間コードに戻る前に「死んだ」状態を確認します。

プロセス内のカーネルルーチンが解決されると、プロセスの状態が「dead」から「dead」に変わり、カーネルはプログラムが正常に終了したときと同様にそれをクリーンアップし始めます。クリーンアップが完了すると、128より大きい結果コードが割り当てられます(プロセスが信号によって終了したことを示します)。混乱した詳細については、この回答を参照してください。)、プロセスは「ゾンビ」状態に変換されます。終了したプロセスの親プロセスはSIGCHLDシグナル通知を受け取ります。

したがって、プロセス自体は、受信したSIGKILLメッセージを実際に処理する機会がまったくありません。

プロセスが「ゾンビ」状態にあるということは、プロセスは終了しましたが、その親プロセスがwait(2)システムコールを使用して終了したプロセスの終了コードを読み取ってそれを確認しなかったことを意味します。デフォルトでは、ゾンビプロセスが消費する唯一のリソースは、プロセスの終了時にプロセスのPID、終了コード、およびその他のプロセスの「重要な統計情報」を保持するプロセステーブルのスロットです。

wait(2)親プロセスが子プロセスの前に終了すると、孤立プロセスがゾンビとして存在しないように呼び出す必要がある特別な責任を持つPID#1によって、孤立プロセスが自動的に採用されます。

ゾンビプロセスをクリアするのに数分かかる場合、ゾンビプロセスが困難になっているか、正しく動作しません。

以下は、UNIXファミリーのオペレーティングシステムでゾンビの問題について何をすべきかについての冗談の説明です。 「ゾンビはすでに死んでいるので、ゾンビ自体については何もできません。邪悪なゾンビマスターを倒す!(つまり、面倒なゾンビの親プロセス)

おすすめ記事