Linuxは複数のプロセスを同時に実行できるマルチタスクOSです。第2回目で紹介したように,プログラムはプロセスという単位で管理されており,それぞれが独立したメモリー空間を持つことで複数のプロセスが干渉しないように動作できます。

 しかし,通常のパソコンにはプロセッサが1つしか搭載されていませんので,同時に1つのプログラムしか実行できないはずです*1。なぜ,Linuxではマルチタスクを実現できるのでしょうか。その答えはカーネルにあります。

 今回は,カーネルがどのようにマルチタスクを実現しているかを解説します。

時分割でマルチタスクを実現

 最初にプロセッサがプログラムをどのように実行するかを見てみましょう。

 プロセッサの基本構造は至って単純です。プロセッサは「Program Counter(PC)」と呼ばれるレジスタが指し示すメモリー・アドレスから命令を読み込んで実行します。実行後は再度PCの内容を参照し,次に実行する命令を読み込むという動作をくり返します。PCに格納されているアドレスは,参照後に1ずつ増えますので,プログラムはアドレスの小さな部分から順にプロセッサで実行されることになるのです(図1)。

図1●プロセッサがプログラムを実行する仕組み
図1●プロセッサがプログラムを実行する仕組み
プロセッサは,PCが指し示す場所から命令を読み込んで実行します。参照後,PCの内容は+1されますので,プログラムは下位アドレスから順に実行されていきます。

 このような仕組みのプロセッサを搭載するコンピュータは,考案者*2の名前を取って「ノイマン型コンピュータ」と呼ばれています。現在のコンピュータはほとんどがノイマン型コンピュータで,さまざまな高速化の仕組みが導入されて複雑になっていますが,基本的な構造は変わっていません。

 つまり,仕組み上,ある瞬間にプロセッサで実行されるのは1つの命令だけです。ハードウエア・レベルで同時に命令を実行できませんから,厳密な意味でのマルチタスクは実現できません。

 「あれ? しかしLinuxではマルチタスクが実現できているぞ」と疑問に思われた方もいらっしゃるでしょう。実際,Linuxでは当たり前のように複数のアプリケーションやコマンドを同時に実行できます。しかし,これらは正確には,同時に実行されているわけではありません。

 実は,Linuxを含む多くのマルチタスクOSでは,実行するプロセスを短い間隔で次々に切り替えて,疑似的なマルチタスクを実現しています。切り替え速度が人間の感覚よりも速いので,見た目には同時に実行しているように見えるのです。このようなマルチタスク・システムを時分割システムと呼びます(図2)。

図2●時分割システム
図2●時分割システム
プロセッサが1つしかないシステムでは完全な並列実行は不可能ですから,時間を区切って各プロセスを切り替えることで,疑似的な並列実行を実現しています。これが時分割システムです。

 時分割システムは1962年に考案され,その後,UNIXの前身となったMulticsというOSにも採用されました。当時はコンピュータがまだ高価で,1台のコンピュータを複数の人間で利用するのが当たり前でしたから,時分割システムはとても重宝されました。そのころのコンピュータはまだ低速でしたが,表示が文字だけで良かったことや,人間がキー入力する速度が(コンピュータの処理速度に比べると)遅いことで,時分割システムは十分実用になったのです。

 最近のコンピュータは昔に比べてとても低価格かつ高速になっています。米Intel社の設立者Gordon Moore氏が提唱した「ムーアの法則」によると,コンピュータの性能は18カ月で2倍になっていくそうで*3,今のところこの法則通りに進化しています。今では,家庭用のコンピュータでも時分割システムを余裕で動作させられるようになりました。ただし現在では,複数のユーザーでコンピュータを共用するためというよりは,1人のユーザーが複数の作業を同時実行するためにこの仕組みが主に利用されています。