Linux豆知識 132
Linuxカーネルと割り込み処理
公開日:2013年07月18日
「割り込み」は、少し前に取り上げました。現在実行中の処理を中断し、強制的に別の処理を実行させることを「割り込み」と言います。キーボードなどインターフェイスから特定の動作が行われたり、ソフトウェアから指示があったときなどに「割り込み」が発生します。
Linuxカーネルは、実はこの「割り込み」を上手く活用しています。Linuxはマルチユーザ・マルチタスクOSであるため、いつ、どこからどのような指示が来ても的確に応答しなければならないということ、サーバ用途に代表されるように、ネットワーク経由でのリクエストにもいつでも応えなくてはいけないことなどから、割り込みを上手に利用することでさまざまな処理をこなすことができている、と言えます。
本来、CPUは「あらかじめ決められた手順で、処理を行う」のです。これを「順次処理」と呼びます。別の見方をすると、「あらかじめ決められた手順以外では、処理ができない」ということにもなるわけですね。このことからも、割り込みがいかに大切な機能かを窺い知ることができるかと思います。
もし、「割り込み」以外の方法でLinuxのさまざまな機能を実現しようとすると、「常時監視」が必要になります。すなわち、カーネルが常時インターフェイス(キーボード、マウス等々)、ネットワーク、各ソフトウェアを常に監視し、何かが起こらないかを常に見守る。そして、何かが起こったら、それに対して応答を返し・・・監視をすることにリソースを割く必要が生じます。最近のコンピュータの進歩、機能の多様性を見てみれば、常時監視を行うために割くリソースの量がとんでもなく大量なものになってしまうのがおわかりでしょう。しかし、割り込みを活用すれば常時監視をすることなく、「起こしたい時に処理を行う」ことができるようになります。
Linuxカーネルがどれくらい割り込みを利用しているか?については、「/proc/interrupts」ファイルを参照すればわかります。以下のコマンドを実行してみてください。割り込み発生の数が表示されます。
○割り込み回数の確認例
$ cat /proc/interrupts
CPU0
0: 5133 IO-APIC-edge timer
1: 8 IO-APIC-edge i8042
3: 1 IO-APIC-edge
(中略)
56: 1630917 PCI-MSI-edge eth0-rxtx-0
57: 0 PCI-MSI-edge eth0-event-1
58: 328429 PCI-MSI-edge vmw_pvscsi
59: 1 PCI-MSI-edge vmci
60: 0 PCI-MSI-edge vmci
NMI: 0 Non-maskable interrupts
LOC: 23884251 Local timer interrupts
(略)
Linuxカーネルが、いかにたくさんの割り込みを活用しているかがわかると思います。