web-dev-qa-db-ja.com

信号実行の詳細

「シグナル」に関するLinuxのドキュメントを読んでいますが、まだこれらの質問が頭に浮かびます。

1)「シグナル」ハンドラー実行は、「ターゲット」プロセスが実行トークンをから受信したときに実行されます。スケジューラー

2)または「シグナル」ハンドラーExecutionwhateverプロセスで発生します 'context'は発生します実行中「シグナル」が送信されたとき? (ハードウェアISRと同じスタイル)。

3)プロセスの実行はどうですかpriorities? 「信号」を処理するときにそれらは一掃されますか?

3
fante

1)次にターゲットプロセスがカーネルモードからユーザーモードに戻ったときに、シグナルハンドラが実行されます。

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

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

ただし、シグナルがプロセスに対して保留中の場合、カーネルはプロセスコンテキストを[////]再書き込みするため、ユーザーモードに戻ると、代わりにシグナルハンドラーの最初の命令とスタックは、最初にユーザーモードを終了した時点でシグナルハンドラーに対して「特別な」サブルーチン呼び出しを行ったように見えるように変更されます(この「特別な」サブルーチン呼び出しからの復帰には、元の状態を復元するためのシステム呼び出しが含まれます)。

詳細については、 thisthis および this をお読みください。

したがって、「ターゲット」プロセスは、シグナルハンドラが最終的に実行される前に、スケジューラから実行トークンを何度でも受け取る可能性があります。 (何らかの理由でカーネルモードのままである場合)。

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

3)Linuxなどのタイムシェアリングシステムでは、プロセスのNice値を数えない限り、実際には実行されませんprioritiesなので、一掃そこにないもの。


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

4
Murray Jensen