オペレーティングシステム
オペレーティングシステムは、ハードウェア資源を抽象化し、アプリケーションに安全かつ効率的な実行環境を提供する基盤ソフトウェアである。典型的にはプロセス管理、メモリ管理、ファイルシステム、入出力制御、セキュリティを担い、利用者はAPIを介して複雑な装置を意識せずに利用できる。OSは資源の競合を調停し、性能(スループット、遅延)と信頼性(保護、回復)を両立させる設計が要となる。
定義と役割
OSの第一の役割は資源管理である。CPU時間、主記憶、補助記憶、デバイス帯域といった有限資源を仮想化し、各アプリケーションに独立した実行環境を見せる。第二の役割は抽象化であり、デバイス差異をドライバと共通APIで隠蔽する。第三は保護で、ユーザ空間とカーネル空間を分離し、不正アクセスと暴走伝播を防ぐ。
カーネルの構成
- モノリシックカーネル:多くの機能を単一アドレス空間で動かし高速だが、障害影響範囲が広い。
- マイクロカーネル:最小機能のみを内核に残し、サービスはユーザ空間へ分離。保守性と安全性に優れる。
- ハイブリッド:性能と保守性の折衷を図る実装が多い。
プロセスとスレッド
プロセスは実行中プログラムと資源(アドレス空間、ハンドル)の単位である。スレッドは実行の最小単位で、同一プロセス内で資源を共有する。コンテキストスイッチによりCPUは多数のスレッドを時分割で実行し、IPCやパイプで協調する。スレッド数は性能と同期コストのバランスを取るべきである。
メモリ管理
仮想アドレスはページテーブルで物理メモリに写像され、保護属性により不正参照を防ぐ。ページングにより作業セットを主記憶に保持し、スワップで溢れを処理する。コピーオンライトや共有ページは無駄な複製を抑える。OSはヒープ割り当ての断片化を監視し、仮想記憶機構とキャッシュで実効性能を高める。
ファイルシステムと入出力
VFSは多様な実体(SSD、ネットワーク、擬似ファイル)を統一的に扱う。ジャーナリングはメタデータの整合性を保ち、遅延書き込みはI/O局所性を活かす。ブロック層ではスケジューラが要求を並べ替え、待ち時間を短縮する。命名、権限、所有の管理はファイルシステムの中心機能である。
並行性と同期
並行実行では競合と可視性の問題が生じる。ミューテックスやセマフォ、条件変数で共有資源を保護し、ロック粒度を調整してスループットを確保する。待ち合わせの循環が起きるとデッドロックとなるため、順序規約やタイムアウトで回避する。適切な排他制御は信頼性の鍵である。
スケジューリングとリアルタイム
スケジューラは公平性と応答性を両立するように実行順序を決める。一般目的では優先度付きの時間分割が主流で、相互作用の多い処理に低遅延を与える。リアルタイムでは期限を満たすことが正しさであり、EDFやRMなどを選択する。負荷に応じたコア間移動やNUMA最適化も重要で、適切なスケジューリング方針が全体性能を左右する。
セキュリティと権限
ユーザ/カーネル分離、システムコール監査、アドレス空間配置のランダム化は基本的防御である。権限はACLやケイパビリティで最小化し、名前空間分離やサンドボックスで被害半径を限定する。更新の署名検証や安全なデフォルト設定もOSの責務である。
仮想化とコンテナ
ハイパーバイザ型仮想化は仮想ハードウェアを提供し、ゲストOSを隔離する。OSレベルの隔離では名前空間と資源制御で軽量な実行環境を作る。これにより開発から運用まで一貫したデプロイが可能となる。サーバ統合、省電力、テスト容易性の観点で仮想化は不可欠である。
代表的な応用領域
- 汎用:デスクトップとサーバで多目的ワークロードを処理する。
- 組込み:省資源で信頼性を重視し、決められた機能を確実に実行する。
- モバイル:省電力、セキュア分離、アプリ配布のエコシステム統合を重視する。
- HPC:スケーラビリティと低遅延I/Oに最適化し、並列処理を最大化する。
歴史と設計思想
バッチ処理から時分割、ネットワーク化、マルチコア時代を経て、OSは抽象化の層を厚くしながら性能を維持する方向で進化した。今日では観測可能性(トレース、eBPF)と自動化(自律調整)が設計の重要要素である。