2.4 プロセッサ間割り込み

 複数CPU間の通信を実現する仕組みとして、「プロセッサ間割り込み」が提供されています。文字どおり「あるCPUからほかのCPUに対し」割り込みを発生させます。割り込みを利用することで、動作中のCPUに対して非同期的に要求を出すことができます。

 プロセッサ間割り込みを利用するためには、ハードウェアのサポートが必要です。最近のx86搭載のPC/AT互換機では、APIC(Advanced Programmable Interrupt Controller)が、そのための機能を提供しています。それ以外のハードウェアでも、最近はこの機能をサポートしているものが多いようです。

2.4.1 プロセッサ間割り込み要求

 APIC搭載のPC/AT互換機用のLinuxでは、プロセッサ間割り込みを発生させる関数として表2-6のようなものを用意しています。これらによって、指定したCPUに対し、指定した要因でプロセッサ間割り込みを発生させることができます。

表2-6 プロセッサ間割り込み要求関数
関数名説明
send_IPI_all全CPUで割り込みを発生
send_IPI_self自CPUで割り込みを発生
send_IPI_allbutself自CPUを除く全CPUで、割り込みを発生
send_IPI_mask指定したCPU群で割り込みを発生

 割り込み要因としては、現在3種類を指定できます。プロセッサ間割り込みを受けたCPUでは、その割り込み要因に対応した割り込みハンドラを起動します(表2-7)。

表2-7 プロセッサ間割り込み利用関数
割り込み要求関数割り込みハンドラ説明
smp_send_reschedulesmp_reschedule_interruptプロセス再スケジュール要求
flush_tlb_current_task、local_flush_mm、local_flush_pagesmp_invalidate_interruptTLB無効化要求
smp_call_function、on_each_cpusmp_call_function_interrupt任意の関数の呼び出し要求
flush_tlb_allsmp_call_function_interrupt経由でdo_flush_tlb_all全TLBの無効化要求
smp_send_stopsmp_call_function_interrupt経由でsmp_send_stop関数を呼び出すCPUの停止要求