コンピュータにとって,プロセッサ内部での演算処理と同様に重要なのが入出力処理です。処理に必要なデータを入力したり,処理結果を出力できないようでは,演算処理ができても意味がありません。また,コンピュータに接続されているさまざまな周辺機器の制御も,入出力処理を通じて行われています。

 この入出力処理において重要な役割を果たすのがプロセッサの「割り込み」機能です。今回は,この割り込みとはどのような機能なのか,またその割り込みをカーネルがどのように利用するのかを解説します。

割り込みとは

 プロセッサは,決められた命令を順番に実行していくように作られています。初期のコンピュータは,実行する命令を入力し,それをプロセッサに実行させ,その結果を受け取るという決められた流れ(バッチ処理)に沿って利用されていました。しかし,コンピュータの用途が多様化し,インタラクティブな動作が求められるようになると,このような順次処理だけでは要求を満たせなくなりました。

 そこで,プロセッサが処理を行っている最中でも,特定の信号があると処理を中断して別の処理を行わせる機能が実装されました。このプロセッサの機能を「割り込み」と呼びます。

 割り込み機能の有無により,プログラムが行わなければならない処理は大きく変わります。例えば,キー入力があった際に特別な処理をするアクション・ゲームを作りたいとします。このゲームは,キー操作をしなくてもゲームが進行し,ボタンを押すとキャラクタが動くようなものだとしましょう。

 割り込み機能が無い場合は,処理の途中で,キー入力があったかどうかを細かく監視しながら動くようにプログラムを書かなければなりません。一方,割り込み機能が有れば,いちいち入力を監視しなくても,キー入力による割り込みがあったときだけそれに対応すれば良くなります。

 このように割り込み処理は元々,プログラムからはタイミングが分からない外部デバイスからの入力をキャッチするために実装されたものです。しかし,現在ではそれ以外にも多くの場面で利用されています。特に,LinuxのようなマルチタスクOSでは,割り込みをうまく利用してさまざまな処理を効率的に処理しています。

 Linuxでは,現在までの割り込み発生数を,/proc/interruptsファイルの内容で調べられます(図1)。

% cat /proc/interrupts
            CPU0
            0:   78135178    IO-APIC-edge timer
            1:     189792    IO-APIC-edge keyboard
            2:          0          XT-PIC cascade
            8:   14453750    IO-APIC-edge rtc
            12:    2101255    IO-APIC-edge PS/2 Mouse
            14:    2666339    IO-APIC-edge ide0
            15:    5393370    IO-APIC-edge ide1
            16:       1469   IO-APIC-level usb-uhci, usb-uhci
            17:      84197   IO-APIC-level Intel ICH5
            18:   16295034   IO-APIC-level usb-uhci, eth0, eth1
            19:   85879260   IO-APIC-level usb-uhci
            22:       1003   IO-APIC-level bttv
            NMI:          0
            LOC:   78135476
            ERR:          0
            MIS:          0
            
図1●/proc/interruptsファイルの内容
このファイルの内容から割り込み回数が分かります。