オペレーティングシステム
オペレーティングシステム (Operating System, OS) は、コンピュータにおいて、ハードウェアを抽象化したインターフェースをアプリケーションソフトウェアに提供するソフトウェアであり、基本ソフトウェアの一種です。なお、OSのGUIフロントエンドであるオペレーティング環境についてもここで扱います。広義のOSには、ウィンドウシステムやデータベース管理システム (DBMS) などのミドルウェア、ファイル管理ソフトウェアやエディタや各種設定ツールなどのユーティリティ(これらはいずれも基本ソフトウェア)、基本的なアプリケーションソフトウェア(ウェブブラウザや時計などのアクセサリ)を含むことがあります。一般的に「オペレーティングシステム」という場合はこちらを指すことが多いです。現在に至る統合環境と平易なユーザインタフェースを意識する傾向は、Mac OSやMicrosoft Windowsの登場で鮮明となりました。このため、Mac OS以降の近年のOSとMS-DOSなどの初期のOSは分けて扱われることが多いです。OSの中で、ハードウェアを直接管理操作するなどの最も中心的な機能の部分を、特にカーネルと呼んで分けることもあります。この場合、カーネル以外の部分(シェルなど)はユーザーランドと呼ばれます。また、カーネルとユーザーランドではCPUモードやアドレス空間が異なっています。ちなみにオペレーティングシステムは完全な一般名詞ですが、“OS”は本来IBMの商標です。
OSの目的
OSの主な目的は3つあります。すなわち、ハードウェアの抽象化、リソースの管理、そしてコンピュータ利用効率の向上です。
ハードウェアの抽象化
コンピュータごとに目的は同じでも製造元が異なるなどで、動作に微妙に差異があるハードウェアが搭載されていることが多いです。そのようなハードウェアの統一的で単純化された利用方法を提供することで、アプリケーションソフトウェアの開発を容易にします。
リソースの管理
複数のアプリケーションソフトウェアを同時に利用する際に、互いに独立して動作できるように資源を管理します。プログラムからの資源要求に競合が起きた場合には、待たせる、エラーを返すなど、適切に対処します。
コンピュータの利用効率の向上
複数のタスクを同時に実行する際に、資源割り当ての順番や処理の割り当て時間を工夫することで、全体のスループットを向上させます。これはデスクトップ環境ではあまり恩恵を感じることはないですが、ウェブサーバやデータベースなど大量のアクセスをこなす用途などでは重要になります。
OSの主な機能
APIとABI
OSはアプリケーションソフトウェアを動作させるのが第一の目的です。このためのインターフェースがAPI(アプリケーションプログラミング・インタフェース)とABI(アプリケーションバイナリ・インタフェース)である。カーネルはシステムコールによってアプリケーションにサービスを提供します。さらに基本ライブラリも含めた形でアプリケーションに対してAPI/ABIを提供します。アプリケーションによってはOS上のミドルウェアやアプリケーションフレームワークなどをAPIとして使用する場合もあります。APIはプログラミングのためのインターフェースであり、プログラムを作成する際の規則を構成します。例えば、C言語での関数やFORTRAN/Pascalなどのライブラリ呼び出しといったものがそれにあたります。一方、ABIはコンパイルされたソフトウェアがOSの機能を呼び出す際のインタフェースであり、プロセスが動作する際の規則を構成します。例えば、UNIX系のOSはAPIがほとんど共通ですが、ABIはOSによって異なります。従って、同じCPUを使ったシステムであっても、ABIが異なれば実行ファイルが異なります。ABIには、エンディアン、実行ファイルの形式、システムコールの具体的な方法、コールスタックの使い方などが含まれます。プロセス管理
コンピュータ上の各動作はバックグラウンドであっても一般のアプリケーションであっても、内部的にはプロセスとして動作します。DOSのような古いOSは一度に1つのプロセスしか実行できません。最近のOSは一度に複数のプロセスを動作させることができます(マルチタスク)。プロセス管理は複数のプロセスを実行するためにOSが行う処理です。プロセッサを1つだけ持つ一般的なコンピュータでは、マルチタスクは高速にプロセスからプロセスへ切り替えを行うことで実現されます。ユーザーがより多くのプロセスを実行すれば、個々のプロセスに割り当てられる時間は少なくなっていきます。多くのシステムでは、これが音声の途切れやマウスカーソルの奇妙な動作などを引き起こします。一般的なプロセス管理は、プロセスごとに優先度を与え、それによって配分される時間を決めています。メモリ管理
パーキンソンの法則によると、「メモリを拡張するとプログラムはそれに伴って拡大する」といいます。プログラマーは無限の容量と無限の速度のメモリを理想としています。コンピュータのメモリは階層構造になっていて、最も高速なレジスタから、キャッシュメモリ、RAM、最も低速なディスク装置があります。OS内のメモリ管理部はこのようなメモリを管理するもので、利用可能な部分、割り当てと解放、主記憶と二次記憶との間でのスワップなどを制御します。ファイルシステム
OSはその歴史や用途に応じて様々のファイルシステムを備えています。現在主流のOSにおいては、ほとんど全てのファイルシステムはディレクトリによる階層構造を持っています。これは、Multicsを起源とするものであり、メインフレームのOSではディレクトリを持たないものもあります。また、ディレクトリ名とファイル名の区切り記号、ファイルの命名規則などはシステムによって異なります。代表例
Linuxを元プラットフォームとして開発されたものにはext2、ext3、ReiserFSなどがある。また、他のプラットフォームからXFS、JFS、FATファイルシステムなどが移植され、NTFSも不十分ながら読み書きが可能です。Macintoshではまず最初にMacintosh File System (MFS) が実装されましたが、ディレクトリ機能を備えていなかったためファイルブラウザFinderでフォルダをエミュレーションしていました。その後Hierarchical File System (HFS) でディレクトリ機能を実装し、現在は改良を加えたHFS+が採用されています。現在Mac OS Xで読み書きが可能なものはHFS、HFS+、UNIX File System (UFS)、FATとなります。なおUFSの使用は一般でなく、FATへの対応は他プラットフォームとのデータ交換に用いられます。NTFSは読み込みのみが可能であり、書き込みについてはCommon Internet File System (CIFS) によるネットワークを介したものに限られます。Windowsが標準で扱えるファイルシステムは、FAT、FAT32、NTFSです。現在Windows上ではNTFSが最も信頼性と効率が高いものとして一般的に利用されます。FATはMS-DOSから採用される古いファイルシステムですが、パーティションやファイルサイズに制限があり、大容量化したハードディスクではあまり用いられません。
プラットフォーム間の差異
FATはその仕様の制限から大容量のハードディスクには向かないですが、その一方構造が単純でデジタルカメラや携帯電話などの組み込みシステム向けを含むさまざまなOSで読み書き可能なことから、各種メモリカードやUSBメモリなどプラットフォームを跨ぐ用途においては主流です。なお、それらフラッシュディスクの大容量化に対応するため、マイクロソフトはFATを拡張したexFATというファイルシステムを発表しています。MacintoshからWindows等へファイルを転送すると、転送先のWindows側に本体とは別のファイルが出現することがあります。これはHFSやHFS+のみがサポートするリソースフォークと呼ばれるデータ構造によるもので、Macintoshではそれらを一元的に管理を行うため一つの書類に見えます。このように幾つものフォークを一つのデータに格納することをマルチフォークと呼び、もとのデータを改変することなくOS独自の管理情報を容易に付与できる機能ですが、実質的にMacintoshでしか利用できません。
障害への対応
ファイルシステムには、急な電源切断などによる障害へ対応する機構を持つものがあります。ジャーナルファイルシステムが最もよく採用される機構であり、その他にもZFSのように書き込み操作をトランザクションとして扱うものもあります。これらを用いることで、障害復旧時のチェックを大幅に短縮する、または完全に不要にします。一方これらの機構を持たないファイルシステムでは、ファイルシステムの整合性を保つためストレージ全体を検査する必要があります。
ネットワーク
多くのOSはTCP/IPプロトコルをサポートしています。歴史的に見れば、初期のコンピュータネットワークはモデムを使って電話回線で行われていました(BSC手順など)。その後、パケット通信が使われるようになり、IBMのSNAなどの各社独自のネットワークアーキテクチャが登場しました。現在では、TCP/IPを中心とした通信が主流となっています。通信プロトコルは、トランスポート層まではカーネル内モジュールとして実装し、プレゼンテーション層より上はシステムプロセスとして実装されるのが一般的です。セッション層の実装はシステムによって異なります。セキュリティ
OSが関係するセキュリティ機能は、ユーザーがリソースへの何らかのアクセスを行う際に前もって認証し、そのユーザーのアクセスレベルを決定し、管理者の方針に基づいてアクセスを制限することです。グラフィカルユーザーインタフェース(GUI)
最近のOSは一般にGUIを持っています。多くのプロプライエタリなシステム(Windows やMac OS)はカーネルとGUIが密接に関係しています。他のOSではユーザーインターフェースはモジュール化されていて、任意のGUIをインストールしたり、新たなGUIを作成したりできます(Linux、FreeBSD、OpenSolaris)。Windowsでは新たなバージョンが登場するたびにGUIを変更してきました。初期のWindowsからWindows Vistaまでを比べてみると、その変化は大きいです。Macでは初期からSystem 6.0.xまでが白黒のGUIでしたが、System 7以降はカラー化されたのみで、Mac OS 8でプラチナアピアランスが採用されても、Mac OS 9.2.2までは基本要素はほぼ変わりませんでした。しかしMac OS Xになって完全に刷新され、AquaベースのGUIになりました。Mac OS X v10.3以降ではメタルアピアランスが導入され、その後もバージョンアップのたびに少しずつ手が加えられています。また、Aquaとは別にX11も用意されています。Mac OS Xの前身のNEXTSTEPは様々な独創的なGUI要素で知られ、他のOSやデスクトップ環境に大きな影響を与えました。グレースケールのシステムであったころよりアルファチャンネルを備えていたのは特筆すべき点です。Linuxでは、GUIを提供するデスクトップ環境がいくつか存在します。Linuxで使えるGUIとして有名なものは、GNOMEとKDEがあります。デバイスドライバ
デバイスドライバはハードウェアとのやり取りをするためのソフトウェアです。一般にハードウェアとの通信を行うインタフェースを持ち、ハードウェアの接続される何らかの通信サブシステムやバスを経由して通信を行います。コマンドをハードウェアに送り、データの送受信を行います。また、一方でOSやアプリケーションに対するインタフェースも提供します。ハードウェアに強く依存するプログラムであり、OSにも依存しています。これによって、OSやアプリケーションがハードウェアを使って動作することが容易になっています。ハードウェアの非同期的な割り込みの処理もデバイスドライバの役割です。デバイスドライバの主たる設計目標は抽象化です。ハードウェアは用途が同種のものであっても、機種によって動作や性能などがそれぞれ異なります。新たな機能や性能を提供するハードウェアが登場したとき、それらは従来とは異なった制御方式を採用していることが多いです。OSを将来にわたってあらゆるハードウェアを制御できるように設計するのは困難です。従って、個別のハードウェアの制御をOSから切り離す必要があります。デバイスドライバはOSとのインタフェース(関数呼び出し)をデバイス固有の処理に変換することが主たる機能となります。理論的には、新たな制御方法の新しいハードウェアが登場しても、そのハードウェア用のドライバが古いOSに対応していれば、古いOSでもドライバだけ置き換えればハードウェアを制御可能となります。OSの歴史について