割り込み
出典: フリー百科事典『ウィキペディア(Wikipedia)』
割り込みとは、コンピュータがその周辺機器などから受け取る要求の一種である。コンピュータは割り込みに応じて現在の処理を中断して、別の処理(割り込み処理)を行う。現在の多くのCPUは、割り込みを処理するための機能を備えている。
目次 |
[編集] 目的
割り込みの主な目的は周辺機器からの情報を、他の作業をしながらも取り落とすことなく受け取ることであり、具体的な効果として次のようなものがある
- CPU資源の有効利用 - 周辺機器の速度はCPUの処理速度より格段に遅いため、周辺機器が処理を行っている間、CPUが他の処理を行ったほうが効率がよい。その場合、周辺機器の処理の終了をCPU側から定期的にチェックする(ポーリングと呼ぶ)のは、他の処理の効率を落とすため望ましくない。このため、周辺機器の側から割り込みによって処理の終了を通知する方法がとられる。しかしながら、近年のCPUの高速化に伴い、GHz クラスのCPUを利用した場合は、1msec単位程度の周期的なポーリングを行う方式も研究されている。
- 応答性の向上 - キーボード、マウスなどのユーザインターフェースは入力の遅延や入力漏れが致命的な欠陥になる。この場合は割り込みを使ってユーザからの入力を確実に処理する必要がある。コンピュータがフリーズした場合でもマウスカーソルの移動だけが反応することがあるが、これは割り込み処理だけが機能していることになる。
- 例外処理の効率化 - 周辺機器に障害が生じた場合、割り込みを用いることでプログラム側に障害を速やかに伝えることが可能になる。またプログラム上でも例外処理を本来の処理と分離して記述することを容易にする。
- 正確なタイミングの取得 - 画像表示、音楽の演奏や時計など、正確なタイミングで処理を行う必要がある機器を制御する場合、その機器が搭載している正確なタイマーによりタイマー割り込みを行い、CPU側に処理のタイミングを指示する。
[編集] CPUの割り込み
[編集] 分類
CPUの割り込みは、大きくわけて「ハードウェア割り込み」と「ソフトウェア割り込み」に分類できる。一言で「割り込み」と言った場合、前者を指すことが多いため、後者のことをSWI(SoftWare Interrupt)と呼び区別する場面がある。ハードウェア割り込みは、CPUの外部から要求されるものであり、CPUの割り込み要求(Interrupt ReQuest, IRQ)端子をアサートする(例えば端子の電圧をHIからLOWにする)場合に発生する。ソフトウェア割り込みはCPU内部において、自分自身が実行した命令やCPUの命令実行に関わるモジュール(例えば、キャッシュ)の変化によって起きるものである。ソフトウェア割り込みの一部は例外(Exception)やトラップ(Trap)と呼ばれる。
まとめると以下のように分類できる。
- ハードウェア割り込み(割り込み要求端子の変化によりCPU外部から発生)
- ノンマスカブル割り込み
- マスカブル割り込み
- ソフトウェア割り込み(CPU内部の要因で発生)
- (狭義の)ソフトウェア割り込み(CPUの割り込み命令によって発生)
- 例外(割り込み命令以外の要因で発生)
[編集] ハードウェア割り込み
割り込み要求端子は、ソフトウェアからマスク不可能な割り込み(Non-Maskable Interrupt, NMI)と、マスク可能な割り込み(NMIに対して狭義のIRQ)の2種類の端子を備えている場合が多い。割り込みのマスクの設定は主にフラグレジスタに格納されており、割り込みの許可/禁止(Enable/Disable)を操作するCPUの命令が用意されている。またこれらの端子が同時にアサートされた場合、優先順位がありNMIが優先される。 NMIはデバッグやハードウェアエラーなどの特殊な用途に使われ、通常のペリフェラルからの割り込み要求はマスカブル割り込み(以下IRQ)に接続して用いる。 CPUのIRQは1本もしくは複数用意され、CPUの種類や実装によって異なる。
複数のペリフェラルからの割り込み要求が発生可能な場合、1つの割り込みハンドラ(後述)で処理を行うと、どのペリフェラルがどのような割り込み要求を発生させたのか判別する処理を、プログラム側で行う必要がある。これに対し、ハードウェアとして複数のIRQ端子を用意して、割り込み要因毎に異なるハンドラに処理を移すことができるようにした構成をとれるようにしたものがある。この機能を持った回路のことを割り込みコントローラ(Interrupt Controller)と呼び、CPUのIRQ端子を外部で拡張し、制御するものである。
具体的な割り込みコントローラの例
- Intel 8259 (Programable Interrupt Controller, PIC)
- Intel 8086ファミリの割り込みコントローラ。IRQ0-7の8本の割り込み入力を持ち、CPUに割り込み番号を伝える。各割り込み毎にマスク、優先順位が設定できる。PC/AT互換機ではこの機能を2つ搭載している。
- Z80ファミリ
- 集中的に管理する割り込みコントローラは存在せず、各ペリフェラル(Z80 SIO, Z80 PIO, Z80 CTCなど)が、CPUに割り込みベクトルを出力する機能を持っていた。割り込み信号線のデイジーチェインの構成で優先順位をつける。
マイクロコントローラでは同一チップ内にCPUと複数のペリフェラルが内蔵され、割り込みコントローラも内蔵されるものが多い。
- IRQと、より優先度の高い「高速割り込み」(FIQ)がある。FIQではIRQに比べ、一部のレジスタをスタックに入れず専用レジスタに退避するため、動作が速い。
IRQ端子のアサート方法は、信号の変化点を検出するエッジトリガと、信号のレベルで検出するレベルトリガがある。エッジトリガでは、立上がり又は立下りといった片方向の変化だけを検出する「片エッジ検出」と、両方ともを検出する「両エッジ検出」がある。PCIバスではレベルトリガ方式の割り込み信号線が取り入れられている。
[編集] ソフトウェア割り込み
狭義のSWIとは、割り込みを起こすための命令(ソフトウェア割り込み命令)によって発生させる。SWI、CPUのモードを遷移させることができるため、可能な処理の範囲がモードによって制限されるようなCPUにおいて、システムコールを実現するために用いられる(通常のアプリケーションが動作するモードであるユーザモードでは実行できない命令であっても、SWIの後では実行可能になる)。また、例外は、ゼロ除算、オーバーフロー、ページフォルトなどによって生じる。特にページフォルトはOSがメモリ空間を管理するのに重要な役割を果たす。
[編集] 割込処理
どちらの割り込みにせよ、CPUに割り込みが生じると、現在実行している処理(命令)を停止して別の処理を実行する。割り込み後に実行される処理は、割り込みハンドラもしくは割り込みサービスルーチン(Interrupt Service Routine, ISR)と呼ばれる。また、割込処理が終了しても、元の処理(割り込みが生じた時点に実行していた処理)に戻ってこられるように、元の処理の場所(アドレス)に関する情報(および元の処理の作業状態、コンテキストと呼ばれるを(多くの場合スタックに)保存しておく。割込処理を実行するために、どこの場所(アドレス)に飛べば良いかを示す情報は、割り込みベクタと呼ばれるテーブルに書かれている。割り込みベクタには、飛び先の命令のアドレスを書くこともあれば、ジャンプ命令を書くこともある。
[編集] 割込処理のオーバーヘッド
割り込み処理ではイベントドリブンな処理を行うことができるため、効率的な処理が行える。しかしその一方、割り込み発生時には、CPUのレジスタの退避/復帰やプロセッサの特権レベル移行の処理など、少なからず処理にオーバーヘッドが生ずる。このため割り込みの発生頻度が高いと、この処理に圧迫され本来の処理の応答性や処理速度に影響を与える場合がある。状況によっては割り込みを使わず、ポーリングでフラグを定期的に確認するなどの処理のほうが全体的なパフォーマンスが向上する場合もある。一部のデバイスドライバでは、通常は割り込み動作を行い高負荷時にはポーリングで動作する仕組みを持ったものもある。[1]
また、RISCプロセッサでは、割り込みが発生すると実行中のパイプラインが乱れ処理性能が低下するため、旧来の8ビットCISCプロセッサなどに比べると、割り込みによる相対的なパフォーマンス低下の影響が大きい。また投機実行のペナルティなど複雑化したプロセッサ機能も、割り込みの際のオーバーヘッドを増大させる要因となる。