# The UNIX Time-Sharing System > [!abstract] 概要 > UNIX は、Digital Equipment Corporation の PDP-11/40 および 11/45 コンピュータ向けの汎用、マルチユーザー、対話型オペレーティングシステムである。本システムは、より大規模なオペレーティングシステムにおいてさえ稀にしか見られない多くの機能を提供している。それらには以下のものが含まれる:(1) 着脱可能ボリュームを組み込んだ階層型ファイルシステム、(2) 互換性のあるファイル・デバイス・プロセス間I/O、(3) 非同期プロセスを開始する能力、(4) ユーザーごとに選択可能なシステムコマンド言語、(5) 1ダースの言語を含む100以上のサブシステム。本稿では、ファイルシステムおよびユーザーコマンドインターフェースの性質と実装について論じる。 ## 論文情報 - **著者**: Dennis M. Ritchie([[Dennis M. Ritchie]])、Ken Thompson([[Ken Thompson]]) - **所属**: [[AT&T Bell Laboratories]] - **掲載誌**: *Communications of the ACM* (CACM), Volume 17, Number 7, pp. 365–375, July 1974.(初出: SOSP 1973) - **DOI**: [10.1145/361011.361061](https://doi.org/10.1145/361011.361061) ## 概要 本論文は、現代のオペレーティングシステムの設計思想を決定づけた UNIX システムの構造と実装を体系的に解説した論文である。DEC PDP-11 上で構築された UNIX は、巨大で複雑になりがちだった当時のタイムシェアリングシステム(Multics や OS/360 など)とは対照的に、極めて簡潔で直交性の高い基本概念の組み合わせによって強力な計算環境を実現した。中核となる設計概念として、(1) 単純なバイト列としてのファイル表現と統一的な階層型ファイルシステム、(2) ファイル、周辺デバイス、プロセス間パイプラインを同一のシステムコールで操作する統一入出力モデル(Everything is a file)、(3) `fork` と `exec` による直交的でクリーンなプロセス管理、(4) OS カーネルの特権をもたず通常のユーザープログラムとして動作・差し替え可能なシェル環境を提示した。 ## 問題設定 1960年代後半から1970年代初頭のオペレーティングシステムは、高機能化に伴いコードベースが肥大化し、信頼性の低下、理解の困難さ、高価なハードウェア要求という課題に直面していた。また、ファイルシステムにおける複雑なレコード構造やアクセス方式の不統一、デバイスごとに異なる入出力規約が、プログラミングの生産性を著しく阻害していた。 ## 提案手法とシステム構造 ### 1. ファイルシステム - **バイト配列としてのファイル**: ファイルは特定の内部レコード構造を持たず、任意の解釈が可能なバイト列として抽象化される。 - **階層ディレクトリ構造**: ルートディレクトリを頂点とする木構造。各ディレクトリはファイル名と i-node 番号のペアのみを含む通常のファイルとして扱われる。 - **着脱可能ボリュームの透過的統合**: `mount` システムコールにより、独立したディスクパック上のファイルシステムを既存ツリーの任意のディレクトリに透過的に接合できる。 - **i-node(Index Node)**: ファイルのパーミッション、所有者、サイズ、ディスクブロック配置アドレスを保持するメタデータ構造。ファイル名はディレクトリ側に保持されるため、1つの i-node に対して複数のディレクトリエントリからリンク(ハードリンク)が可能。 - **デバイスのファイル化**: 特殊ファイル(`/dev`)を通じて周辺機器にアクセスし、通常のディスクファイルと完全に同一の `read` / `write` システムコールで操作可能。 ### 2. プロセス管理 - **fork**: 親プロセスのメモリイメージを複製して新しい子プロセスを生成する。 - **exec**: 現在のプロセスのメモリ空間を新しい実行可能プログラムで上書きし、実行を開始する。 - **wait**: 子プロセスの終了と終了ステータスを同期して待機する。 このプロセス生成モデルは、特権的サブルーチンをカーネルに増やさず、高度に柔軟なプロセス制御を直交的に提供する。 ### 3. 入出力とパイプライン - ファイル記述子(File Descriptor)を用いたオープン、クローズ、読み込み、書き込みの統一。 - **パイプ(Pipe)**: あるプロセスの標準出力を別のプロセスの標準入力に直接接続するバッファ付き単方向通信路。複雑なタスクを単一の巨大プログラムで解くのではなく、単一機能の小さなツール群を合成して解く「UNIX哲学」の技術的根底を形成した。 ### 4. コマンド言語(Shell) - シェルは OS カーネルの一部ではなく、通常のユーザー空間プログラムとして実行される。 - 入出力リダイレクト(`<`, `>`)やパイプライン(`|`)、バックグラウンド実行(`&`)をシェルの構文として提供し、ユーザーごとの自由な拡張や差し替えを可能にした。 ## 新規性 1. **極小性と直交性による汎用性の実現**: 複雑なシステムコール体系を排除し、わずか数十個の直交的な基本命令(`open`, `read`, `write`, `close`, `fork`, `exec`, `pipe`)で完全な対話型システムを構築した。 2. **入出力とデバイス抽象化の一元化**: デバイスやパイプをすべてファイル記述子で抽象化し、再利用可能なフィルタプログラム群の協調を可能にした。 3. **シェルとカーネルの明確な分離**: システム操作の中核であるコマンドインタープリタを特権空間から追い出し、一般プロセスとして動作させた。 ## 考察 UNIX の成功の鍵は、ハードウェアの制約(ミニコンピュータ PDP-11)の中で必要最小限の強力な抽象化を見極めた点にある。C言語によるカーネルの再記述(移植性の獲得)と相まって、UNIX は学術界および産業界に急速に普及し、POSIX 標準、BSD、Linux、macOS に至る現代のすべての主要オペレーティングシステムの原点となった。 ## 強み / 弱点・課題 - **強み**: 簡潔でエレガントな設計。高い移植性。小さなツールのパイプ結合による高いソフトウェア再利用性。 - **課題・制約**: 初期の UNIX ではファイルアクセスのセキュリティモデルが単純(ユーザー、グループ、他者の3階層パーミッションのみ)であり、大規模エンタープライズ向けのきめ細かなアクセス制御(ACL)やマルチスレッド対応は後年の拡張を要した。 ## 出典 - Dennis M. Ritchie and Ken Thompson, "The UNIX Time-Sharing System", *Communications of the ACM*, Vol. 17, No. 7, pp. 365–375, July 1974.