索引 / 001 JA
Operating System Concepts(オペレーティングシステムの概念) cover

コンピュータサイエンス

コンピュータサイエンス

Operating System Concepts(オペレーティングシステムの概念)

Abraham Silberschatz; Peter Baer Galvin; Greg Gagne

英語原題: Operating System Concepts

プロセス、スレッド、スケジューリング、同期、メモリ管理、ストレージ、保護など、現代のオペレーティングシステムに共通する概念を説明する入門教科書。Linux、Windows、macOS、Android、iOS の例で考え方を示し、短いプログラミング課題を通じて概念が実際のコードでどう動くかを確かめられる。

前提知識: C や Java などのプログラミング言語、基本的なデータ構造、計算機構成の概略についての知識。

難易度レベル
中級
学術レベル
学部
operating systemsprocessesconcurrencymemory managementfile systems教科書

01 / 読書ガイド

読書ガイド

引用

Silberschatz, A., Galvin, P. B., & Gagne, G. (2018). Operating System Concepts (10th ed.). Wiley.

章の要約

第10版(2018年4月、Wileyによれば1,040ページ)は9部21章からなり、さらに四つの付録(影響力のあったオペレーティングシステム、Windows 7、BSD UNIX、Machシステム)がある。付録は別にページ付けされており、序文によれば本書のWebサイトで提供されている。序文は本書を、学部3〜4年次または大学院1年次の入門的なオペレーティングシステムの講義のための教科書と位置づけ、形式的な証明ではなく直観的な説明、図、例によって概念を示すと述べている。例はLinux、Windows、macOS、Solaris、Android、iOSから採られている。各章は練習問題(解答はWebサイトにある)、追加の演習問題、参考文献案内で終わる。この版は、著者が挙げる四つの動向、すなわちモバイルOS、マルチコアシステム、仮想化、不揮発性メモリによるストレージに沿って形づくられている。

第1部 第1〜2章:はじめに、オペレーティングシステムの構造

オペレーティングシステムとは何で何をするのか、ハードウェアの背景(カーネルで使われるデータ構造の概観を含む)、そしてシステムがどう設計・構築されるか、すなわちサービス、システムコール、リンカとローダ、オペレーティングシステムの構造、GRUBによるブートを扱う。序文によれば、この2章は内部のアルゴリズムに立ち入らず、概観を求める読者に向いている。

第2部 第3〜5章:プロセス、スレッドと並行性、CPUスケジューリング

仕事の単位としてのプロセス、そのメモリ配置とプロセス間通信(MachのメッセージパッシングやAndroidのRPCを含む)。スレッドと暗黙的スレッド化(フォーク・ジョイン並列、JavaのFuture、Grand Central Dispatch、Intel Threading Building Blocksを含む)。そして基本的なアルゴリズムからマルチコアやNUMAを考慮したスケジューリング、LinuxのCFSスケジューラ、Windows 10までのCPUスケジューリングを扱う。

第3部 第6〜8章:同期のための道具、同期の例、デッドロック

以前は一つだった同期の章が二つに分かれた。第6章は競合状態と一般的な道具を、メモリモデルとメモリバリアからcompare-and-swapやロックフリーのアルゴリズムまで、特定のAPIに結びつけずに扱う。第7章はそれらを古典的な同期問題に適用し、POSIXのセマフォ、条件変数、Javaを用いる。第8章はデッドロックとライブロックを扱い、Linuxのlockdepなどのツールも紹介する。

第4部 第9〜10章:主記憶、仮想記憶

現代のハードウェアにおけるメモリ管理、すなわちページング、ページ単位のスワッピング、ARMv8の64ビットアーキテクチャ(セグメンテーションは削除された)を扱い、続いて仮想記憶、すなわちページフォールト、フレームの割り当て、NUMAでの割り当て、メモリ圧縮、LinuxとWindows 10のメモリ管理を扱う。

第5部 第11〜12章:大容量記憶装置の構造、入出力システム

ハードディスクと不揮発性メモリ装置を同等に扱い、ドライブのスケジューリング、RAID、クラウドストレージとオブジェクトストレージを取り上げる。続いて入出力ハードウェア、インターフェース、カーネルの入出力構造、ブロッキングとノンブロッキングの入出力、性能を扱う。

第6部 第13〜15章:ファイルシステムのインターフェース、ファイルシステムの実装、ファイルシステムの内部

ユーザーから見たファイル、ディレクトリ、保護、メモリマップトファイル。次に、割り当て方式、性能、ジャーナリング、TRIM、Apple File Systemを含むファイルシステムの実装。そして前の版の内容をまとめ直した、ファイルシステムの内部に関する新しい章。

第7部 第16〜17章:セキュリティ、保護

セキュリティの章が保護の章の前に置かれるようになった。ランサムウェアなどの現在の脅威、コード例つきのコードインジェクション攻撃、暗号、認証、アドレス空間配置のランダム化などの防御を扱う。保護の章は、リング、アクセス制御、強制アクセス制御、Linuxのケーパビリティ、サンドボックス、コード署名、Javaのスタック検査を扱う。

第8部 第18〜19章:仮想マシン、ネットワークと分散システム

仮想化の技法とハードウェア支援、コンテナ、Docker、Kubernetes、そしてユニカーネルなどの最近の研究。続いてTCP/IPに焦点を当てたネットワークと、Google File SystemやHadoopなどの分散ファイルシステムを含む分散システムを扱う。

第9部 第20〜21章:Linuxシステム、Windows 10

本書の概念を完全なシステムに当てはめる二つの事例研究である。Linuxの章は、歴史、設計原理、カーネルモジュール、プロセス管理、スケジューリング、メモリ管理、ファイルシステム、入出力、プロセス間通信、ネットワーク、セキュリティを扱う。

主要概念

第1〜2部:構造とプロセス

  • システムコールとカーネルの構造:プログラムがサービスを要求する方法と、オペレーティングシステムを構成し構築するさまざまな方法。
  • プロセスとスレッド:仕事の単位と、その中の実行の単位、そしてプロセス間の通信。
  • CPUスケジューリング:次に実行するスレッドを選ぶ方針で、マルチコアやNUMAの影響も含む。

第3部:同期

  • 競合状態とクリティカルセクション:共有データへの並行アクセスに調整が必要な理由。
  • 同期のための道具:ロック、セマフォ、モニタ、条件変数、そしてロックフリーのcompare-and-swap。
  • デッドロックとライブネス:プロセスが永遠に待ち続ける条件と、それを防止、回避、検出する方法。

第4〜6部:メモリ、ストレージ、ファイル

  • ページングと仮想記憶:仮想メモリから物理メモリへの対応づけ、デマンドページング、ページ置換。
  • 大容量記憶と入出力:ディスクと不揮発性メモリ装置、スケジューリング、RAID、カーネルの入出力サブシステム。
  • ファイルシステムの実装:割り当て、ディレクトリ、ジャーナリング、性能。

第7〜9部:セキュリティ、発展的な話題、事例研究

  • セキュリティと保護:攻撃からの防御と、資源へのアクセスの制御。
  • 仮想マシンとコンテナ:共有されたハードウェアの上で隔離された環境を動かすこと。
  • 事例研究:概念の完全な例としてのLinuxとWindows 10。

批判的分析

長所

  • 概念が先、システムは例。 序文は、特定のオペレーティングシステムに縛られない一般的な文脈で概念を示し、それを現在のデスクトップ、サーバー、モバイルのシステムから採った多くの例で説明することを目標に掲げている。そのため、講義が実習にどのシステムを使っていても本書を利用できる。
  • 最新化された版。 序文はすべての章について主な改訂を挙げている。マルチコア、モバイル、ARMの扱いの拡大、ソリッドステートのストレージ、メモリモデルやロックフリーのアルゴリズムを含めて分割・拡充された同期の扱い、コンテナとKubernetesなどである。
  • 三つの環境によるプログラミング。 例はC言語によるPOSIXとPthreads、Java、Windows APIを用いており、ときには同じ処理(スレッドの生成など)を三つすべてで示す。ダウンロードできるUbuntuの仮想マシンがプログラミング課題を支え、課題の中にはLinuxのカーネルモジュールを書くものもある。
  • 充実した学習支援。 オンラインに解答がある練習問題、追加の演習問題、復習問題、学生向けの学習ガイド、スライド、講義計画の例が本書のWebサイトから入手できる。

短所

  • 証明ではなく直観。 著者は形式的な証明の大部分を意図的に省き、代わりに図や例を用いて研究論文を案内している。たとえば同期の正しさについて厳密な扱いを求める学生には、別の資料が必要である。
  • 分量。 1,000ページを超える本書は、講義の教科書であると同時に参考書でもある。序文は章を順番に進めることを勧めているが、章を選ぶための講義計画の例も示している。
  • 前提知識。 序文は基本的なデータ構造、計算機構成、C言語への慣れを前提としている。Cに不慣れな読者には、プログラミングの例は難しく感じられるだろう。
  • 形態。 著者のWebサイトによれば、第10版は電子版単体、あるいは要約版の印刷物とのセットとして販売されている(Wileyは後にルーズリーフ版も出している)。完全な印刷版を求める読者は、どの版を買うのかを確認する必要がある。

コースにおける位置づけ

本書は、このコースのオペレーティングシステムの講義における主教科書の一つである。TanenbaumとBosの Modern Operating Systems は、Linux、Android、Windowsの詳しい事例研究に原理を根づかせた同等の標準的教科書であり、どちらを主教科書にしても、もう一方を別の説明として使える。Arpaci-Dusseau夫妻の無料の Operating Systems: Three Easy Pieces は、仮想化、並行性、永続性を軸に分野を組み立てており、特に並行性について別の角度から学びたい学生によい副読本となる。

Wardの How Linux Works は実践的な副読本で、第2章、第3章、第9〜14章、第20章の概念が実際に動いているLinuxマシンのどこに現れ、どう調べられるかを示す。SaltzerとKaashoekの Principles of Computer System Design は、より広くコンピュータシステムの設計原理を扱う後の講義に向いている。

本書の使い方

本書は、3〜4年次のコンピュータサイエンスの学部生(序文が示す水準)、大学院1年生、そしてオペレーティングシステムの体系的な解説を求める実務家に向いている。データ構造、計算機構成、C言語を身につけてから取り組むこと。

1学期の講義のための実際的な読み方:

  • 中核: 第1〜7章(概観、プロセス、スレッド、スケジューリング、同期)、第8章(デッドロック)、第9〜10章(メモリ)、第13〜14章(ファイルシステム)。これらが主要な概念とプログラミング課題の大部分を担う。
  • ストレージと入出力: 第11〜12章。特にシステムの性能に関心のある学生に。
  • 任意または2つ目の講義: ファイルシステムの内部、セキュリティ、保護、仮想化、分散システムを扱う第15〜19章。
  • 事例研究: 講義でLinuxを使ってプログラミングするなら第20章を中核の章と並行して、Windowsを使うなら第21章を読む。歴史的なシステムに関するオンライン付録は興味に応じて。

各章末の練習問題を解き、Webサイトの解答と照らし合わせること。Linuxの仮想マシンは早めにインストールし、プログラミング課題に取り組むこと。プロセス、スレッド、同期、メモリ管理は、主に自分でプログラムを書くことで理解できるようになるからである。復習には学習ガイドを手元に置いておくとよい。