オペレーティングシステム

Definition:

オペレーティングシステム[OS,Operating System]とは、コンピュータのハードウェアを管理し、アプリケーションプログラムが動作するための環境を提供し、かつユーザーがコンピュータを利用するためのインターフェースを提供するソフトウェアのことを言う。

OSには、CPU・メモリ・ディスク・周辺機器などの管理とリソースの効率的な割り当てと制御を担うハードウェア管理、アプリケーションの実行管理・プロセス管理・ファイルシステムの提供を担う実行環境の提供、システムの操作手段の提供やGUIやCLIなどのインターフェースを担うユーザーインターフェースの提供という主要な3つの役割がある。

1956年、IBM 704向けに,ゼネラル・モーターズ(GM,General Motors)の研究所とNAA(North American Aviation)が共同開発したGM-NAA I/Oが世界最初のOSと言われている。

カーネルの基本機能

オペレーティングシステム(OS)の中核部分はカーネル(kernel)と呼ばれ、以下の管理機能を担う。

  • プロセス管理:CPU時間を複数のプログラム(プロセス)に配分するスケジューリングを行う。単一のCPUコアでも、タイムスライスを細かく切り替えることで複数プロセスが同時に動作しているように見せる(マルチタスキング)。
    • プリエンプティブ方式:OSが強制的にプロセスの実行を中断させ、別プロセスに切り替える
    • ノンプリエンプティブ(協調的)方式:プロセス自身が自発的にCPUを手放すまで実行を継続する
  • メモリ管理:主記憶の割り当てと解放を行う。仮想記憶(virtual memory)により、物理メモリの容量を超えるアドレス空間をプロセスに提供し、補助記憶(ディスク)へのページング/スワッピングで補う。
  • ファイルシステム管理:補助記憶上のデータをファイルおよびディレクトリという抽象構造で扱えるようにする。
  • デバイス管理:デバイスドライバを介して多様な入出力装置を統一的なインターフェースで扱えるようにする。
  • ネットワーク管理:通信プロトコルスタック(TCP/IPなど)を実装し、他機器との通信を可能にする。

OSの黎明期:バッチ処理システム

初期の電子計算機(1940年代後半〜1950年代)にはOSという概念自体が存在せず、オペレータが一台の機械を占有し、プログラムを紙テープやパンチカードで直接投入していた。プログラムの切り替えのたびに手作業でセットアップを行う必要があり、CPUの遊休時間が極めて長かった。

この非効率を解消するため、1950年代半ばにゼネラルモーターズ社とノースアメリカン・アビエーション社がIBM 704向けに開発した GM-NAA I/O が、最初期のバッチ処理システムの一つとされる。複数のジョブをまとめて投入し、前のジョブの終了後に自動的に次のジョブを起動する仕組みにより、オペレータの介入を最小化した。この時期の中心的な課題は、いかにCPUの遊休時間を減らし、ジョブ間の切り替えコストを下げるかであった。

タイムシェアリングとマルチプログラミングの確立

1960年代に入ると、MIT のフェルナンド・コルバトらが中心となって開発した CTSS(Compatible Time-Sharing System)により、複数のユーザーが端末を通じて一台の計算機を対話的に共有するタイムシェアリング方式が実証された。これはバッチ処理と対照的に、ユーザーが計算機の応答をリアルタイムで受け取れる点で画期的であった。

この流れを受け、MIT・ベル研究所・ゼネラル・エレクトリックの共同プロジェクトとして Multics(Multiplexed Information and Computing Service)が構想された。Multics は野心的すぎる設計ゆえに商業的には限定的な成功にとどまったが、ここで培われた概念——階層型ファイルシステム、動的リンク、アクセス制御リストによるセキュリティモデルなど——はその後のOS設計に深い影響を与えた。

UNIXの登場と設計思想

Multics プロジェクトから離脱したベル研究所のケン・トンプソンとデニス・リッチーは、1969年、より小規模で単純なシステムとして UNIX を開発した。当初はPDP-7上でアセンブリ言語により実装されたが、1973年にC言語で書き直されたことが後のOS開発に決定的な影響を及ぼした。C言語による実装は、ハードウェアアーキテクチャに依存しない移植性の高いOSという概念を初めて実用レベルで示した。

UNIXの設計思想は以下の点に集約される。

  • 「小さなプログラムを組み合わせる」というモジュール性(パイプによるプログラム間連携)
  • 「すべてはファイルである」という統一的な抽象化(デバイスもファイルとして扱う)
  • 階層型ディレクトリ構造
  • マルチユーザー・マルチタスクを前提とした設計

1970年代後半以降、UNIXはAT&Tによる商用ライセンスと、カリフォルニア大学バークレー校によるBSD(Berkeley Software Distribution)という二つの系統に分岐し、ワークステーションやミニコンピュータ市場で広く採用された。

パーソナルコンピュータ時代のOS

1970年代末から1980年代にかけて、マイクロプロセッサの普及によりパーソナルコンピュータ(PC)が個人・小規模事業者の手に届く価格帯に達すると、OSに対する要求は大きく変化した。マルチユーザーを前提としたUNIX系とは異なり、単一ユーザーが単一のタスクを扱うシンプルなOSが求められた。

  • 1981年、IBM PC向けに提供された MS-DOS(マイクロソフト社、当初はシアトル・コンピュータ・プロダクツ社の86-DOSを買収して改良したもの)は、コマンドライン操作を基本とし、PC/AT互換機市場の標準として広く普及した。
  • グラフィカルユーザーインターフェース(GUI)は、ゼロックス社のパロアルト研究所(PARC)で1970年代に開発された Xerox Alto の概念に端を発する。マウス、ウィンドウ、アイコンといった要素はここで初めて統合的に実装された。
  • この概念はアップル社の Macintosh(1984年発売、先行するLisaを経て)により商業的に普及し、続いてマイクロソフト社の Windows がMS-DOS上にGUI層を重ねる形で1985年に登場した。

マイクロカーネルとモノリシックカーネルの論争

1980年代後半から1990年代にかけて、OSの内部構造を巡る設計論争が生じた。

  • モノリシックカーネル:プロセス管理、メモリ管理、ファイルシステム、デバイスドライバなど、ほぼすべての機能を単一の特権モード(カーネル空間)で実行する方式。性能面で有利だが、一部の不具合がシステム全体に波及しやすい。
  • マイクロカーネル:カーネルには最小限の機能(プロセス間通信、基本的なスケジューリングなど)のみを残し、ファイルシステムやデバイスドライバをユーザー空間で動作する独立したサーバープロセスとして実装する方式。堅牢性・拡張性に優れるが、プロセス間通信のオーバーヘッドが課題となる。

この論争は1992年、当時ヘルシンキ大学の学生であったリーナス・トーバルズが開発した Linux カーネル(モノリシック方式を採用)と、タネンバウムらが教育目的で開発した MINIX(マイクロカーネル方式)との間で、ネットニュース上の公開議論として広く知られることとなった。Linux はGNUプロジェクトが開発してきたユーザー空間ツール群(GNU/Linux)と組み合わさり、オープンソースソフトウェアとして急速に発展し、現在ではサーバー・組み込み機器・スーパーコンピュータ・Android端末など極めて広範な領域で採用されている。

なお、マイクロカーネルの思想は完全に廃れたわけではなく、QNXやmacOSの基盤であるXNU(ハイブリッドカーネル、BSDとMachの要素を統合)などにその系譜が受け継がれている。

現代のOSが担う役割の拡張

現代のOSは、従来の資源管理・実行環境提供の枠を超え、以下のような機能を統合的に担うようになっている。

  • 仮想化とコンテナ化:ハイパーバイザ型仮想化(VMware、Xen、KVMなど)により、一台の物理機械上で複数のOSインスタンスを同時に稼働させる技術が普及した。さらに、カーネルの名前空間(namespace)機能とcgroupsを利用したコンテナ技術(Dockerなど)により、OSレベルでより軽量な分離を実現する手法が広まっている。
  • モバイル・組み込み向けOS:Android(Linuxカーネルベース)やiOS(XNUベース)のように、電力効率、タッチ操作、アプリケーションのサンドボックス化を重視した設計が主流となった。
  • セキュリティモデルの強化:アクセス制御の細分化(SELinux、AppArmorなど)、コード署名、サンドボックス機構が標準的に組み込まれるようになった。
  • クラウド環境への対応:大規模データセンターでの運用を前提とした、起動の高速化、リソースの動的割り当て、分散システムとの親和性が重視されるようになっている。

Mathematics is the language with which God has written the universe.





















数理統計学 機械学習