4

プログラミングで信号を使用するのは初めてではありません。私は主に C/C++ と Python で作業しています。しかし、Linux (または Windows) でシグナルが実際にどのように実装されているかを知りたいと思っています。

OS は、信号記述子テーブル内の各 CPU 命令の後に、処理する登録済み信号が残っているかどうかをチェックしますか? それとも、プロセスマネージャー/スケジューラーがこれを担当していますか?

シグナルが非同期であるため、CPU 命令が完了する前に割り込むというのは本当ですか?

4

3 に答える 3

6

OS は、すべての命令を確実に処理するわけではありません。とんでもない。遅すぎる。

CPU が問題 (0 による除算、制限されたリソースまたは物理メモリによってバックアップされていないメモリ位置へのアクセスなど) に遭遇すると、例外と呼ばれる特別な種類の割り込みを生成します (C++/Java と混同しないでください)。 /etc 高水準言語例外要約)。

OS はこれらの例外を処理します。必要に応じて、可能であれば、例外を発生元のプロセスに反映させることができます。Windowsのいわゆる構造化例外処理(SEH) は、この種の反映です。C シグナルは、同じメカニズムを使用して実装する必要があります。

于 2012-10-01T10:59:52.810 に答える
4

私がよく知っているシステムでは (他の場所と大きく異なる理由はわかりませんが)、プロセスがカーネルからユーザー モードに戻ったときにシグナル配信が行われます。

最初に 1 つの CPU の場合を考えてみましょう。シグナルには 3 つのソースがあります。

  • プロセスはそれ自体にシグナルを送信します
  • 別のプロセスがシグナルを送信します
  • 割り込みハンドラー (ネットワーク、ディスク、USB など) により、シグナルが送信されます。

これらすべてのケースで、ターゲット プロセスはユーザーランドではなく、カーネル モードで実行されています。システムコール、またはコンテキストスイッチ (ターゲットプロセスが実行されていない限り、他のプロセスはシグナルを送信できないため)、または割り込みハンドラーを介してのいずれかです。したがって、シグナル配信は、カーネルモードからユーザーランドに戻る直前に配信されるシグナルがあるかどうかを確認するだけの簡単な問題です。

マルチCPUの場合、ターゲットプロセスが別のCPUで実行されている場合、実行中のCPUに割り込みを送信するだけです。割り込みは、もう一方の CPU を強制的にカーネル モードに戻してから戻す以外には何もしません。

于 2012-10-01T13:18:03.033 に答える
2

プロセスは別のプロセスにシグナルを送ることができます。プロセスは、シグナルを処理する独自のシグナル ハンドラを登録できます。SIGKILL と SIGSTOP は、キャプチャできない 2 つのシグナルです。

プロセスがシグナル ハンドラを実行すると、同じシグナルがブロックされます。つまり、シグナル ハンドラが実行されているときに、別の同じシグナルが到着した場合、シグナル ハンドラは呼び出されません [シグナルをブロックすると呼ばれる]。到着しました[つまり、保留中の信号]。すでに実行中のシグナルハンドラが実行されると、保留中のシグナルが処理されます。保留中のシグナルを実行したくない場合は、シグナルを無視できます。

上記の概念の問題は次のとおりです。

以下を想定してください: プロセス A は SIGUSR1 のシグナルハンドラを登録しています。

  1) process A gets signal SIGUSR1, and executes signalhandler()
  2) process A gets SIGUSR1,
  3) process A gets SIGUSR1,
  4) process A gets SIGUSR1,

ステップ(2)が発生すると、「保留シグナル」になりますか。すなわち; 提供する必要があります。そして、ステップ (3) が発生すると、使用可能な信号ごとに保留中の信号を示すために使用できるビットが 1 つしかないため、無視されます。

このような問題を回避するには、つまり、シグナルを失いたくない場合は、リアルタイムシグナルを使用できます。

2) シグナルは同期的に実行されます。

例えば。、

     1) process is executing in the middle of signal handler for SIGUSR1,

     2) Now, it gets another signal SIGUSR2, 

     3) It stops the SIGUSR1, and continues with SIGUSR2, 
        and once it is done with SIGUSR2, then it continues with SIGUSR1. 

3)IMHO、プロセスにシグナルが到着したかどうかを確認することについて私が覚えていることは次のとおりです。

1) When context switch happens.

これがある程度役立つことを願っています。

于 2012-10-01T11:14:54.427 に答える