アプリケーションを動かすことこそOSの仕事
OSの最大の目的とは、アプリケーションプログラムを動作させることだ。OS自体がどういう構成をしていようと、アプリケーションが動かないOSは無意味な存在である。スケジューラーもメモリー管理も、すべてはアプリケーションプログラムのために存在する。
メモリーを必要としたり別のスレッドを起動しようとするなど、アプリケーションがOS側の機能を利用するときに使うのが、「API」(Application Program Interface)である。これは、アプリケーションのバイナリ形式とともに各OSで定義されていて、OSがアプリケーションに対して提供する機能の集まりであるとともに、その呼びだし方や必要なパラメーターなどを定義したものだ。
OSによってはGUIの機能がOS本体と不可分で、APIとしてGUIを構築する機能を提供するものもある。というのも、GUIは複雑な仕組みであるため、アプリケーションのレスポンスを上げるには、システムと密接に動作する必要があるからだ。Windowsも今ではGUIを分離できるようになったが、以前は不可分であった。
ちなみに、GUIは必ずしもOS自身が提供するというわけではない。Linux系ではパッケージ(ディストリビューション)にGUIシステムが含まれているが、画面関連の処理は、独立したアプリケーションである「X Window System」が担当する。そのため、XなしGUIなしのシステムを作ることができる。また、Androidは同じLinuxカーネルを使うものの、X Windowは使わずにJava側の機能としてGUIを実現している。しかし、Android全体を見るとGUIは必須であり、OSの一部になっているといえる。
もともとWindows NTは、GUI部分を含んだ「Windowsサブシステム」という部分があり、ほかのOS(例えばPOSIXやOS/2)のサブシステムも持っていた。WindowsサブシステムはあくまでWindows NTが持つAPIセットのひとつであり、その中でWin32 APIに準拠したアプリケーションが動くものだったのである。しかしその後、ほかのサブシステムをWindowsに搭載する必要性は薄れたため、現在ではWindowsサブシステムと一体になったOSになった。それでも元をたどれば、Windows NTは複数のAPIセットを提供し、それぞれのアプリケーションを実行できるようになっていたのだ。
APIにはOSが管理している資源の利用などのほかに、アプリケーションに対して、“あると便利”な機能などを提供する。例えば単純なファイルアクセスだけでなく、ZIP圧縮ファイルを扱うようなAPIがそれだ。圧縮ファイルはファイルのフォーマットであり、かつてはサードパーティアプリケーションとして、圧縮/解凍ユーティリティーが提供されていた(今でもあるが)。
これらはOSが提供するファイルアクセスのAPIを使い、アプリケーション内でファイルを圧縮/解凍するプログラムとして存在していたわけだ。そのうちに、ZIPなど広く使われる圧縮フォーマットが確定すると、OSはこれをシステム側の機能として提供するようになる。ZIPフォーマットをエクスプローラーで直接扱うしくみは、Windows XPで取り込まれたものだ。
OSが提供して、アプリケーションが制御して利用可能な機能は、すべてAPIであると言える。中にはビデオ再生のように、機能自体がアプリケーションに近いものもある。しかし、ビデオを再生するだけで一からプログラムを書かねばならないOSには、ビデオを扱うアプリケーションは登場しないだろう。
Windows NTはなぜPOSIXサブシステムを搭載していたのか?
Windows NTがPOSIXサブシステムを搭載していたのは、米国政府が「政府で利用するコンピューターシステムは、すべてPOSIX準拠でなければダメ」と決めていたためだ。そのためWindows 2000までは、POSIXサブシステムが標準搭載されていた。
Windows XPからは「Services for UNIX」を別途導入して使うものになり、現在は「Subsystem for UNIX-based Applications」(日本語版ではUNIXベースアプリケーション用サブシステム)という形で、Windows 7などに付属している。
これらは標準ではインストールされておらず、コントロールパネルにある「プログラムと機能」から、「Windowsの機能の有効化または無効化」を使って追加できる。関連のアドオンは「Utilities and SDK for Subsystem for UNIX-based Applications」として、マイクロソフトのダウンロードセンターで配布されている。

この連載の記事
- 第13回 ARM版Windows 8実現の布石となったWindows 7の「MinWin」
- 第11回 マルチコアCPUの消費電力はスケジューリングで変わる?
- 第10回 AMD FX向けにパッチで修正 スケジューラーが抱える難題
- 第9回 マルチコアCPUを賢く使いこなす スケジューリングの秘密
- 第8回 意味の違いがわかる? タスクとプロセスとスレッド
- 第7回 Windowsのメモリー管理をx86の仕組みから読み解く
- 第6回 メモリー不足を根本的に解決する64bit OSの仕組み
- 第5回 Windows 8でMetro Styleアプリを動かす「WinRT」
- 第4回 Windowsを動かすデバイスドライバーの仕組み 前編
- 第3回 OSの仕事はハードウェアをアプリから「隠す」こと?
- この連載の一覧へ