2.2 Linuxカーネルの割り込み処理の特徴

 Linuxカーネルは割り込みを受けると、そのとき動作していた処理を中断し、割り込みハンドラを起動します。

2.2.1 応答性の確保

 割り込みには、応答性の確保が必要です。伝統UNIXでは、応答性を確保するために割り込みレベルという考え方を採用していました。高い応答性を必要とする割り込みには、高い優先度を与えるという考え方です。低い優先度の割り込みハンドラ実行中に高い優先度の割り込みが発生すると、低い優先度の割り込みハンドラを中断し、高い優先度の割り込みハンドラを実行します。その逆の場合は、高い優先度の割り込みハンドラの実行が終わるまで、低い優先度の割り込み要求を保留状態にしておきます。

 Linuxカーネルでは別の方法を採用しています。各割り込み処理自体を応答性を必要とする部分と、必要としない部分に分ける方式です。応答性を必要とする部分は、なるべく実行時間が短くなるように設計し、ハードウェア割り込みハンドラで実行します。応答性を必要としない部分は、まとめて後から実行します。この処理はソフト割り込み(またはソフトIRQ)*1と呼ばれるものです(詳しくは「第3章 遅延処理」を参照)。システムがソフト割り込みハンドラを実行中には、そのソフト割り込みの要因となった、ハードウェア割り込みを受け付けることが可能です(表2-1)。

表2-1 割り込み処理の例
ハードウェア割り込みソフト割り込み
イーサネットドライバ処理TCP/IPプロトコル処理
SCSIホストバスアダプタドライバ処理SCSIプロトコル処理
シリアルドライバ処理端末制御処理

2.2.2 マルチプロセッサへの対応

 Linuxカーネルの割り込み処理は、マルチプロセッサ環境でも効率良く動作するように設計されています。

  • すべてのCPUは対等で、どの種類の割り込みハンドラでも処理できます。ハードウェアが対応していれば、最も負荷の低いCPUに対し、割り込みを発生させ、処理させることができます。
  • 同じIRQに対するものでない限り、複数のCPU上で同時にそれぞれハードウェア割り込みハンドラが動作できます。
  • 複数のCPU上で、同時にソフト割り込みハンドラを実行できます。同種の要因によるソフト割り込みハンドラであっても、並列実行可能です。
  • ソフト割り込みハンドラは、その要因を作ったハードウェア割り込みハンドラと同じCPU上で動作します。キャッシュメモリの利用効率を考えた場合、これは効果的です。ハードウェア割り込みハンドラで操作したデータ構造を、同じCPU上で動作するソフト割り込みハンドラが引き継ぎ処理を行うため、キャッシュメモリが有効利用できます。
  • 特定の割り込みハンドラの実行を、明示的にあるCPUに任せることもできます。負荷は偏りますが、キャッシュメモリの利用効率は良くなります。またハードウェアの構造上、特定のCPUから制御すると効率が良い場合もあり、そのような場合この機能を利用できます。

2.2.3 割り込みスタック

 Linuxカーネルは、割り込みスタックを用意していないという実装上の特徴もあります。Linuxカーネルでは、割り込みが発生したとき、その時点で実行中のカレントプロセスのカーネルスタックを利用して動作します。ソフト割り込みも同じスタックを利用して動作します*2。  これらの処理はネストするため、カーネルスタックの消費量は大きくなります。Linuxカーネルは、各プロセスに大きめのカーネルスタックを持たせることで対応しています。


  1. *1本書では、Linuxカーネルがソフトウェア的に作り出す割り込みに似たイベントを「ソフト割り込み」と呼ぶことにします。Linuxカーネルのコード中では、softirqというシンボルで参照されています。Intel x86 CPUのint命令による割り込みは、「ソフトウェア割り込み」という名称が与えられていますが、これは「ソフト割り込み」とはまったく関係ありません。
  2. *2CPUアーキテクチャによっては、割り込みスタックが用意されているものもある。