OSは何のためにあるの?

 私たちは,パソコンを使うときは必ず,Windows,Mac OS X,LinuxなどのOS(Operating System)を起動しているはずです。今やOSなしにパソコンを使うことは考えられません。では,OSは何のためにあるのでしょうか? 簡単に言えば「ユーザーやプログラマに,コンピュータ(ハードウエア)の機能をわかりやすい形で提供するため」ということになるでしょう。コンピュータのハードウエアを直接操作するのでは大変なので,ユーザーもプログラマもOSが提供する機能やサービスを通してコンピュータを利用しているのです。

 現代のOSはいろいろな機能を提供します。その中でも主要なものを図1に挙げました。(1)プロセス/スレッド管理(2)メモリー管理は,複数のアプリケーションを同時に動かす(マルチタスクまたはマルチタスキングと言います)ための仕組みを提供します。一般的に使われているパソコンの多くは,プロセサが一つしか搭載されていません。それでも複数のアプリケーションが(見かけ上)動作するのは,プロセス/スレッド管理機能が処理の単位を細かく分けて実行することで,同時に処理が進んでいるように見せているからです。そして,それぞれのプログラムごとにメモリー空間を割り当てて,ほかのプログラムと干渉しあわないようにするのがメモリー管理機能の役割です。

図1●現代的なOSが共通に備える八つの基本機能。もちろんOSによっては,これ以外の付加機能をさらに多く備えているものもある
図1●現代的なOSが共通に備える八つの基本機能。もちろんOSによっては,これ以外の付加機能をさらに多く備えているものもある

 かつてのパソコン用OSでは,同時に複数のアプリケーションを動かすことなどできませんでした。現在では,ファイルのコピーを実行しながらメールをチェックするといったマルチタスクが当たり前になっています。

 (3)ファイル・システムは,パソコン上で扱うファイルを管理する機能です。OS上でファイルとして見えるデータは,ハードディスクなどの記憶装置に書き込まれています。しかし実際には,ディスクにファイルやフォルダといった概念はなく,ビットのら列を記録しているにすぎません。これをユーザーにわかりやすいように,ファイルやフォルダとして見せているのがファイル・システムです。

 (4)ハードウエアの抽象化は,ハードウエア環境の違いをユーザーに感じさせないための機能です。販売店などで売られている多数のパソコンを見比べると,CPUやグラフィックス・チップなどの細かい仕様が少しずつ異なるのがわかります。また,パソコンに接続するプリンタ,スキャナ,CD/DVDドライブなどもいろいろな種類があります。このように異なるハードウエア構成のパソコンを同じような手順で操作できるようにするのがハードウエアの抽象化機能です。これはプログラマにも恩恵をもたらします。アプリケーションに印刷機能を持たせたいとき,プリンタの種類ごとに異なるプログラムを用意しなければならないのではとても大変です。同じプログラミング・インタフェース(後述)を通して,いろいろな種類のハードウエアを統一的に操作可能にすることも抽象化の役目です。

図2●ハードウエアを抽象化することで,OSはアーキテクチャの異なるプロセサでも動作する。OS上では操作性などに違いはない
図2●ハードウエアを抽象化することで,OSはアーキテクチャの異なるプロセサでも動作する。OS上では操作性などに違いはない

 アーキテクチャが全く異なるプロセサで同じOSが動作するのも,ハードウエアの抽象化に関係があります。例えばWindowsは,米Intelのx86アーキテクチャで動作するものがほとんどですが,Windows Server 2003に限ってはIntelの「Itanium」シリーズ(IA64)用のものもあります。x86とIA64はアーキテクチャが異なりますが,Windows Server 2003としては全く同じ方法で操作できます。Windowsに限らず,Mac OS X,Linux/UNIX,組み込みOSなどもいろいろなプロセサで動作しています(図2)。同じOSであれば,アプリケーションもコンパイルし直すことで,異なるアーキテクチャのプロセサ上で動作するようになります。

 (5)セキュリティ管理は,OSを利用するユーザーに適切な権限を与え,その権限に応じて実行できることを制限する機能です。最近のOSは複数のユーザーで共用できるようになっています。このとき自分が作成したファイルをほかの人が勝手に参照したり編集したりするのは困ります。こうした場合,共有するパソコンのOSには,利用者それぞれのユーザー・アカウントを作成するのが一般的です。適切にユーザー権限を使い分ければ,ユーザーがアクセスできるファイルを限定できます。

 (6)ユーザー・インタフェースは,OSとユーザーの仲立ちをする機能です。ユーザーがマウスやキーボードで命令を出すと,OSはその指示に従って動作します。そして結果をディスプレイやプリンタに出力します。ユーザー・インタフェースにはGUI(Graphical User Interface)とCUI(Command User Interface)の2種類があります。Windowsなど,現在主流のOSはGUIによる操作を基本としています。ただし,コマンドプロンプトのようなCUIのインタフェースも備えています。GUIでは,コマンドを知らなくても目で見て直感的に操作できるので,一般のユーザーがコマンドプロンプトを使う場面は減っています。しかし,プログラマは例外です。いまだにコマンド・ベースで使うコンパイラやフリーソフトがあるからです。

 (7)プログラミング・インタフェースは,プログラマに最も関係する機能です。前述のハードウエアの抽象化にも深く関係します。例えば,画面にフォームを表示するだけのアプリケーションを作るとします。適切なプログラミング・インタフェースがあれば,フォームを描画する関数やクラスを呼び出すだけで済みます。これが,フォームを表示させるのにグラフィックス・チップを操作しなければならないとしたらどうでしょうか。画面上の位置をピクセル単位で指定し,適切な色を設定し,グラフィックス・チップに描画を依頼するということになります。

 OSは,このような面倒な処理を簡単に済ませるためのAPI(Application Programming Interface)を提供します。WindowsではWin32 APIと呼ぶAPIを利用すれば,プログラムから関数を呼び出す形でOSの機能を利用できます。ただし最近では,OSの上で動作するアプリケーション実行環境 .NET Frameworkを利用してプログラムを作ることが一般的です。この場合は,間接的にOSの機能を利用するということになります。これはJavaプログラムとJava VM(仮想マシン)の関係と同じです。

 (8)ネットワーク機能は,インターネットが普及して不可欠になった機能です。インターネットの標準プロトコルであるTCP/IPで通信する機能をOSが提供します。TCP/IPの上に位置するアプリケーション層のプロトコルも一部提供しています。Windowsが備えているファイル共有プロトコル「Common Internet File System(CIFS)」などがそうです。また最近のOSはメール・クライアントとWebブラウザを標準で備えていますから,メールやWebで使用するプロトコル(POP,SMTP,HTTPなど)も提供していると言えるでしょう。

 インターネット普及以前には,メーカー独自のプロトコル(NetBEUIやAppleTalkなど)による通信機能を備え,社内や部署内で容易にLAN(Local Area Network)を組めるOSもありました。ただし現在ではメーカー独自のプロトコルを利用する場面は減っています。