7. コンピュータはどうやって複数のことを同時に行うのか?

実際には、複数のことを同時に行っているわけではありません。 コンピュータは、その時々で ひとつのタスク (もしくはプロセス (process) ) しか処理できません。しかし、コンピュータは、複数のタスクを瞬時に 切り替えながら処理できるので、人間の感覚からすると、複数のことを 同時に行っているように錯覚させることができるのです。こうした方法は、 タイムシェアリング (timesharing, 時分割方式) と呼ばれています。

タイムシェアリングの管理も、カーネルの仕事のひとつです。カーネルには スケジューラ (scheduler) という部分があり、 これが(カーネル以外の)全プロセスに関する情報を内部に保持しています。 60 分の 1 秒ごとに、カーネル内のタイマーが進んで、クロック割り込みを 生成します。スケジューラは、現在実行中のプロセスを停止させて、 それを適宜保留したうえで、別のプロセスに制御を渡します。

60 分の 1 秒というのは、あまり長い時間とは思えないかもしれませんが、 今日のマイクロプロセッサからすると、数万のマシン命令を実行しうるだけの 間隔であり、それだけあれば、かなりの仕事がこなせます。それゆえ、多くの プロセスが存在したとしても、それぞれのプロセスは、その割り当て時間内に 結構な仕事量をこなせるわけです。

実際には、プログラムはその割り当て時間を全部使えない 場合もあります。I/O デバイスから割り込みがかかると、カーネルは効率よく 現在のプロセスを停止させ、割り込みハンドラを実行して、そのあとで 現在のプロセスを再開します。高い優先順位の割り込みがつぎつぎに起こると、 通常の処理がまったく行われなくなってしまいます。この異常事態は、 スラッシング (thrashing) と呼ばれていていますが、 幸なことに、現在の Unix ではめったに起こらなくなっています。

事実、プログラムの実行速度は、プログラムが取得するマシン時間の 量によって制限されるということはほとんどありません (サウンドや 3-D グラフィックの生成など、いくつかの例外はありますが)。実行の遅延が 起こる原因は、たいてい、プログラムがディスクやネットワーク 上にあるデータを取得しようとして待っている間に発生するのであり、 ほとんどの原因がこれです。

多くのプロセスを順に同時並行的に処理できるオペレーティングシステムは、 "マルチタスク (multitasking) " OS と呼ばれます。Unix 系のオペレーティング システムは、もともとマルチタスク OS として設計されており、それを非常に 得意としています。Windows や Mac OS などよりもずっと効率よく処理できます。 Windows や Mac OS は、マルチタスク機能を後から組み込んでいるので、 Unix に比べるとややおそまつです。この効率のよい、信頼できるマルチタスク 機能は、ネットワーク通信やウェブサービスの分野で Linux を優位に立たせる 大きな要因となっています。