この教科書は、コンピューターシステムの基本的な構成要素であるオペレーティングシステムに焦点を当てています。読者には、プロセス管理、メモリ管理、ファイルシステム、デバイス管理、セキュリティ、ケーパビリティ、プロセス間通信など、幅広いトピックを網羅的に理解することが期待されます。オペレーティングシステムがシステムの安定性、効率性、およびセキュリティに与える影響を考察し、現代のコンピューティング環境において不可欠な役割を果たしていることを強調します。著者は基本的な概念をわかりやすく説明し、実際のシステムに対する応用に焦点を当てています。この教科書は、学生、研究者、そしてプロフェッショナルがオペレーティングシステムの理論と実践を深く理解し、実用的なスキルを磨くための道しるべとなることを意図しています。
現代社会において、コンピューターシステムは我々の日常生活やビジネス活動において不可欠な存在となっています。この章では、コンピューターシステムの根幹をなす基本構成要素に焦点を当て、その洗練された構造が如何にして機能するかを探求します。
プロセッサ、メモリ、デバイスなどのハードウェアは、コンピューターシステムの根幹をなす要素であり、計算とデータ処理の基盤を提供しています。プロセッサは高度な演算能力を有し、プログラムの実行やデータ処理を担当します。メモリは、プロセッサが効率的にアクセスできるようにデータや命令を一時的に保持し、効率的な処理を支えます。デバイスは、入出力を制御し、外部機器との連携を担当します。これらのハードウェアコンポーネントが連携することで、コンピューターシステムは多様なタスクを遂行し、我々の日常生活に欠かせない存在となっています。
ソフトウェアは、ハードウェアを効果的に制御し、様々なタスクを実行します。オペレーティングシステムは、ハードウェア資源を管理し、アプリケーションソフトウェアが効果的に動作する環境を提供します。アプリケーションソフトウェアは、ユーザーのニーズに合わせて機能し、データの処理や情報の提供などを行います。ソフトウェアの協力により、ユーザーエクスペリエンスが向上し、リソースが最適に利用されます。
ネットワーク技術や通信プロトコルは、異なるコンピューターシステム同士を結びつけ、情報の共有と連携を可能にします。これにより、データの移動やリモートアクセスが実現され、情報社会の基盤を支えています。通信機構によって、地理的な制約を超えてリソースや情報を利用できるようになり、グローバルなコネクティビティが形成されます。これらの要素が緊密に連携し、複雑な機能を実現しているコンピューターシステムの進化を探求します。
オペレーティングシステム（OS）は、コンピューターシステムにおいて不可欠な仲介者としての役割を果たしています。その基本的な役割は多岐にわたり、コンピュータの効率的な運用とユーザーエクスペリエンスの向上を担保します。この節では、オペレーティングシステムが果たす主要な役割に焦点を当て、その進化と歴史的変遷を明らかにします。
プロセス管理
オペレーティングシステムは、同時に複数のプロセスを実行し、リソースの適切な割り当てとスケジューリングを担当します。これにより、複数のタスクが同時に実行され、効率的な利用が可能となります。
メモリ管理
メモリの管理は、オペレーティングシステムが物理メモリを仮想メモリにマッピングし、アプリケーションが必要なメモリを確保できるようにする役割を果たします。ページングやセグメンテーションなどの手法が導入され、効率的なメモリ使用が可能となります。
ファイルシステム
オペレーティングシステムは、データの永続的な保存やアクセスを管理するためにファイルシステムを提供します。ディレクトリ構造、ファイルの作成、読み書き、削除などの機能が含まれます。
デバイス管理
デバイスドライバや入出力の管理を通じて、オペレーティングシステムは様々なデバイスとの通信を取り持ちます。プリンタ、ハードディスク、ネットワークカードなど、異なるデバイスとの連携を調整し、シームレスな操作を提供します。
オペレーティングシステムはその発展の中で、様々な進化と挑戦に直面してきました。時代とともに変わる技術や要件に順応し、新たな機能やアーキテクチャが取り入れられてきました。
以下はその進化の一端を探るものです。
分散コンピューティングの台頭: インターネットの普及と共に、分散コンピューティングが注目を浴びました。オペレーティングシステムは、複数のコンピュータが連携して処理を行う分散環境に対応する必要があり、ネットワーキングや通信プロトコルの統合が求められました。
仮想化技術の導入: 仮想化技術が台頭する中、オペレーティングシステムはハイパーバイザーといった仮想化層を介して、複数の仮想マシンをホストする能力を備えるようになりました。これにより、物理リソースの柔軟な利用や隔離が可能となりました。
クラウドコンピューティングの普及: クラウドコンピューティングの浸透により、オペレーティングシステムはクラウド環境に最適化されるよう進化しました。サービス提供者としての要件や、クラウド上で動作するアプリケーションの要求に対応するための新たな機能が組み込まれました。
セキュリティの強化: インターネットの普及に伴い、セキュリティの脅威も増加しました。オペレーティングシステムは、より堅牢でセキュアな動作を保証するための仕組みを導入し、ユーザーデータやシステムの安全性を向上させる方向に進化しました。
リアルタイム処理の要請: リアルタイム性が求められるシステムが増加する中、オペレーティングシステムはリアルタイム処理への対応が重要となりました。組み込みシステムや制御システムにおいて、時間的な制約を満たすことが要求されています。
モバイルデバイスへの適応: スマートフォンやタブレットなどのモバイルデバイスが普及するにつれ、オペレーティングシステムはモバイルプラットフォームに特化した機能やエネルギー効率の向上などに焦点を当てました。
これらの進化と挑戦は、オペレーティングシステムが未来の技術とニーズに対応し続けるための基盤となっています。将来的な展望では、人工知能、量子コンピューティング、エッジコンピューティングなどが新たな課題となり、オペレーティングシステムはこれらの分野においてどのように進化していくかが注目されています。
オペレーティングシステムの理解には、複数の基本的な概念や用語への理解が欠かせません。これらの用語の統一的な理解が、後の章で深化する知識の基盤となります。
プロセス: プロセスは、実行中のプログラムのインスタンスであり、メモリ上での実行状態を指します。オペレーティングシステムはプロセスの生成、スケジューリング、同期、通信などを管理し、複数のプロセスが協調して作業できるようにサポートします。
メモリ管理: メモリ管理は、プログラムやデータがメモリ内でどのように配置され、アクセスされるかを制御します。仮想メモリ、ページング、セグメンテーションなどの概念が含まれ、オペレーティングシステムがメモリリソースを最適に利用できるようにします。
ファイル: ファイルはデータを永続的に保存するための概念であり、オペレーティングシステムが提供するファイルシステムによって管理されます。ファイルはディレクトリに組織され、構造的に管理されます。
デバイス: デバイスは、コンピューターシステムと外部機器とのインターフェースを提供する要素です。デバイスはデバイスドライバによって制御され、オペレーティングシステムとの間で効果的な通信を実現します。
ファイルディスクリプタ: ファイルディスクリプタは、オープンされたファイルやデバイスへのアクセスを識別するための抽象的な概念です。プロセスはファイルディスクリプタを使用してファイルやデバイスにアクセスし、読み書きなどの操作を行います。
システムコール: システムコールは、ユーザープログラムがオペレーティングシステムのサービスを利用するための手段です。プロセスがオペレーティングシステムに対してリクエストを送り、必要なサービスを受けることができます。
これらの基本的な概念と用語への理解が、オペレーティングシステムにおけるさまざまな機能やメカニズムを理解する上での出発点となります。深い知識の構築に向けて、これらの概念を綿密に理解していきましょう。
{{コラム|最初のオペレーティングシステムは？|2=最初のオペレーティングシステム（OS）は、1950年代に開発された「GM-NAA I/O」（General Motors - North American Aviation Input/Output System）とされています。これは、IBM 701コンピューターのために開発されたもので、バッチ処理システムとして機能しました。
その後、1956年には「GM-NAA I/O」を拡張し、より洗練された機能を持つオペレーティングシステム「SHARE Operating System」が登場しました。これは、ユーザーが独自のプログラムを開発し、それを他のユーザーと共有するための環境を提供しました。
一方で、UNIVAC Iコンピューターのために開発された「EXEC I」も初期のオペレーティングシステムの一例です。これは、バッチ処理をサポートするもので、1950年代後半に登場しました。
最初のオペレーティングシステムの起源についての議論が存在しますが、Fortranモニタもその一例です。Fortranモニタは、1956年にIBM 704コンピューターのために開発されたもので、バッチ処理をサポートするためのものでした。これは、プログラムの実行順序やリソースの管理を行う初期のオペレーティングシステムの特徴を持っています。
ただし、同時期に他のシステムでもオペレーティングシステムに近い機能を果たるものが開発されており、最初のオペレーティングシステムが何であるかについては議論の余地があります。初期のコンピューターでは、プログラム実行やリソース管理に関する機能が、特定のプログラムやモニタープログラムなどに分散していたことが一般的でした。
これらの初期のオペレーティングシステムは、コンピューターのリソース（特にプリンタやテープドライブなどの入出力装置）を効率的に利用するためのもので、その後の発展に影響を与えました。
プロセスは、コンピュータシステム内で実行されるプログラムの実行単位です。それはプログラムのコード、データ、実行状態など、実行に必要な情報を含みます。プロセスには一意のプロセスIDが割り当てられ、オペレーティングシステムはこれらのプロセスを管理し、リソースの割り当てや制御を担当します。
プロセスのスケジューリングと管理
プロセスのスケジューリングは、複数のプロセスが競合する場合に、どのプロセスを優先して実行するかを決定する仕組みです。スケジューリングアルゴリズムは、公平性、優先度、待ち時間などの要因を考慮して、効率的かつ公正なリソース利用を実現します。オペレーティングシステムはまた、プロセスの生成、終了、中断などを管理し、メモリやCPUの効率的な利用を促進します。
複数のプロセスが同時に実行される際に、これらのプロセスが協調して動作するためには、プロセス同期と通信が必要です。同期は、プロセス間での相互の進捗状況を合わせ、競合状態やデータ不整合を防ぎます。通信は、プロセス間でデータを受け渡し、情報を共有するための仕組みです。これにより、連携してタスクを達成することが可能となります。
オペレーティングシステムは、異なるプロセス間でデータを共有し、同期を図るためにさまざまな機構を提供します。共有メモリ、パイプ、メッセージキュー、セマフォ、モニタなどがその例です。これらの機構を適切に使用することで、プロセス間の協調動作やデータの安全な受け渡しが可能となります。
プロセス管理はオペレーティングシステムの中核的な機能であり、効率的で安定したシステム運用を支えます。各概念や機構の理解は、システム設計やプログラミングにおいて重要です。
BSD Socket（Berkeley Software Distribution Socket）は、ネットワーク通信のためのAPI（アプリケーションプログラミングインターフェース）です。BSD UNIXオペレーティングシステムにおいて開発され、後に標準的なネットワークプログラミングのインターフェースとして多くのオペレーティングシステムで採用されました。BSD Socketは、ソケットを用いてプロセス間通信やネットワーク通信を実現するための機能を提供します。
BSD UNIXではSocketを使ってパイプなどのIPC（プロセス間通信）も再実装されました。BSD UNIXが開発された際、Socketを通じたネットワーク通信だけでなく、プロセス間通信の手段としてもSocketが利用され、パイプなどが再構築されました。
BSD Socket APIはその後、SystemVを含む多くのUNIX系オペレーティングシステムに採用され、ネットワークとIPCの両方で幅広く使用されるようになりました。
SystemV STREAMS（StreamS）は、UNIX System Vオペレーティングシステムで導入された通信機構です。STREAMSは、モジュール化された通信プロトコルスタックを提供し、柔軟で効率的なデータの受け渡しを可能にします。これは、プロセス間通信やデバイス制御において、標準的なインターフェースとして使用されました。 STREAMSはUNIXの派生版や一部の商用UNIXオペレーティングシステムでサポートされています。
{{コラム|BSDとSystem V|2=BSD（Berkeley Software Distribution）とSystem Vは、UNIXオペレーティングシステムの2つの主要な派生系統です。これらは、UNIXの発展と普及の過程で異なるアプローチや機能を取り入れ、それぞれの特徴を持っています。
BSD (Berkeley Software Distribution)
BSDは、カリフォルニア大学バークレー校で開発されたUNIXの派生です。BSD UNIXは、ネットワーク機能の強化やTCP/IPプロトコルの導入、さらにはパフォーマンスの向上など、多くの革新的な機能を提供しました。また、BSDはオープンソースのUNIXシステムとして、多くのUNIX系オペレーティングシステムに影響を与えました。
主な特徴として、BSD Socket API（ネットワーク通信用のAPI）やファイルシステムの改善、プロセス間通信の機能の追加などがあります。
System V
System Vは、AT&T（アメリカン・テレフォン・アンド・テレグラフ）社が開発したUNIXの派生で、商業的なUNIXオペレーティングシステムの基盤として採用されました。System Vは、UNIXの標準規格であるPOSIXに強く準拠し、標準化されたAPIやサービスを提供しました。
System Vの特徴として、System V IPC（プロセス間通信機構）、標準的なランレベルの導入、共有ライブラリのサポートなどが挙げられます。
統合と相互影響
UNIXの歴史では、これらの2つの系統が相互に影響を与え合いました。多くのUNIXオペレーティングシステムは、BSDとSystem Vの機能を組み合わせて採用しています。例えば、System V IPCとBSD Socket APIを同時にサポートするなどが行われています。
オペレーティングシステムのメモリ管理は、コンピュータのメモリ資源を効果的に管理する仕組みです。これにより、複数のプログラムが同時に実行され、物理メモリを適切に利用できます。メモリ管理はプロセスの割り当てや解放、ページング、セグメンテーション、仮想メモリの導入などを含み、システムの安定性と性能を確保します。
メモリ管理は、コンピューターシステムにおける重要な側面であり、メモリは階層的な構造を有しています。この階層には、コンピュータがデータを処理する際に使用される異なるタイプのメモリが含まれます。最も高速で直接アクセス可能なのがレジスタであり、次にキャッシュ、主記憶（RAM）、そして補助記憶（ハードディスクなど）が続きます。この章では、各メモリ階層がどのように機能し、効果的に管理されるかを探求します。
レジスタはCPU内部にあり、非常に高速でありながらも容量が非常に小さいため、プロセッサが即座にアクセスできるデータを格納します。キャッシュは主記憶とプロセッサ間のデータ転送を高速化するための中間的なメモリであり、主記憶はプロセッサが直接アクセスする大容量のメモリです。補助記憶は永続的なデータの保存やプログラムの読み込みに用いられます。
仮想記憶は、主記憶装置と補助記憶装置から構成される記憶領域であり、補助記憶装置を安価で大容量のデバイスとして使用することで、プログラマが仮想記憶上で大容量の主記憶装置が実装されているかのようにプログラミングを行うことができる概念です。
ページングとセグメンテーションは、仮想記憶の管理手法であり、物理メモリの効率的な利用を目指しています。
ページングでは、メモリを固定サイズのページに分割し、プログラムの実行に必要なページだけを動的に読み込みます。これにより、物理メモリの空間が節約され、必要なページだけが物理メモリに配置されます。ページングは、デマンドページングの手法を使用し、プロセスがアクセスしようとするページが物理メモリに存在しない場合にページフォルトが発生し、必要なページが動的に読み込まれます。
一方、セグメンテーションでは、プログラムを論理的なセグメントに分割し、必要なセグメントだけを物理メモリに読み込むことでメモリを効果的に利用します。各セグメントは論理的なまとまりを持ち、柔軟なメモリ管理が可能です。
これらの手法は、コンピュータシステムのメモリ管理において重要であり、効率的なリソース利用と性能向上に寄与しています。
仮想記憶は、物理メモリを補完するための概念であり、プロセスにとっては拡張されたメモリ空間を提供します。通常、プロセスは必要なだけのメモリを仮想的に確保できるため、物理メモリよりも広範なメモリアクセスが可能です。しかし、すべての仮想記憶が物理メモリに常時格納されているわけではありません。
ページフォルトは、プログラムが物理メモリにアクセスしようとした際に発生します。もし必要なページが物理メモリに存在しない場合、オペレーティングシステムはページフォルトを検知し、必要なページをディスクや他の補助記憶装置から読み込みます。これにより、物理メモリの限られたスペースに必要なページだけを動的に配置することが可能となります。
ページフォルトのハンドリングは、仮想記憶の有効活用と効率的なメモリ使用を実現します。オペレーティングシステムは必要なページを要求された時点で読み込むため、大きなプログラムやデータセットを処理する際にも物理メモリを効果的に活用できます。
デマンドページング方式の仮想記憶は、ページングとPMMU（Paged Memory Management Unit）との連携によって実現されます。
以下に、その仕組みについて簡単に説明します。
仮想記憶の基本概念:仮想記憶は、物理メモリを補完するための概念であり、プロセスにとっては仮想的に拡張されたメモリ空間を提供します。プロセスが物理メモリよりも大きなメモリ空間を確保できるため、大規模なプログラムやデータセットを扱う際に柔軟性が向上します。
デマンドページング方式:デマンドページングでは、プロセスの実行に必要な部分だけが物理メモリに読み込まれます。
プロセスが初めてアクセスしようとするメモリ領域に対して、そのページが物理メモリに存在しない場合にページフォルトが発生します。ページフォルトが発生すると、オペレーティングシステムは必要なページを補完的に物理メモリに読み込みます。
PMMUの役割
PMMU（Paged Memory Management Unit）は、プログラムが物理メモリにアクセスする際に、それを対応する物理メモリアドレスに変換する役割を果たします。
仮想メモリ空間から物理メモリへのマッピングを行い、ページテーブルと呼ばれるデータ構造を使用して各ページの対応を管理します。
ページフォルトが発生すると、PMMUはオペレーティングシステムに通知し、必要なページをディスクから読み込む手続きを開始します。
具体的な仕組み
プロセスがアクセスしようとする仮想メモリのページが物理メモリに存在しない場合、PMMUはページフォルトを検知し、オペレーティングシステムに制御を移譲します。
オペレーティングシステムはディスク上にある対応するページを探し、必要なページを物理メモリに読み込みます。
読み込まれたページの情報をページテーブルに更新し、PMMUが再度プロセスの実行を再開します。
仮想記憶、デマンドページング、PMMUが組み合わさることで、大容量の仮想メモリを有効に利用しながら、物理メモリを必要に応じて動的に確保し、効率的にプロセスを実行することが可能となります。
仮想記憶の実装には、デマンドページングとPMMU以外にもいくつかのアプローチが存在します。以下に、その一部を紹介します。
セグメンテーション
セグメンテーションは、プログラムやデータを論理的なセグメントに分割し、それぞれのセグメントを物理メモリ上に配置します。
各セグメントは異なるサイズや属性を持ち、プロセスが必要なセグメントだけを物理メモリに読み込むことができます。
セグメンテーションは、ページングと組み合わせて使用されることもあります。
ページングとセグメンテーションの組み合わせ:
ページングとセグメンテーションを組み合わせたアプローチでは、セグメンテーションで大まかなメモリ管理を行い、各セグメント内でページングを使用して詳細なメモリアクセスを制御します。
これにより、柔軟性と効率の両方を備えた仮想メモリ管理が可能となります。
アドレススペースの共有:
複数のプロセスが同じ物理メモリ領域を共有するアプローチもあります。これにより、プロセス間でデータを共有しやすくなります。
共有メモリとして知られるこの手法は、IPC（Inter-Process Communication）やスレッド間通信などに利用されることがあります。
スワッピング:
スワッピングは、物理メモリ上のページをディスク上に移動させる手法です。これにより、物理メモリの不足時にプロセスの一部をディスクにスワップアウトし、必要なページをスワップインすることができます。
スワッピングはデマンドページングと併用され、物理メモリの制約に対処します。
これらの手法は、システムの要件や特性によって異なる利用があり、適切な組み合わせが選択されます。
初期の仮想記憶の実装例として、Atlasコンピュータが挙げられます。Atlasは、1960年代初頭にイギリスのマンチェスター大学で開発された大型のコンピュータシステムで、仮想記憶の概念を実現しました。Atlasの仮想記憶システムは、当時のコンピュータシステムと比較して先進的で、ページング・ページテーブル・プロセス間の分離などの特徴がありました。
Atlasの仮想記憶システムは、その後のコンピュータアーキテクチャの発展に影響を与え、ページングや仮想記憶の考え方が広く受け入れられる基盤を築きました。
MULTICS（Multiplexed Information and Computing Service）は、仮想記憶を採用した初期の商用オペレーティングシステムの一つです。MULTICSは、General Electric（GE）、Bell Labs（AT&T）、およびMIT（Massachusetts Institute of Technology）の共同開発プロジェクトとして始まり、GE-645メインフレームコンピュータ上で動作しました。
MULTICSは、セキュリティや拡張性の向上を含む様々な革新的な機能を持っていましたが、その中でも特に注目されたのが仮想記憶の導入でした。MULTICSの仮想記憶は、物理メモリよりも大きな仮想メモリ空間をプログラムに提供し、必要な部分だけを物理メモリに配置することで、大規模なプログラムや複数のプロセスを同時に実行できるようになりました。
MULTICSの仮想記憶は、ページングとセグメンテーションを組み合わせた方式を採用していました。これにより、プログラムやデータを効率的に管理し、ユーザーに対して広い仮想アドレス空間を提供できました。MULTICSの仮想記憶は、その後のオペレーティングシステムにおける仮想記憶の発展に影響を与えました。
商用で最初に導入された仮想記憶システムの一つは、IBMの「System/360 Model 67」が含まれます。このシステムは、1966年に導入されました。System/360 Model 67は、プログラムが物理メモリに収まりきらなくても実行できるようにするために、仮想記憶の概念を採用していました。
System/360 Model 67の仮想記憶システムは、プログラムが実際の物理メモリよりも大きなサイズであっても実行でき、必要な部分だけを物理メモリに読み込む仕組みを持っていました。これにより、大規模で複雑なプログラムを効率的に実行できるようになりました。
メモリ保護は、プロセスがメモリを読み書きできるかどうかを管理します。アクセス権の設定やセグメンテーションにおけるセグメント保護など、様々な手法が存在します。これらの手法により、オペレーティングシステムはプロセスが正しくメモリにアクセスできるように制御します。
アクセス権は通常、読み取り専用、読み書き可能、実行可能などの形式で指定され、各プロセスが必要な権限を持つかどうかを管理します。セグメンテーションにおいては、各セグメントに対して保護フラグが設定され、プロセスはそれに基づいてメモリへのアクセスを制御します。これにより、異なるプロセスがお互いのメモリを不正にアクセスすることを防ぎ、システム全体のセキュリティを確保します。
以下は、OSのメモリ管理に関連する用語の一覧です。
メモリ管理 (Memory Management):コンピュータのメモリリソースを管理し、プロセスが必要なメモリを確保・解放する仕組み。
物理メモリ (Physical Memory):コンピュータの本来のメモリ装置で、RAM（ランダムアクセスメモリ）などが該当。
仮想メモリ (Virtual Memory):物理メモリの拡張として、補助記憶装置（ハードディスクなど）を仮想的にメモリとして利用する概念。
ページング (Paging):メモリを固定サイズのページに分割し、プロセスの実行に必要なページだけを読み込む手法。
セグメンテーション (Segmentation):プログラムやデータを論理的なセグメントに分割し、必要なセグメントだけをメモリに読み込む手法。
ページフォルト (Page Fault):プログラムが物理メモリにアクセスしようとした際に、対応するページが物理メモリに読み込まれていない場合の例外。
デマンドページング (Demand Paging):プログラムが必要なページだけを必要な時点で読み込む方式。
MMU (Memory Management Unit):メモリアクセスの制御を担当するハードウェアユニット。
PMMU (Paged Memory Management Unit):ページングをサポートするためのハードウェアユニット。
メモリフラグメンテーション (Memory Fragmentation):メモリ領域が小さな断片に分かれることで、効率的なメモリ使用が難しくなる現象。
スワッピング (Swapping):プロセスが物理メモリからディスク上のスワップ領域に一時的に移動されること。
メモリプール (Memory Pool):メモリを効率的に管理するために、同一サイズのメモリ領域をまとめてプールとして管理する仕組み。
メモリマッピング (Memory Mapping):ファイルやデバイスをメモリに対応付け、メモリ上で直接アクセスできるようにする仕組み。
メモリキャッシュ (Memory Cache):メモリの一部をキャッシュとして使用し、高速なアクセスを可能にする手法。
メモリアロケーション (Memory Allocation):プロセスに必要なメモリ領域を確保する処理。
メモリ解放 (Memory Deallocation):プロセスが使用していたメモリ領域を解放し、再利用可能にする処理。
メモリオーバーヘッド (Memory Overhead):メモリ管理に伴う余分なコストやリソースの使用。
メモリ保護 (Memory Protection):プロセスが他のプロセスやオペレーティングシステムのメモリにアクセスできないようにする仕組み。
メモリマネージャ (Memory Manager):オペレーティングシステム内でメモリを管理するソフトウェアコンポーネント。
セグメントフォルト (Segmentation Fault):プログラムが許可されていないメモリにアクセスしようとした際に発生する例外。
オペレーティングシステムのファイルシステムは、データを整理して保存する仕組みです。ファイルやディレクトリを階層的に管理し、アクセスや保護機能を提供します。これにより、ユーザーはデータを構造的に保存・取得でき、プログラムやシステムが必要な情報にアクセスできます。ファイルシステムはデータの整合性と永続性を保ち、効率的なデータ管理を実現します。
オペレーティングシステムのデバイス管理は、コンピュータ内外のハードウェアデバイスとの効率的な通信を担当します。デバイスドライバを介し、異なるデバイスとのインタラクションを標準化し、アプリケーションやユーザーがハードウェアを利用できるようにします。デバイス管理はデバイスの初期化、資源割り当て、エラーハンドリングなどを通じてシステムの正確かつ円滑な動作を確保します。
オペレーティングシステムのセキュリティは、機密性、整合性、可用性を保護し、不正なアクセスからシステムを守ります。一方で、ケーパビリティはユーザーやプロセスが持つ権限や操作可能な範囲を制御し、機能の適切な利用を促進します。セキュリティとケーパビリティの統合は、システム全体の信頼性と安定性を確保します。
オペレーティングシステムのプロセス間通信（IPC）は、プロセス間で情報をやり取りするメカニズムで、共有メモリやメッセージパッシングなどが利用されます。ネットワーキングは、複数のシステムが通信してリソースを共有し、分散処理やデータ交換を可能にします。これらはオペレーティングシステムが異なるプロセスやシステム間で効果的なコミュニケーションをサポートする重要な機能です。
オペレーティングシステムの実装と最適化は、カーネルの構造や設計、システムコールとAPIの効果的な提供、パフォーマンス向上と最適化の手法を含みます。カーネルはOSの中核で、システムコールやAPIはユーザーとOSのやり取りを制御します。最適化は効率的な動作やリソース利用を追求し、高いパフォーマンスを実現します。
ここからは、実在のオペレーティングシステムを題材に、その設計と実装について解説します。
Atlas Supervisorは、Manchester Universityで開発された世界初のバッチ処理オペレーティングシステムの一つです。
Atlasコンピュータ向けに設計され、当初は並列処理やリアルタイム処理をサポートしていました。以下に、Atlas Supervisorが提供していた主な機能について見ていきましょう。
バッチ処理: Atlas Supervisorは、複数のジョブをまとめて処理するバッチ処理をサポートしていました。これにより、ユーザーはジョブを順次実行し、リソースを最適に利用することができました。
メモリ管理
Atlasはページング方式を採用していました。メモリは固定サイズのページに分割され、プログラムがアクセスしようとするページが物理メモリに存在しない場合にページフォルトが発生しました。
ページングは物理メモリの効率的な利用を可能にし、大規模で複雑なプログラムを扱う際に重要な役割を果たしました。
Atlasでは、各プログラム（プロセス）が独立した仮想記憶空間を持ち、他のプログラムのメモリにアクセスすることが制限されました。これにより、プロセス間のデータ保護が実現されました。
Atlasでは、ページングを管理するためにページテーブルが使用されました。ページテーブルには各ページの物理アドレスと仮想アドレスの対応関係が格納され、ページフォルト時に参照されました。
Atlasの仮想記憶システムは、その後のコンピュータアーキテクチャの発展に影響を与え、ページングや仮想記憶の考え方が広く受け入れられる基盤を築きました。
プロセス管理: ジョブの実行は、プロセス管理の観点からも注目されました。Atlas Supervisorは、異なるジョブやプロセスが競合することなく実行されるように調整されていました。
ファイルシステム: ファイルシステムの概念は、Atlas Supervisorにおいても存在していました。ジョブがデータを永続的に保存し、後続のジョブでそれを利用できるようになっていました。
ユーザーコミュニケーション: 当初のバッチ処理向けのシステムではありますが、Atlas Supervisorはユーザーとの対話も可能でした。ユーザーはジョブのセットアップや結果の確認を行うことができました。
Atlas Supervisorは当時のハードウェアと調和して、計算機利用の合理性を追求した先進的なオペレーティングシステムであり、その後のオペレーティングシステムの発展に影響を与えました。
MIT（マサチューセッツ工科大学）で開発されたCTSSは、1961年に初めて導入されたオペレーティングシステムの一つで、仮想記憶の概念を取り入れていました。これにより、複数のユーザーが同時にメインフレームを使用できるようになりました。
IBM System/360 Model 67は、セグメンテーションとページングを組み合わせた仮想記憶をサポートしたメインフレームコンピュータでした。これにより、大規模な科学計算やビジネスアプリケーション向けに柔軟で効率的なメモリ管理が可能となりました。
MULTICSは、ベル研究所、MIT、およびゼネラル・エレクトリック（GE）が共同で開発したオペレーティングシステムで、セグメンテーションとページングを採用し、仮想記憶の概念を拡張しました。MULTICSのアイディアは後にUNIXに影響を与えました。
MULTICSはUNIXに影響を与えた重要な要因の一つとされています。MULTICSプロジェクトに携わっていたKen Thompson、Dennis Ritchie、そしてその他の開発者たちが、MULTICSの経験から得た教訓を元に新しいオペレーティングシステムであるUNIXを開発しました。
UNIXは、MULTICSよりもシンプルで軽量な設計を持っており、小規模なマシンでも動作可能でした。MULTICSでの経験がUNIXの設計に影響を与え、シェル、ファイルシステム、プロセス管理などの概念が引き継がれました。UNIXは1970年代から広く普及し、その後のオペレーティングシステムの発展に大きな影響を与えました。
UNIXがMULTICSから模倣または影響を受けた具体的な機能や概念はいくつかあります。
以下はその一部です：
コマンドインタプリタ（シェル）
MULTICSの影響: MULTICSは、コマンドとプログラムの実行を補完する強力なコマンド言語を持っていました。
UNIXの実装: Ken ThompsonがMULTICSでの経験をもとに、UNIXにはシンプルながら柔軟で拡張可能なシェルが実装されました。初期のUNIXのシェルとしては、ThompsonシェルやBourneシェルがありました。
階層ファイルシステム:
MULTICSの影響: MULTICSは階層型のファイルシステムを採用しており、ユーザーがデータやプログラムを整理しやすい構造を提供していました。
UNIXの実装: UNIXはこれを受けて、階層型ファイルシステムを採用しました。ディレクトリやサブディレクトリの概念がUNIXに取り入れられ、パス指定でのファイルアクセスが可能となりました。
プロセスとプロセス管理:
MULTICSの影響: MULTICSでは、プロセスとメモリ管理が重要な概念でした。MULTICSは複数のプロセスを同時に実行し、各プロセスには独自のメモリ空間が割り当てられました。
UNIXの実装: UNIXもプロセスの概念を取り入れ、各プロセスが独立して動作することで、安定性やセキュリティが向上しました。
これらの機能や概念は、UNIXがMULTICSの経験から学びながら独自のアプローチで実装され、UNIXが普及する一因となりました。
これらの「UNIXらしさ」と言われる特徴は、MULTICSから影響を受けいますが、UNIXの仮想記憶システムは、MULTICSからの直接の影響は受けていません。UNIXの仮想記憶は、主にKen ThompsonとDennis Ritchieによる独自の設計に基づいています。UNIXが登場した時点では、コンピュータの物理メモリが非常に限られていたため、仮想記憶が導入されました。
MULTICSとUNIXの時代背景を考えると、MULTICSの影響は他の要素に比べて相対的に小さかったと言えます。UNIXは小型でリソースが限られたマシン上で動作することを重視し、シンプルで効率的な設計を採用しました。UNIXの仮想記憶の実装は、MULTICSの大規模かつ複雑な設計からは逸脱しています。
UNIXは、ベル研究所で開発されたオペレーティングシステムで、Ken Thompson、Dennis Ritchie、およびチームによって生み出されました。シンプルで柔軟な設計を持ち、C言語で記述されたことが特徴です。UNIXは、マルチユーザー、マルチタスク、およびポータブル性を重視し、その後のオペレーティングシステムの基盤となりました。
OS-9は、Microware Systems Corporationが開発したリアルタイムオペレーティングシステムで、主に組み込みシステムや産業制御などの用途で利用されました。モジューラ設計を採用しています。8ビットプロセッサであるMC6809をターゲットとしましたがOS-9レベルIIでは仮想記憶をサポートしました。
Machは、カーネギーメロン大学で開発されたマイクロカーネルベースのオペレーティングシステムで、仮想メモリやマルチプロセッシングをサポートしています。Machは、そのマイクロカーネルアーキテクチャから派生して、GNU/Hurdなどのプロジェクトに影響を与えました。
OS/2は、IBMとマイクロソフトが共同で開発したオペレーティングシステムで、当初はPC向けに開発されました。マルチタスク、マルチスレッド、およびGUIサポートを提供し、Windowsとの互換性も備えていましたが、後にWindows NTに取って代わられました。
Windows NTは、マイクロソフトが開発した32ビットのオペレーティングシステムで、企業向けに設計されました。安定性、セキュリティ、ネットワーキングの向上を重視し、Windowsファミリーの基盤となりました。 Windows 2000やXPなどのバージョンがこれを基にしています。