
デジタルコンピュータでは、割り込み[ a ]は、プロセッサが現在実行中のコードを中断し(許可されている場合)、イベントをタイムリーに処理できるようにするための要求です。要求が受け入れられると、プロセッサは現在の動作を中断し、状態を保存し、割り込みハンドラ(または割り込みサービスルーチン、ISR)と呼ばれる関数を実行してイベントを処理します。この中断は多くの場合一時的なものであり、割り込みハンドラが終了するとソフトウェアは[ b ]通常の動作を再開できますが、割り込みが致命的なエラーを示す場合もあります。[ 3 ]
割り込みは、ハードウェア デバイスが時間的に注意を要する電子状態または物理状態の変化を示すためによく使用されます。割り込みは、特にリアルタイム コンピューティングにおいて、コンピュータのマルチタスクやシステム コールを実装するためにもよく使用されます。このように割り込みを使用するシステムは、割り込み駆動型であると言われます。[ 4 ]
ハードウェア割り込みは、ポーリングループで外部イベントを待つ非生産的な待機時間を排除する最適化として導入されました。このアプローチを採用した最初のシステムは、1954年に完成したDYSEACでしたが、それ以前のシステムでもエラートラップ機能は提供されていました。[ 5 ]
UNIVAC 1103Aコンピュータは、1953 年に割り込みを最初に使用したコンピュータとして一般的に知られています。[ 6 ] [ 7 ]それ以前のUNIVAC I (1951 年) では、「算術オーバーフローが発生すると、アドレス 0 で 2 命令の修正ルーチンが実行されるか、プログラマの選択によりコンピュータが停止しました。」 IBM 650 (1954 年) は、割り込みマスキングを初めて採用しました。国立標準局 DYSEAC (1954 年) は、I/O に割り込みを使用した最初のコンピュータでした。 IBM 704 は、分岐命令に遭遇したときに特別なルーチンを呼び出すことができる「転送トラップ」を備え、デバッグに割り込みを使用した最初のコンピュータでした。MITリンカーン研究所TX-2システム (1957 年) は、複数のレベルの優先度割り込みを提供した最初のコンピュータでした。[ 7 ]

割り込み信号は、ハードウェアまたはソフトウェアのイベントに応じて発行されます。これらはそれぞれ、ハードウェア割り込みまたはソフトウェア割り込みに分類されます。特定のプロセッサの場合、割り込みの種類数はアーキテクチャによって制限されます。
ハードウェア割り込みとは、ハードウェアの状態に関連する状態であり、外部ハードウェアデバイス(例えば、 PC の割り込み要求(IRQ) ライン)によって通知される場合もあれば、プロセッサロジックに組み込まれたデバイス(例えば、IBM System/370 の CPU タイマー)によって検出され、デバイスがオペレーティングシステム(OS) [ 8 ]または、OS がない場合はCPU 上で実行されているベアメタルプログラムからの注意を必要としていることを通知する場合もあります。このような外部デバイスは、コンピュータの一部(例えば、ディスクコントローラ)である場合もあれば、外部周辺機器である場合もあります。例えば、キーボードのキーを押したり、 PS/2 ポートに接続されたマウスを動かしたりすると、ハードウェア割り込みが発生し、プロセッサがキーストロークやマウスの位置を読み取るようになります。
ハードウェア割り込みは、プロセッサクロックに対して非同期で、命令実行中の任意の時点で発生する可能性があります。そのため、すべてのハードウェア割り込み信号は、プロセッサクロックに同期させることで処理され、命令実行の境界でのみ処理されます。
多くのシステムでは、各デバイスに特定のIRQ信号が割り当てられています。これにより、どのハードウェアデバイスがサービスを要求しているかを迅速に特定し、そのデバイスのサービスを迅速に行うことが可能になります。
1964年のCDC 3600 [ 9 ]のような古いシステムでは、すべての割り込みが同じ場所に移動し、OSは特別な命令を使用して、最も優先度の高い未処理のマスクされていない割り込みを決定していました。現代のシステムでは、一般的に、割り込みの種類ごと(または割り込みソースごと)に個別の割り込みルーチンがあり、多くの場合、1つ以上の割り込みベクタテーブルとして実装されています。
割り込みをマスクするとは、割り込みを無効にすることで、プロセッサによって遅延[ c ]または無視[ d ]されるのに対し、割り込みをアンマスクするとは、割り込みを有効にすることである。 [ 10 ]
プロセッサは通常、ハードウェア割り込みを選択的に有効化(および無効化)できる内部割り込みマスクレジスタ[ e ]を備えています。各割り込み信号は、マスクレジスタのビットに関連付けられています。一部のシステムでは、ビットがセットされているときに割り込みが有効になり、ビットがクリアされているときに割り込みが無効になります。他のシステムでは、その逆で、ビットがセットされていると割り込みが無効になります。割り込みが無効になると、関連付けられた割り込み信号はプロセッサによって無視される場合もあれば、保留状態のままになる場合もあります。マスクの影響を受ける信号は、マスク可能な割り込みと呼ばれます。
割り込み信号の中には、割り込みマスクの影響を受けず、無効にできないものがあります。これらは非マスク割り込み(NMI)と呼ばれます。これらは、ウォッチドッグタイマーからのタイムアウト信号など、いかなる状況でも無視できない高優先度イベントを示します。SPARC に関しては、非マスク割り込み(NMI)は割り込みの中で最も優先度が高いにもかかわらず、割り込みマスクを使用することで発生を防ぐことができます。[ 11 ]
障害モードの一つとして、ハードウェアが状態変化に対する期待される割り込みを生成せず、オペレーティングシステムが無限に待機状態になるケースが挙げられます。詳細によっては、この障害は単一のプロセスのみに影響する場合もあれば、システム全体に影響を及ぼす場合もあります。一部のオペレーティングシステムには、このような障害に対処するための専用コードが実装されています。
例えば、IBM Operating System/360 (OS/360) は、テープがテープドライブにマウントされたときに、準備完了状態から準備完了状態へのデバイス側割り込みに依存しており、その割り込みが発生するか、またはシミュレートされるまでテープラベルを読み取りません。IBM は OS/360 にコードを追加し、VARY ONLINE コマンドがターゲットデバイス上でデバイス側割り込みをシミュレートするようにしました。
誤割り込みとは、発生源が特定できないハードウェア割り込みのことです。「ファントム割り込み」または「ゴースト割り込み」という用語も、この現象を表すのに使われることがあります。誤割り込みは、レベルセンシティブなプロセッサ入力に接続されたワイヤードOR割り込み回路に問題がある場合に発生しやすい傾向があります。このような割り込みは、システムが異常動作を起こした際に特定するのが困難な場合があります。
ワイヤードOR回路では、割り込みラインのバイアス抵抗を介して寄生容量が充電/放電されるため、プロセッサが割り込みソースがクリアされたことを認識するまでにわずかな遅延が発生します。割り込みサービスルーチン(ISR)内で割り込みデバイスがクリアされるのが遅すぎると、現在のISRインスタンスが終了する前に割り込み回路が静止状態に戻るのに十分な時間がありません。その結果、プロセッサの割り込み要求入力の電圧が、明確な内部論理1または論理0を確立するのに十分な高さまたは低さにならないため、プロセッサは別の割り込みが保留中であると認識します。見かけ上の割り込みには識別可能なソースがないため、「偽の」割り込みと呼ばれます。
誤った割り込みは、回路設計の欠陥、高ノイズレベル、クロストーク、タイミングの問題、またはまれにデバイスのエラーによる電気的異常の結果である場合もある。[ 12 ]
ISR(割り込みサービスルーチン)がそのような割り込みが発生する可能性を考慮していない場合、誤割り込みによってシステムがデッドロックしたり、その他の未定義の動作が発生したりする可能性があります。誤割り込みは主に有線OR割り込み回路で発生する問題であるため、このようなシステムでは、ISRがすべての割り込みソースのアクティビティをチェックし、いずれのソースも割り込みを発生させていない場合は(イベントをログに記録する場合を除き)何もアクションを実行しないようにするのが適切なプログラミング手法です。
ソフトウェア割り込みは、特定の命令の実行時、または特定の条件が満たされた際に、プロセッサ自身によって要求されます。すべてのソフトウェア割り込み信号は、特定の割り込みハンドラに関連付けられています。
ソフトウェア割り込みは、実行時に割り込みを発生させるように設計された特殊な命令を実行することによって意図的に発生する場合があります。 [ f ]このような命令はサブルーチン呼び出しと同様の機能を持ち、オペレーティングシステムサービスの要求やデバイスドライバとのやり取り(ストレージメディアの読み書きなど)といった様々な目的で使用されます。ソフトウェア割り込みは、プログラム実行エラーや仮想メモリシステムによっても発生する可能性があります。
通常、オペレーティングシステムのカーネルはソフトウェア割り込みを捕捉して処理します。一部の割り込みはプログラムに対して透過的に処理されます。たとえば、ページフォルトの通常の解決方法は、必要なページを物理メモリでアクセス可能にすることです。しかし、セグメンテーションフォルトなどの他のケースでは、オペレーティングシステムはプロセスコールバックを実行します。Unixライクなオペレーティングシステムでは、これにはSIGSEGV、SIGBUS、SIGILL、SIGFPEなどのシグナルを送信することが含まれます。このシグナルは、シグナルハンドラを呼び出すか、デフォルトのアクション (プログラムの終了) を実行します。Windows では、STATUS_ACCESS_VIOLATION や STATUS_INTEGER_DIVIDE_BY_ZERO などの例外コードを使用した構造化例外処理を使用してコールバックが行われます。 [ 13 ]システムコールに対する意図的なソフトウェア割り込みは、カーネル内のルーチンを呼び出して、システムコールによって要求された機能を実行する結果となります。
カーネルプロセスにおいては、本来発生すべきではない種類のソフトウェア割り込みがしばしば発生する。しかしながら、それらが意図せず発生すると、オペレーティングシステムのクラッシュにつながる可能性がある。
割り込み、トラップ、例外、フォールト、アボートという用語は、割り込みの種類を区別するために使用されますが、「これらの用語の正確な意味については明確な合意はありません」。[ 14 ]トラップという用語は、任意の割り込み、任意のソフトウェア割り込み、任意の同期ソフトウェア割り込み、または名前にトラップが含まれる命令によって引き起こされる割り込みのみを指す場合があります。一部の使用法では、トラップという用語は、モニタ プログラムまたはデバッガへのコンテキスト スイッチを開始することを目的としたブレーク ポイントを具体的に指します。[ 2 ]また、例外的な条件 (たとえば、ゼロ除算、無効なメモリ アクセス、不正なオペ コード)によって引き起こされる同期割り込みを指す場合もありますが、[ 14 ]この場合は例外という用語の方が一般的です。
x86 は割り込みを (ハードウェア)割り込みとソフトウェア例外に分類し、例外をフォルト、トラップ、アボートの 3 種類に分類します。[ 15 ] [ 16 ] (ハードウェア) 割り込みは I/O デバイスによって非同期的にトリガーされる割り込みで、プログラムの継続性を損なうことなく再開できます。[ 15 ]フォルトも再開可能ですが、命令の同期実行に結びついており、戻りアドレスはフォルトが発生した命令を指します。トラップはフォルトに似ていますが、戻りアドレスはトラップ命令の後に実行される命令を指します。[ 17 ]代表的な用途の 1 つはシステムコールの実装です。[ 16 ]アボートはハードウェアエラーやシステムテーブルの不正な値などの重大なエラーに使用され、多くの場合[ g ]プログラムの再開を許可しません。[ 17 ]
ARM は、すべてのタイプの割り込みを指す用語として例外を使用し、 [ 18 ]例外を (ハードウェア)割り込み、アボート、リセット、および例外生成命令に分類します。アボートは x86 例外に対応し、プリフェッチ アボート (命令フェッチの失敗) またはデータ アボート (データ アクセスの失敗) のいずれかであり、同期または非同期の場合があります。非同期アボートは正確または不正確な場合があります。MMU アボート (ページ フォルト) は同期です。[ 19 ]
RISC-Vでは、割り込みは全体的な用語として、また外部割り込みのサブセットとしても使用されます。内部割り込みは例外と呼ばれます。
各割り込み信号入力は、論理信号レベルまたは特定の信号エッジ(レベル遷移)によってトリガーされるように設計されています。レベルセンシティブ入力は、入力に特定の(高または低)論理レベルが印加されている限り、プロセッサに継続的にサービスを要求します。エッジセンシティブ入力は信号エッジに反応します。特定の(立ち上がりまたは立ち下がり)エッジによってサービス要求がラッチされ、割り込みハンドラが実行されるとプロセッサはラッチをリセットします。
レベルトリガー割り込みは、割り込み信号を特定の(ハイまたはローの)アクティブ論理レベルに保持することで要求されます。デバイスは、信号をアクティブレベルまで駆動し、そのレベルに保持することで、レベルトリガー割り込みを呼び出します。そして、プロセッサからの指示(通常はデバイスの処理が完了した後)に応じて、信号を反転させます。
プロセッサは、各命令サイクル中に割り込み入力信号をサンプリングします。サンプリング時に信号がアサートされている場合、プロセッサは割り込み要求を認識します。
レベルトリガー入力を使用すると、複数のデバイスが有線OR接続を介して共通の割り込み信号を共有できます。プロセッサはポーリングを行い、どのデバイスがサービスを要求しているかを判断します。デバイスのサービス処理後、プロセッサは再度ポーリングを行い、必要に応じて他のデバイスのサービスを提供してからISRを終了します。前述のように、レベルセンシティブ割り込み入力が有線OR回路に接続されているプロセッサは、不要な割り込みが発生しやすく、発生するとデッドロックやその他の致命的なシステム障害を引き起こす可能性があります。
エッジトリガー割り込みとは、割り込み線上のレベル遷移(立ち下がりエッジ(ハイからロー)または立ち上がりエッジ(ローからハイ))によって発生する割り込みのことです。割り込みを発生させたいデバイスは、割り込み線にパルスを出力した後、線を非アクティブ状態に戻します。
エッジトリガーの重要な点は、割り込みをトリガーするには信号が遷移する必要があるということです。例えば、遷移がハイレベルからローレベルの場合、立ち下がりエッジ割り込みが1回だけトリガーされ、ローレベルが継続してもそれ以上の割り込みはトリガーされません。次の割り込みをトリガーするには、信号がハイレベルに戻ってから再び立ち下がります。これは、レベルトリガーとは対照的です。レベルトリガーでは、信号がハイレベルに戻るまで、ローレベルが割り込みを発生させ続けます(割り込みが有効になっている場合)。
エッジトリガー型割り込みを備えたコンピュータには、保留中の割り込みの状態を保持する割り込みレジスタが含まれている場合があります。割り込みレジスタを備えたシステムには、一般的に割り込みマスクレジスタも備わっています。
プロセッサは各命令サイクル中に割り込みトリガー信号または割り込みレジスタをサンプリングし、検出された最も優先度の高い有効な割り込みを処理します。トリガー方法に関係なく、プロセッサは検出されたトリガーの次の命令境界で割り込み処理を開始し、以下のことを保証します。
割り込みを処理するためのアーキテクチャにはいくつかの種類があります。一部のアーキテクチャでは、最も優先度の高い有効な割り込みをスキャンする必要がある単一の割り込みハンドラ[ 20 ]があります。他のアーキテクチャでは、異なる割り込みタイプ[ 21 ] 、異なるI/Oチャネルまたはデバイス、あるいはその両方に対して個別の割り込みハンドラがあります[ 22 ] [ 23 ] 。 複数の割り込み原因が同じ割り込みタイプを持つ場合があり、したがって同じ割り込みハンドラを持つため、割り込みハンドラは原因を特定する必要があります[ 21 ] 。
割り込みは、CPUによってハードウェアで完全に処理される場合もあれば、CPUとプログラマブル割り込みコントローラやサウスブリッジなどの他のコンポーネントの両方によって処理される場合もある。
追加のコンポーネントを使用する場合、そのコンポーネントは割り込みデバイスとプロセッサの割り込みピンの間に接続され、通常利用可能な1つまたは2つのCPUラインに複数の割り込みソースを多重化します。メモリコントローラの一部として実装されている場合、割り込みはシステムのメモリアドレス空間にマッピングされます。
システムオンチップ(SoC)の実装では、割り込みはチップのさまざまなブロックから発生し、通常は1つまたは複数のプロセッサ(マルチコアシステムの場合)に接続された割り込みコントローラに集約されます。[ 24 ]
複数のデバイスは、設計上、エッジトリガー割り込みラインを共有できます。割り込みラインにはプルダウンまたはプルアップ抵抗が必要で、アクティブに駆動されていないときは、デフォルトの状態である非アクティブ状態になります。デバイスは、ラインを短時間非デフォルト状態に駆動することで割り込みを通知し、割り込みを通知していないときはラインをフローティング状態にします(アクティブに駆動しません)。このタイプの接続は、オープンコレクタとも呼ばれます。ラインは、すべてのデバイスによって生成されたすべてのパルスを伝送します。(これは、乗客が運転手に停車を要求するために引くことができる、一部のバスや路面電車のプルコードに似ています。)ただし、異なるデバイスからの割り込みパルスは、時間的に近接して発生すると合流する可能性があります。割り込みを失わないようにするには、CPUはパルスの後縁(たとえば、ラインがプルアップされてローに駆動されている場合は立ち上がりエッジ)でトリガーする必要があります。割り込みを検出した後、CPUはすべてのデバイスのサービス要件を確認する必要があります。
エッジトリガー割り込みは、レベルトリガー割り込みが抱える共有の問題を抱えていません。優先度の低いデバイスのサービスは任意に延期できますが、優先度の高いデバイスからの割り込みは引き続き受信され、処理されます。CPUが処理方法を知らないデバイスがあり、それが誤った割り込みを発生させる可能性がある場合でも、他のデバイスの割り込み信号に干渉することはありません。ただし、エッジトリガー割り込みは、例えば一定期間割り込みがマスクされている場合などに、見逃されやすいという問題があります。イベントを記録するハードウェアラッチがない限り、このイベントを回復することは不可能です。この問題は、プロセッサが何をするべきかを認識できなかったため、初期のコンピュータハードウェアで多くの「ロックアップ」を引き起こしました。より現代的なハードウェアでは、割り込み要求をラッチする1つ以上の割り込みステータスレジスタを備えていることが多く、適切に記述されたエッジ駆動割り込み処理コードは、これらのレジスタをチェックしてイベントの見逃しがないことを確認できます。
ISA( Industry Standard Architecture)バスはエッジトリガー割り込みを使用しますが、デバイスがIRQラインを共有できることを必須としているわけではありません。しかし、主流のISAマザーボードはすべてIRQラインにプルアップ抵抗を備えているため、適切に動作するISAデバイスがIRQラインを共有しても問題なく動作するはずです。パラレルポートもエッジトリガー割り込みを使用します。多くの古いデバイスはIRQラインを排他的に使用できることを前提としているため、IRQラインを共有すると電気的に危険です。
複数のデバイスが「同じラインを共有」して起動する方法は 3 つあります。1 つ目は、排他的導通 (スイッチング) または排他的接続 (ピンへの接続) です。2 つ目は、バス (すべて同じラインに接続され、リスニング状態) です。バス上のカードは、通信するタイミングと通信しないタイミングを把握する必要があります (ISA バス)。通信は、アキュムレータ ラッチまたはロジック ゲートの 2 つの方法でトリガーできます。ロジック ゲートは、キー シグナルを監視する継続的なデータ フローを想定しています。アキュムレータは、リモート側がゲートをしきい値を超えて励起したときにのみトリガーされるため、速度のネゴシエーションは不要です。それぞれに、速度と距離に対する利点があります。一般的に、トリガーとは励起を検出する方法のことです。立ち上がりエッジ、立ち下がりエッジ、しきい値 (オシロスコープはさまざまな形状と条件をトリガーできます)。
ソフトウェア割り込みのトリガーは、ソフトウェア(OSとアプリケーションの両方)に組み込まれている必要があります。C言語アプリケーションのヘッダーには、アプリケーションとOSの両方が認識し適切に使用するトリガーテーブル(関数のテーブル)があり、これはハードウェアとは関係ありません。ただし、CPUに信号を送るハードウェア割り込みと混同しないでください(CPUはソフトウェア割り込みと同様に、関数テーブルからソフトウェアを実行します)。
割り込み線(トリガー方式を問わず)を共有する複数のデバイスは、互いに偽の割り込みソースとして動作します。1本の線上に多数のデバイスが存在すると、割り込み処理の負荷はデバイス数に比例して増加します。そのため、利用可能な割り込み線全体にデバイスを均等に分散させることが望ましいです。割り込み線が個別の物理的な導体である旧来のシステム設計では、割り込み線の不足が問題となります。割り込み線が仮想であるメッセージシグナリング割り込みは、PCI Expressなどの新しいシステムアーキテクチャで好まれており、この問題を大幅に軽減します。
プログラミングインターフェースの設計が不十分なデバイスの中には、サービス要求があったかどうかを判断する手段がないものがあります。そのため、意図しないサービスを受けると、フリーズしたり、その他の不具合が発生したりする可能性があります。このようなデバイスは、不要な割り込みを許容できないため、割り込みラインの共有も許容できません。ISAカードは、多くの場合、設計と製造コストが安いため、この問題で悪名高いです。ハードウェアロジックが安価になり、新しいシステムアーキテクチャで割り込みの共有が必須となるにつれて、このようなデバイスはますます少なくなっています。
システムによっては、レベルトリガーとエッジトリガーを組み合わせたハイブリッド方式を採用している。ハードウェアはエッジを検出するだけでなく、割り込み信号が一定期間アクティブ状態を維持していることも検証する。
ハイブリッド割り込みの一般的な用途の一つは、NMI(マスク不可能な割り込み)入力です。NMIは通常、重大な、あるいは壊滅的なシステムイベントを通知するため、この信号の適切な実装では、割り込みが一定期間アクティブ状態を維持することを検証することで、割り込みが有効であることを保証しようとします。この2段階のアプローチにより、誤った割り込みがシステムに影響を与えることを防ぐことができます。
メッセージシグナル割り込みは、物理的な割り込み線を使用しません。代わりに、デバイスは、何らかの通信媒体(通常はコンピュータバス)を介して短いメッセージを送信することで、サービス要求を通知します。このメッセージは、割り込み用に予約されたタイプのメッセージである場合もあれば、メモリ書き込みなどの既存のタイプのメッセージである場合もあります。
メッセージシグナル割り込みは、エッジトリガー割り込みと非常によく似た動作をします。つまり、割り込みは連続的な状態ではなく、瞬間的な信号です。割り込み処理ソフトウェアは、この2つをほぼ同じように扱います。通常、同じメッセージ(同じ仮想割り込み線)を持つ複数の保留中のメッセージシグナル割り込みは、間隔の狭いエッジトリガー割り込みと同様に、マージすることができます。
メッセージによって通知される割り込みベクタは、基盤となる通信媒体が共有可能な範囲で共有できます。追加の作業は必要ありません。
割り込みの種類はデータビットのパターンで示されるため、別途物理的な配線は不要となり、より多くの異なる割り込みを効率的に処理できます。これにより、共有の必要性が軽減されます。また、割り込みメッセージはシリアルバス経由で伝送できるため、追加の配線は不要です。
コンピュータシステムに押しボタンのアナロジーを適用すると、「ドアベル」または「ドアベル割り込み」という用語は、ソフトウェアシステムがコンピュータハードウェアデバイスに何らかの処理が必要であることを信号または通知するメカニズムを説明するためによく使用されます。通常、ソフトウェアシステムは、既知の相互に合意されたメモリ位置にデータを配置し、別のメモリ位置に書き込むことで「ドアベルを鳴らします」。この別のメモリ位置は「ドアベル領域」と呼ばれることが多く、この領域には異なる目的で使用される複数のドアベルが存在する場合もあります。メモリのドアベル領域に書き込む行為が「ベルを鳴らし」、データが準備できて待機していることをハードウェアデバイスに通知します。ハードウェアデバイスは、データが有効であり、処理を実行できることを認識します。通常、データを ハードディスクドライブに書き込んだり、ネットワーク経由で送信したり、暗号化したりします。
「ドアベル割り込み」という用語は、通常、誤称です。デバイスに何らかの処理を実行させるという点では割り込みに似ていますが、ドアベル領域はポーリング領域として実装される場合もあれば、物理デバイスレジスタに書き込む場合もあり、物理デバイスレジスタに直接ハードワイヤリングされる場合もあります。物理デバイスレジスタに書き込む場合、または直接書き込む場合、デバイスにCPU(中央処理装置)が搭載されている場合は、 CPUで実際の割り込みが発生する可能性があります。
ドアベル割り込みは、メッセージシグナル割り込みと類似点があるため、比較対象として考えることができます。
マルチプロセッサシステムでは、プロセッサはプロセッサ間割り込み[ i ](IPI)を介して他のプロセッサに割り込み要求を送信できます。
割り込みは、低負荷時にはオーバーヘッドが少なくレイテンシも良好ですが、いくつかの異常を防ぐための対策を講じない限り、割り込み頻度が高くなると著しく性能が低下します。割り込み処理に過剰な処理時間が費やされ、システム全体のパフォーマンスが著しく低下する現象は、割り込みストームと呼ばれます。
システムが他の必要なタスクを犠牲にして割り込み処理にすべての時間を費やす場合、さまざまな形態のライブロックが発生します。極端な状況では、大量の割り込み(非常に高いネットワークトラフィックなど)によってシステムが完全に停止する可能性があります。このような問題を回避するために、オペレーティングシステムはプロセス実行のスケジュール設定と同様に、ネットワーク割り込み処理のスケジュール設定を慎重に行う必要があります。[ 25 ]
マルチコアプロセッサでは、マルチキューNICを使用する場合、受信側スケーリング(RSS)によって割り込み処理のパフォーマンスをさらに向上させることができます。このようなNICは、個別の割り込みに関連付けられた複数の受信キューを提供します。これらの割り込みをそれぞれ異なるコアにルーティングすることで、単一のNICが受信したネットワークトラフィックによってトリガーされる割り込み要求の処理を複数のコアに分散させることができます。コア間の割り込みの分散は、オペレーティングシステムによって自動的に実行することも、割り込みのルーティング(通常はIRQアフィニティと呼ばれる)を手動で構成することもできます。[ 26 ] [ 27 ]
受信トラフィック分配の純粋なソフトウェアベースの実装である受信パケットステアリング(RPS)は、割り込みハンドラ機能の一部として、データパスの後半にあるコア間で受信トラフィックを分配します。RSSに対するRPSの利点には、特定のハードウェアを必要としないこと、より高度なトラフィック分配フィルタ、NICによって生成される割り込みのレートの低減などがあります。欠点としては、RPSはプロセッサ間割り込み(IPI)のレートを増加させます。 受信フローステアリング(RFS)は、アプリケーションの局所性を考慮することでソフトウェアベースのアプローチをさらに進めます。特定のネットワークパケットが対象アプリケーションによって消費されるのと同じコアで割り込み要求を処理することで、さらなるパフォーマンスの向上が実現されます。[ 26 ] [ 28 ] [ 29 ]
割り込みは、ハードウェアタイマーの処理、ストレージ(ディスクI/Oなど)や通信インターフェース(UART、イーサネットなど)との間のデータ転送、キーボードやマウスイベントの処理、およびアプリケーションシステムが必要とするその他の時間制約のあるイベントへの応答に一般的に使用されます。マスク不可能な割り込みは、ウォッチドッグタイマーのタイムアウト、電源オフ信号、トラップなどの優先度の高い要求に応答するために通常使用されます。
ハードウェアタイマーは、周期的な割り込みを生成するためによく使用されます。アプリケーションによっては、このような割り込みは、割り込みハンドラによってカウントされ、絶対時間または経過時間を追跡したり、OSのタスクスケジューラによって実行中のプロセスの実行を管理したり、あるいはその両方に使用されます。周期的な割り込みは、アナログ-デジタル変換器、インクリメンタルエンコーダインターフェース、GPIO入力などの入力デバイスからのサンプリングを呼び出したり、デジタル-アナログ変換器、モータコントローラ、マルチプレックスディスプレイ、GPIO出力などの出力デバイスをプログラムしたりするためにも一般的に使用されます。
ディスク割り込みは、ディスク周辺機器との間でデータ転送が完了したことを知らせる信号です。これにより、読み取りまたは書き込みを待機していたプロセスが実行される場合があります。電源オフ割り込みは、間もなく電源が切れることを予測し、コンピュータがまだ十分な電力を持っているうちに、秩序だったシャットダウンを実行できるようにします。キーボード割り込みは通常、タイプアヘッドを実装するためにキーストロークをバッファリングします。
割り込みは、製品ファミリー内の一部のコンピュータで実装されていない命令をエミュレートするために使用されることがあります。[ 30 ] [ 31 ]例えば、浮動小数点命令は、一部のシステムではハードウェアで実装され、低コストのシステムではエミュレートされる場合があります。後者の場合、実装されていない浮動小数点命令を実行すると、「不正な命令」例外割り込みが発生します。割り込みハンドラは、ソフトウェアで浮動小数点関数を実装し、ハードウェアで実装された命令が実行されたかのように、割り込みを受けたプログラムに戻ります。[ 32 ]これにより、製品ライン全体でアプリケーションソフトウェアの移植性が確保されます。
割り込みはシグナルと似ていますが、違いは、シグナルはプロセス間通信(IPC)に使用され、カーネル(システムコールを介して)によって媒介され、プロセスによって処理されるのに対し、割り込みはプロセッサによって媒介され、カーネルによって処理される点です。カーネルは、割り込みをシグナルとして、その割り込みを発生させたプロセスに渡すことができます(典型的な例としては、SIGSEGV、SIGBUS、SIGILL、SIGFPEなどがあります)。
注記
一般的な概念は同じですが、用語が異なるため、それぞれのマニュアルを読む際には注意が必要です。たとえば、ARM では例外をより一般的な用語として使用し、割り込みは例外の一種です。一方、Intel では割り込みをより一般的な用語として使用し、例外は割り込みの一種です。
その後は、クリーンアップ、ソフトウェア割り込みの実行、通常の作業への復帰を行うだけです。 「通常の作業」は、割り込みの結果として変更されている可能性があります (たとえば、ハンドラが
プロセスである可能性があります)。そのため、割り込みから戻ったときに最後に行われることは、プロセッサの再スケジューリングの可能性です。
wake_up割り込みと例外には次の特性があります。... 一般的に、マスクレジスタの1ビットを使用して、特定の割り込み/例外の発生をマスク(無効)またはマスク解除(有効)します。
割り込みの概念は、長年にわたってその範囲が拡大してきました。80x86ファミリーは、int (ソフトウェア割り込み) 命令を導入することで、割り込みに関する混乱をさらに深めました。実際、さまざまなメーカーが、この章で説明する現象を説明するために、例外、フォールト、アボート、トラップ、割り込みなどの用語を使用してきました。残念ながら、これらの用語の正確な意味については明確な合意がありません。さまざまな著者が、独自の用途に合わせて異なる用語を採用しています。