APIC(えいぴっく)はAdvanced Programmable Interrupt Controllerの略で、インテルにより開発された、x86アーキテクチャにおける割り込みコントローラのことである。
それまでのLegacyの割り込みコントローラとして知られるPIC (Programmable Interrupt Controller) に対し、マルチプロセッサ対応、プライオリティ制御などの機能が付加されている。APICはインテルアーキテクチャの進歩と共に高機能化しており、いくつかのバージョンが存在する。
APICにはCPUに内蔵されるLocal APICと、I/Oからの割り込みを管理するIOAPICの2種類が存在する。Local APICとIOAPICは独自のプロトコルで通信を行い、割り込みの通知を行う。Pentium Pro世代では、APIC Busと呼ばれる割り込み専用のバスが使用されていたが、NetBurst世代以降、APIC Busは廃止され、FSBを介して割り込みの通知が行われる。
CPU内部に実装され、外部からの割り込みの全てを管理する。I/Oからの割り込み以外にもIPI (Inter-Processor Interrupt) と呼ばれる、マルチプロセッサによる割り込みを使用したCPU間通信にも使用される。
IOAPICはI/Oデバイスから受け取った割り込みを、CPUへ通知するためのリダイレクション・テーブルを持つ。
全てのI/O割り込みは一旦IOAPICで受信される。IOAPICは、オペレーティングシステム (OS) やBIOSによって適切に設定されたリダイレクション・テーブルを参照し、それに従いCPUに割り込みの通知を行う。 リダイレクション・テーブルには、エッジ/レベル・トリガーの種別、割り込みベクタ(優先度)、割り込み先CPUなどの設定が可能である。
以下に、PCIをI/Oデバイスに持つ一般的なIA-32アーキテクチャにおける、実装、割り込み時の振る舞いを例として解説する。
PCIバスにおいては、1本のバスにはINT_A,B,C,Dの、最大4本のI/O割り込み線が存在し、それら割り込み線はIOAPICに接続される。IOAPICには、それぞれの割り込み線に対するリダイレクション・テーブルが割り当てられており、割り込み種別、割り込みベクタなど、CPUのLocal APICと通信を行うための設定がなされる。
I/Oデバイスの数が多い場合、4本の割り込み線では足りずに、1本の割り込み線を複数のI/Oデバイスで共有する場合がある。これらの管理もIOAPICが負っている。なお、IOAPICはシステムで複数存在していてもかまわない。
PCIのI/OデバイスによってはMSI (Message Signaled Interrupts) をサポートするものがあり、これらのデバイスは割り込み線を使用しないが、チップセットによりMSIメッセージは一旦IOAPICにルーティングされ、リダイレクション・テーブル介してからCPUへ割り込み通知される。
IOAPICがPCIの割り込み信号の変化を検知すると、リダイレクション・テーブルに従い、CPUに対し割り込みメッセージを発行する。CPUのLocal APICがこれを受信すると、自CPUの割り込み処理の仕掛かり、優先度などをチェックし、割り込みハンドラをコールする。 割り込みハンドラは、割り込みを発生させたI/Oデバイスをチェックし、割り込み信号通知を停止させ、それぞれの処理に入る。
一連の割り込み処理が完了すると、CPUはEOI (End of Interrupt)というコマンドをIOAPICに対して発行する。EOIには対応する割り込みベクタ情報が含まれており、IOAPICは、該当するベクタの割り込み処理が完了したことを認識する。 なおこの時、PCIデバイスより依然として当該割り込み信号による通知が行われている場合、即座に再度CPUに対して割り込みを発行する。 これらの一連の動作により、割り込みのロスト防止、割り込み線の共有制御などが行われる。
高い優先度の割り込み処理を実行しているCPUに対し、低い優先度の割り込みを通知しても、その処理は一旦待たされる。であれば、割り込み処理を行っていない、または低い優先度の割り込み処理を行っているCPUに割り込みを通知すべきである。
NetBurst世代後期のLocal APICには、割り込み処理に出入りするたびに、その割り込み優先度を、FSBを介して定期的にチップセットに通知する機能が実装されており、OSがこの機能を利用して、マルチプロセッサ・システムでの適切な割り込み分散が可能となっている。ただし、本機能に対応したIOAPICおよび、ノースブリッジが必要とされる。