例外(ソフトウェア割り込み)のみが信号で通知されると思いますが、ハードウェア割り込みの場合はどうでしょうか。
どこから始めますか?さまざまなケースがあります。割り込みは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つの違いは、割り込みマスキングがハードウェアに実装されていることです。