「OS」はどうやってプログラムを動かしているのか?

文●塩田紳二

2011年07月28日 12時00分

 「OS」こと「オペレーティングシステム」は、コンピューターのソフトウェアの1種で、「基本ソフトウェア」とも呼ばれる。簡単にいうと「アプリケーションソフトウェアを動かすためのソフト」のことだ。アプリケーションという「ソフトウェア」を動かすのに、OSという「ソフトウェア」が必要とはなんだか言葉遊びのようだが、ここがコンピューターのコンピューターたる所以でもある。

 本連載では私たちに馴染みの深いOSであるWindowsやAndroidを題材に、身近なOSの内部構造について説明していきたい。特にWindowsに関しては、Windows XP時代以前とWindows 7/Vista以降で大きく様変わりしているので、「OSの話なんて、もう聞き飽きたよ」という方にもお楽しみいただけるかと思う。

OSの仕事はアプリを動かすための
リソース管理にあり

OSはアプリケーションからの要求を受けて、管理するハードウェアを操作する

 OSの役割は、「アプリケーションソフトウェアを動かす」という説明の「動かす」にある。OSはアプリケーションをメモリーに読み込んで、実行を開始する。しかし、例えばウェブブラウザーではインターネット接続が必要だし、表計算ソフトではグラフを表示するなどのグラフィックス機能が、ゲームに至ってはGPUを制御して画面を描画するといった機能が必要になる。

 こうした機能を、すべてアプリケーション内に抱え込んで実現することはできない。それだけでプログラムが膨大になってしまう。動作するパソコンにどのようなハードウェアがあるかを事前に特定できないので、考えられるすべてのハードウェアに対応しなければならなくなるからだ。

 そうは言っても、アプリケーションがハードウェアを直接操作するのは、MS-DOSの時代には頻繁に行なわれていた。そのためアプリケーションにバグがあったり設定を間違ったりすると、容易くパソコンがフリーズするといったことが珍しくなかった。WindowsのようなモダンなOSが開発されたのは、グラフィックスやサウンドなどのハードウェアを、アプリケーションが管理しなくていいようにするためだった。

 OSはユーザーがコンピューターで実行するプログラムを、効率的に動かすためのソフトウェアとして作られた。まっさらなコンピューターにプログラムをどう実行させて、次のプログラムにどう切り替えるかといった処理を、手作業ではなくコンピューター自身に管理させるのがOSの発想である。

 コンピューターは機械なので、壊れないかぎりずっと動き続ける。だが、毎回人間が「次はこのプログラム」と面倒をみていたのでは大変だ。そこで、「コンピューターが次に何をやらせるか」を指示できるように、コンピューターの面倒はコンピューター自身ができるようなプログラムを作ればいい。それを実現するためには、実行するアプリケーションプログラムにも、「仕事が終わったときにどうするのか」や「エラーならどうすべきか」といったルールを定義しなければならない。

 アプリケーションが必要とする一般的な機能は、OSが管理してアプリケーションに機能を提供する。これを「資源(リソース)の管理」という。リソースとは、各種I/OデバイスからCPUの処理時間、HDD上の記憶領域など、「コンピューター自体をプログラムから扱えるもの」として考えたものをいう。逆に言えば、ハードウェアの一部であってもプログラムから扱えないものは、リソースにはならない。例えばノートパソコンの画面やキーボードはリソースとして扱えるが、筐体そのものやディスプレーのヒンジなどは、リソースにはならない。

 一定のルールに従ったアプリケーションプログラムであれば、OSはメモリーに読み込んで実行させる。アプリケーションが要求するなら、他のプログラムに影響が出ないようにリソースを割り当てるわけだ。

マルチタスクの実現が
OSによるリソース管理を生んだ

 なぜOSが資源を管理する必要があるのか? それは現在のOSが、すべて「マルチタスク」、つまり複数のプログラムを同時に動かせるからだ。ひとつのプログラムがハードウェアを占有してしまうと、ほかのプログラムが処理を進められなくなってしまう。あるいは、2つのプログラムが同時にひとつのデバイスにアクセスすると、正しく動かなくなる。

 OSは、これらの資源を管理しており、アプリケーションの要求に従って機能としてこれを提供するのである。機能を提供するとはどういうことかというと、ハードウェアなどを直接使わせないかわりに、OS自体が要求を聞いて仕事をすることだ。つまり、管理といっても貸し借りの管理をするのではなく、要求がきたら現在の状況を考えて、要求を満たすように処理するわけだ。

 アプリケーションはOSに仕事を依頼する。その手続きを決めたものが「API」(Application Program Interface)だ。アプリケーションはAPIを使い、OSに仕事を頼むのである。

 ここまで読むと、あたかも「アプリケーション」と「OS」という2つの異なる状態があるように読める。だが実際には同じCPUが、あるときはアプリケーションを動かし、あるときはOSを動かしているだけだ。APIには「ABI」(Application Binary Interface)というものが定義されていて、CPUがここを通ることで、アプリケーションからOSに生まれ変わるのである。

 「生まれ変わる」と言うのは、ABIを通った瞬間にCPUはアプリケーションのプログラムではなく、OS側のプログラムを実行し始めるからだ。「ピン芸人が店員と客の1人2役のコントを演じる」ようなものである。

 ABIは同時に、アプリケーションを構成するプログラムが、どのような形でファイルの中にしまわれているかも定義する。この約束事に従った「1」と「0」からなるファイルだけを、OSはプログラムとして認識して実行する。ということは、ABIはプログラムを「どうやって作るのか」も決めているわけだ。あるOSで動くアプリケーションプログラムを作るには、このルールに従うしかない。

 OSが提供する機能は複雑だが、基本的な原理は「プログラムをメモリーに読み込んで実行する」だけだ。OSはプログラムが大量にあって複雑なだけで、原理自体はそんなに難しいものでもない。プログラムはメモリーに入れないと実行できないし、CPUはメモリーにあるプログラムを、OSの指示に従ってひたすら実行しているだけである。OSの多くの部分はAPIという「決めごと」からできていて、それにしたがっているプログラムだけを実行できる。もちろん、この「決めごと」にはそれぞれちゃんとした存在理由がある。

 プログラム自体はなんらかの「論理」(ロジック)に従うものだが、大小様々な多数のプログラムが集めて作られているOS全体は、なにか非常に複雑で雑多なもののように見える。建物は物理法則に従い建築の理論で造られるのに対して、建物が集まった「町」は雑多なものになるのに似ている、とも言えようか。

 次回は、OSの中心部分にあたる「カーネル」について解説したい。

Windows XP以前とVista以降でのOS起動の違い

 Windows XPまでの「Windows NT」を受け継いだOSは、OS起動の仕組みも引き継いでいる。XPでは「MBR」(Master Boot Record)と呼ばれる領域にある「ブートストラップローダー」が、「NTLDR」と呼ばれるOSローダーを起動する。そしてハードウェアのチェックなどを経て、NTのカーネルである「ntoskrnl.exe」を起動していた。

 Vista以後はさらにもう一段階増えている。ブートストラップローダーが起動するのは、「Windows Boot manager」(bootmgr)というシステム起動を管理するプログラムで、ここで起動するOSなどを選択できるようになっている。Windows 7の場合は、「winload.exe」というシステム起動プログラムが起動される。ブートマネージャーが間に入ったのは、BIOSからの起動だけでなく、新しい世代の基本プログラムである「EFI」からの起動も可能にするためだ。またWindows側でも、Windows Server 2008 R2の仮想環境「HyperVisor」が起動するなど、起動が複雑になってきたからでもある。

■関連記事