シグナル実行の詳細

シグナル実行の詳細

私は「シグナル」に関する Linux ドキュメントをいくつか読んでいますが、まだ次のような疑問が頭の中で渦巻いています。

1) 「シグナル」ハンドラ実行'ターゲット'プロセスが実行トークンからスケジューラ?

2) または「シグナル」ハンドラ実行開催場所何でもプロセス「コンテキスト」が発生する実行する「シグナル」が送信されたのはいつですか? (ハードウェア ISR と同じスタイル)。

3) プロセス実行について優先事項? 彼らは「信号」を扱うときに流されてしまうのでしょうか?

答え1

1) シグナルハンドラは、次に対象プロセスカーネル モードからユーザー モードに戻ります。

これは、プロセスがハードウェア割り込み後に再度実行されるようにスケジュールされているとき (そして、プロセスがカーネル モードでまだ実行されていなかったとき)、またはプロセスがシステム コールから戻ったとき (一部のアーキテクチャでは、これらは同じことです) に発生します。

通常の操作では、カーネル モードを終了すると、プロセスは、最初にユーザー モードを終了した時点の次の命令に戻るだけです。

しかし、あなたのプロセスにシグナルが保留中の場合、カーネルはリライトプロセスのコンテキストが変更され、ユーザー モードへの戻りがシグナル ハンドラーの最初の命令に移動し、スタックは、ユーザー モードを終了した時点でシグナル ハンドラーに「特別な」サブルーチン呼び出しを行ったように見えるように変更されます (この「特別な」サブルーチン呼び出しからの戻りには、元の状態を復元するためのシステム コールの実行が含まれます)。

詳細についてはこれこれそしてこれ

それで「ターゲット」プロセスは、実行トークンからスケジューラシグナル ハンドラが最終的に実行されるまで、任意の回数だけ実行されます (何らかの理由でカーネル モードのままになっている場合)。

2) いいえ - シグナル ハンドラーは、プロセスのユーザー モード コンテキストでのみ実行されます。

3) 実際には実行されていない優先事項Linuxのようなタイムシェアリングシステムでは、ニースプロセスの価値なので、追い払うそこに存在しないもの。


物事はスレッドやいわゆるリアルタイムスケジューリングポリシーは異なるため、上記のコメントは非リアルタイムスケジューリングポリシーで実行されているシングルスレッドプロセスにのみ有効です(古き良き時代に:-)。

関連情報