現在、ユーザースペースプロセスのコンテキストでカーネルモードで実行されている非常に時間がかかるシステムコールがあるとします。これらのシステムコールが実行されている間、システムコールはユーザープロセスSIGKILL
に送信されます。この場合、何が起こりますか?プロセスはすぐに終了するか、システムコールが終了するのを待ちますか?プロセスが即座に終了すると、割り込みハンドラの実行中にユーザースペースプロセスが終了した場合にも同じように適用されます(割り込みハンドラは任意のユーザースペースプロセスのコンテキストで実行される可能性があるため)奇妙に聞こえますが、非常に重要です。割り込みハンドラの操作が中断される可能性があります。
答え1
一部のシステムコールは中断されることがあります(例を参照siginterrupt(3)
)。それ以外の場合は、呼び出しがユーザーモードに戻ったときにのみ信号が転送されます。
答え2
非常に時間がかかるシステムコールの例はですpause()
。プロセスが信号を受信しない場合は完了しません。
read()
シリアルラインから読み取るときなど、中断可能(より良い用語は「シグナリング可能」)またはブロックデバイスから読み取るときなど、中断できません。
なぜ?元のUNIXロジックは次のとおりです。シリアルラインで入力が利用可能かどうかはわかりません。したがって、何も入力しなくてもシステムコールを終了する方法が必要です。一方、ブロックデバイスからの読み出しは常に完了しますが、ディスクに障害が発生するとエラーが発生する可能性があります。
Unixはたくさん進歩しました。今日、無中断read()
は可能ですが、決して完全ではありません。例:NFSサーバーがダウンしてマウントされたときにNFSマウントファイルシステムから読み取られますhard
。
答え3
実際の割り込みハンドラはカーネルにあり、ユーザープロセスと実際の関連付けはありません。シグナルハンドラは、ユーザプロセスが割り込みハンドラに最も近いものです。一部の信号は信号処理中にブロックされますが、SIGKILLはそのうちの1つではないため、他のユーザーコードと同様にすぐに終了します。
答え4
シグナル(通常はプロセスコンテキストを復元する特権アセンブリ命令)は、実行がユーザーモードに戻り(カーネルモードの終了など)、プロセスが実行されるようにスケジュールされている場合にのみ渡すことができ、ユーザーモードを設定または設定しません。かもしれません。プロセスがシステムコールにある場合) - これは、システムコールが返されたとき、または割り込みハンドラが返されたときです。
特定の質問に答えるためにシステムコールが終了するのを待ち(割り込みまたはそうでない場合があります)、割り込みハンドラがプロセスに返された場合(つまり、カーネルモードに戻る)ユーザーモードではない場合、プロセスはシステムコールで後で返されるまで(つまり、ユーザーモードで返されるまで)シグナルは転送されません。
システムコールが中断され(EINTRが返され)、「再起動可能」の場合、シグナルハンドラが実行された後にシステムコールインターフェイスをサポートするユーザーコードは、ユーザーコードに戻ることなくシステムコールを自動的に再入力することを選択できます。
また確認これ出て...
最後に、ここで意味するのは、プロセスがシステムコールから決して返されない場合(結果的に「終了できない」プロセスが発生した場合)、SIGKILLを含む信号がプロセスに転送されないことです。