44

さまざまな参考資料に基づいて、Linuxでのシグナルの主観的な定義は、「特定のイベントの発生についてプロセスに通知するために使用されるトリガーです。ここでのイベントはソフトウェア例外を指す場合があります。さらに、シグナルはIPCメカニズムにも使用される場合があります。 「」私が持っている質問は

  • 例外(ソフトウェア割り込み)のみが信号で通知されると思いますが、ハードウェア割り込みの場合はどうでしょうか。
  • 信号のさまざまなソースは何ですか?私には、カーネルが常にシグナルのソースであるように見えます(IPCに使用される場合を除く)
  • シグナルハンドラとISRの違いは?
  • 信号ブロッキングと割り込みマスキングの違いは?
4

3 に答える 3

112

割り込みは、CPUとOSカーネル間の通信手段と見なすことができます。シグナルは、OSカーネルとOSプロセス間の通信手段と見なすことができます。

割り込みは、CPU(例外-例:ゼロ除算、ページフォールト)、デバイス(ハードウェア割り込み-例:入力可能)、またはCPU命令(トラップ-例:syscalls、ブレークポイント)によって開始される場合があります。これらは最終的にCPUによって管理され、CPUは現在のタスクを「中断」し、OSカーネルが提供するISR/割り込みハンドラーを呼び出します。

シグナルは、OSカーネル(例:SIGFPE、SIGSEGV、SIGIO)、またはプロセス(kill())によって開始される場合があります。それらは最終的にOSカーネルによって管理され、ターゲットスレッド/プロセスに配信され、一般的なアクション(コアの無視、終了、終了、ダンプ)またはプロセス提供のシグナルハンドラーのいずれかを呼び出します。

于 2012-11-14T14:29:23.113 に答える
60

例外(ソフトウェア割り込み)のみが信号で通知されると思いますが、ハードウェア割り込みの場合はどうでしょうか。

どこから始めますか?さまざまなケースがあります。割り込みはCPUを呼び出すハードウェアであることに注意してください。割り込みは基本的に「ハードウェアに注意が必要」と0〜255の数値で構成されます。信号は似ていますが、宛先プロセスIDとint(アーチに応じて32ビットまたは64ビット)の2つのパラメータがあります。ハードウェア割り込みは常にカーネルスペースで処理されますが、シグナルはユーザースペースのみのものです。カーネルはさまざまな理由でハードウェア割り込みを使用します。

信号とは関係のないハードウェア割り込みの一例は、VMサブシステムです。最近のオペレーティングシステムでは、システムに実際に存在するよりも多くのメモリを割り当てることができます。では、これはどのように機能しますか?それは、ハードウェア割り込みを利用することで機能します。メモリを割り当てると、カーネルはそれを記録しますが、実際には何もしません。次に、割り当てられたメモリにアクセスしようとすると、CPUは「しかし、このメモリは存在しません」と文句を言い、ハードウェア割り込みを生成します。カーネルはそのメモを調べて、実際にそのメモリを要求したことを確認し、空きメモリをクリアして、CPUにそのメモリを予想される場所に「マップ」するように指示します。

マルチタスクは、ハードウェア割り込みを利用することによっても実装されます。すべてのドライバーは通常、割り込みを解釈することによって機能します。

シグナルは、プロセス間の通信に使用されます。非常に「シグナルy」なものは、LinuxデーモンがSIGHUPに構成をリロードするための一般的な動作であり、世界中のシステム管理者に愛され、嫌われています。たとえば、apache構成を変更しても、プロセスは新しい構成の使用を自動的に開始しません。プロセスを終了して再開することもできますが、これは、httpサーバーが4〜5秒停止することを意味します。したがって、代わりに「killall-HUPapache」を使用できます。これにより、apacheプロセスでサブルーチンが呼び出され、構成ファイルが再度読み取られます。

プロセスの一時停止は、シグナル(ctrl-z)、プロセスの割り込み(ctrl-c)、プロセスの終了(ctrl-)、端末の切断(sighup)などを介して実装されます...より完全なリストはここにあります:http:// en .wikipedia.org / wiki/Unix_signal

結論の1つは、それらは似ているということかもしれませんが、それらは異なるレベルで動作します。ハードウェア割り込みは、ハードウェアが注目を集めており、最低レベルのソフトウェアが義務付けています。通常、カーネルはすべてのハードウェアを処理し、プロセスへの通知はハードウェア割り込みとはある程度独立して行われます。いくつかのシグナルについてはデフォルトの処理が提供され(例えば、ctrl-z、ctrl-c、...)、他のシグナルについては、実装は非常にアプリケーションに依存します(例えば、SIGHUP)。

信号に関して言えば、これらはソフトウェアで定義されたものです。彼らはあなたが彼らにしたいことを何でもします、そしてLinuxはこれらのサブルーチンを呼び出すための便利なメソッドを持っています。場合によっては、カーネルがシグナルルーチン(SIGSEGV、SIGCHILDなど)を呼び出すこともありますが、ハードウェアが関与することはほとんどありません。これらは、アプリケーションで特定のルーチンをトリガーするための便利な方法です。

DOS 21hでは、「OS」割り込みという特殊なケースがありました。これはもう使用されていません(まだ機能していますが)が、アイデアはこれです。プログラムは、特定の割り込みをトリガーして、カーネルに特定のアクションを実行するように要求できます。アクションはシステムコールです(ファイルを開く、ソケットを閉じる、何をしますか)。私が言ったように、興味深いですが、もはや実際には使用されていません。

信号のさまざまなソースは何ですか?私には、カーネルが常にシグナルのソースであるように見えます(IPCに使用される場合を除く)

シグナルは、プロセス自体(SIGABRT)、カーネル(SIGSEGV、...)、またはシェルなどの他のプロセス(ctrl-z、ctrl-c、ctrl-\、...)から送信されます。殺害から。ただし、kill libc関数を使用することで、他のプログラムから取得できます。

   #include <sys/types.h>
   #include <signal.h>

   int kill(pid_t pid, int sig);

シグナルハンドラとISRの違いは?

主な違いは、ISRはカーネル空間に存在し、実行中にコンピューター全体がフリーズすることを考慮に入れる必要があることです。これは、それらがカーネル内のすべてのプロセスおよびすべてを中断した可能性があることを意味します。彼らはまた「世界を止める」。割り込みが処理されている間、他には何も起こりません。したがって、割り込みハンドラが何かを待つと、マシンがフリーズします。割り込みハンドラーがループに入った場合、唯一のオプションはマシンを再起動することです。

ISRを正しく理解するのは非常に困難です。それらには多くの理論があります。Linuxでは、上半分と下半分のセクションがあり、あらゆる種類の優先順位の処理、特別なメモリ割り当てなどがあります...そしてそれは地雷原です。ISRで間違った方向に一歩進むと、マシンが停止します。ISRにバグがあると、データが失われ、ハードウェアに完全な障害が発生する可能性があります。実際、経験から言えば、ISRで何か間違ったことをすることを計画しているのではないかという疑いを提起するだけで、すぐに完全に予測できないマシンの動作になります。

ISRではカーネル機能を使用できません。ファイルを開く、それを忘れてください。メモリを割り当てて、それを忘れてください。カーネルの他の部分を呼び出す場合は、それを忘れてください(いくつかの例外がありますが、ほんのわずかです)。リストは続きます。

シグナルは、呼び出される特定のプロセスの関数にすぎません。シグナルがブロックされる可能性があり(たとえば、ctrl-z)、これによりプロセスの進行が停止しますが、たとえば、シェルセッションは引き続き応答します。もちろん、プログラムのいずれかの部分が中断された可能性があることをプロセスで考慮する必要がありますが、それでも通常のユーザースペースです。ブロックしたり、ループしたり、ファイルを開いたり、メモリを割り当てたり、...好きなようにできます。

信号ブロッキングと割り込みマスキングの違いは?

それらは非常に似ています。シグナルブロッキングがプロセスごとに行われることを除いて。どちらの場合も、ブロックできない信号があり、NMI(マスク不可割り込み)があります(どちらも重大なエラーを示します)。

最後に、シグナルと割り込みは、カーネルまたは特定のプロセスのいずれかに番号を送信しています。信号ブロッキングと割り込みマスキングは、特定の番号を無視するようにシステムに指示することを意味します。

1つの違いは、割り込みマスキングがハードウェアに実装されていることです。

于 2012-11-21T11:25:24.527 に答える
2

信号と割り込みは非常によく似た方法で動作します。違いは、シグナルはプロセス(仮想環境に存在する)に発生しますが、例外はシステム全体に発生することです。

特定の障害は、CPUによって例外としてフラグが付けられ、カーネルによってプロセスに配信される信号にマップされます。カーネルは、プロセスから例外を非表示にすることを選択できます(たとえば、マップされていないメモリへのアクセスは、ページングによってサイレントに修正されます)。

ハードウェア割り込みは単なる例外の一種であり、カーネルがシグナルにマップすることを選択する場合があります(たとえば、を使用する場合alarm(2))。

カーネルは、例外、I / O完了、明示的なユーザースペース要求など、さまざまなイベントに応答してシグナルを生成します。

シグナルハンドラーはISRと同様に動作します(いつでも呼び出すことができるため、ISRのようにプログラムの状態について推測することはできません)。また、ブロッキングシグナルは、仮想アドレス空間内でマスキング割り込みと同じように動作します。物理マシン上。

于 2012-11-12T10:35:22.407 に答える