キーボードは非常に単純な入力装置です。なぜ単純かというと、小さな 単位のデータを(コンピュータの標準機能により)非常にゆっくりと生 成するだけだからです。キーを押したり離したりすると、そのイベント 信号がキーボード・ケーブルを伝わって、ハードウェア割り 込みを起こします。
そのような割り込みを監視するのはオペレーティング・システムの仕事 です。各種の割り込みごとに 割り込みハンドラ が用意されています。これはオペレーティング・システムの一部分で、 (キーを押した/離したなどを表す値のような)関連するデータを処理 できるようになるまで保存しておきます。
キーボードの割り込みハンドラが実際に行うことは、キーの値をコアの底の方にあ るシステム領域に格納することです。オペレーティング・システムが、現在キーボード からの読み込みを行っていると見なされた何らかのプログラムに制御を渡した時、 そのプログラムは格納された値を調べることができるようになります。
ディスクやネットワーク・カードなど、より複雑な入力装置の場合も、 これとよく似た方法で動作しています。ディスク・コントローラは、バ スを使ってディスクへの要求が満たされたことを表わす信号を伝えてい ることは前にご紹介しました。ここで実際には、ディスクは割り込みを 発行しているのです。その後ディスクの割り込みハンドラは、取り込ま れたデータをメモリ中にコピーし、要求を出したプログラムが後でそのデータを使 えるようにします。
どの種類の割り込みにも、関連する 優先度レベル があります。低優先度の割り込み(キーボード・イベントなど)は、高 優先度の割り込み(時刻の刻み(clock ticks)やディスク・イベントな ど)により待たされます。Unix では、すばやく処理しなければならな いようなイベントに対して、マシンの応答性をスムーズに保つために高 い優先度を割り当てるように設計されています。
OS ブート時のメッセージの中で IRQ 番号に関す るものが表示されると思います。ハードウェアの設定ミスでよく起こる のが、2 つの異なったデバイスが、事前の了解なしに同じ IRQ を使おう としてしまうことです。
解決方法はこうです。IRQ は "Interrupt Request" (割り込み要求) の略です。オペレーティング・システムはその開始時に、各ハードウェ ア・デバイスがどの番号の割り込みを使うのかを把握していなければな りません。2 つの異なったデバイスが同一の IRQ を使おうとしてしま うと、割り込みが間違ったハンドラを駆動してしまうことがあります。 通常これは少なくともそのデバイスを探しに行き、OS の動作を狂わせ たりクラッシュさせたりする要因となります。
コンピュータはどうやって複数のことを同時に行うことができるの?
実際にはこのようなことはできません。コンピュータは同時には 1 つのタスク (つまり プロセス)だけしか実行できません。しかしコンピュータは、 タスクを非常に高速に切り替えることができるので、鈍重な我々人間には、同時に 複数のことが行われているように見えてしまうのです。 これは タイム・シェアリング(訳注:時分割) と呼ばれています。
カーネルの仕事のうちの 1 つにタイム・シェアリングの管理というもの があります。これは スケジューラ と呼ばれる部 分で行われており、その内部には他の全ての(非カーネル)プロセスに 関する情報が保持されています。カーネル中では 60 分の 1 秒ごとにタイマ 監視がオフになり、クロック割り込みを生成します。この時どのプロセ スが動作していようと、スケジューラはそのプロセスを停止して動作を 一時停止(suspend) させ、制御を別のプロセスに移します。
60 分の 1 秒という時間はそう長いとは感じないかもしれません。しかし マイクロ・プロセッサは今日一日だけでも何万回というマシン命令を実 行しており、頻繁な割り込みは非常な負荷となります。このため多くの プロセスが動作している場合、各プロセスは 1 回のタイムスライス(訳 注: CPU 時間の割り当て)ではほんのちょっとしか動作できません。
実際は、各プログラムは割り当てられたタイムスライスをほとんど使え ないこともあります。I/O デバイスから割り込みが来た場合、カーネル は効率よく現在のタスクを停止し、割り込みハンドラを駆動してからま た現在のタスクに戻ります。高優先度の割り込みが殺到した場合、制御 が奪われて通常の処理は動作不能となります。この現象のことを スラッシング と呼びますが、幸運なことに最近の Unix ではほと んど起きることはありません。
実際、プログラムの動作速度は取得可能なマシンタイムによってのみ制 限されますが、このような制限はめったに発生することではありません (このルールの数少ない例外としては、サウンドや 3 次元グラフィックス の生成などがあります)。よく発生する事象としては、プログラムがデ ィスク・ドライブやネットワーク・コネクションからのデータを待たな ければならない場合、実行の遅延が起こります。
日常的に、同時に動作する多くのプロセスをサポートすることのできる オペレーティング・システムのことを、「マルチタスク OS」と呼びま す。Unix 系のオペレーティング・システムは、当初よりマル チタスキングのために設計され、Windows や Mac OS などに比べて非常 にうまく機能しています。Mac OS の場合は、マルチタスキングは後から追加 された機能で、あまりうまく実装されているとはいえません。効率的で 信頼性のあるマルチタスキングは、Linux でネットワーキングや通信、 および Web サービスを行うにあたり、優位性を持つための重要な要素 となっています。