[試して理解]Linuxのしくみ
―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】

書籍の概要

この本の概要

ITシステムやソフトウェアの基盤OSとして幅広く使われているLinux。エンジニアとしてLinuxに関する知識はいまや必須とも言えますが,あなたはそのしくみや動作を具体的にイメージすることができるでしょうか。

本書では,Linux OS における,プロセス管理,プロセススケジューラ,メモリ管理,記憶階層,ファイルシステム,記憶階層,そして仮想化機能,コンテナなど,OS とハードウェアに関するしくみがどのように動くのか,実験とその結果を示す豊富なグラフや図解を用いてわかりやすく解説します。

改訂に際しては全面フルカラー化。グラフや図解がさらにわかりやすくなり,ソースコードはC言語から,Go言語とPythonにアップデートしています。さらに仮想化,コンテナなどの章が加わりました。今どきのLinuxのしくみを本書でしっかり理解しておきましょう。

こんな方におすすめ

  • Linuxの動作や仕組みに興味があるエンジニア
  • OSや仮想マシン,コンテナのしくみを手軽に学びたいと考えているエンジニア

この書籍に関連する記事があります!

OSのしくみをLinuxで学ぶ
本書では、Linux OS における、プロセス管理、プロセススケジューラ、メモリ管理、記憶階層、ファイルシステム、記憶階層、そして仮想化機能、コンテナなど、OS とハードウェアに関するしくみがどのように動くのか、実験とその結果を示す豊富なグラフや図解を用いてわかりやすく解説します。

目次

序章 はじめに

第1章 Linuxの概要

  • プログラムとプロセス
  • カーネル
  • システムコール
    • システムコール発行の可視化
    • システムコールを処理している時間の割合
    • Column 監視、アラート、およびダッシュボード
    • システムコールの所要時間
  • ライブラリ
    • 標準Cライブラリ
    • システムコールのラッパー関数
    • 静的ライブラリと共有ライブラリ
    • Column 静的リンクの復権

第2章 プロセス管理(基礎編)

  • プロセスの生成
    • 同じプロセスを2つに分裂させるfork()関数
    • 別のプログラムを起動するexecve()関数
    • ASLRによるセキュリティ強化
  • プロセスの親子関係
    • Column fork()関数とexecve()関数以外のプロセス生成方法
  • プロセスの状態
  • プロセスの終了
  • ゾンビプロセスと孤児プロセス
  • シグナル
    • Column 絶対殺すSIGKILLシグナルと絶対死なないプロセス
  • シェルのジョブ管理の実現
    • セッション
    • プロセスグループ
  • デーモン

第3章 プロセススケジューラ

  • 前提知識:経過時間と使用時間
  • 1つの論理CPUだけを使う場合
  • 複数の論理CPUを使う場合
  • realよりもuser+sysが大きくなるケース
  • タイムスライス
    • Column タイムスライスの仕組み
  • コンテキストスイッチ
  • 性能について
  • プログラムの並列実行の重要性

第4章 メモリ管理システム

  • メモリ関連情報の取得
    • used
    • buff/cache
    • sarコマンドによるメモリ関連情報の取得
  • メモリの回収処理
    • プロセスの削除によるメモリの強制回収
  • 仮想記憶
    • 仮想記憶がない時の課題
    • 仮想記憶の機能
    • 仮想記憶による課題の解決
  • プロセスへの新規メモリの割り当て
    • メモリ領域の割り当て:mmap()システムコール
    • Column Meltdown脆弱性の恐怖
    • メモリの割り当て:デマンドページング
    • Column プログラミング言語処理系のメモリ管理
  • ページテーブルの階層化
    • ヒュージページ
    • トランスペアレントヒュージページ

第5章 プロセス管理(応用編)

  • プロセス作成処理の高速化
    • fork()関数の高速化:コピーオンライト
    • execve()関数の高速化:デマンドページング再び
  • プロセス間通信
    • 共有メモリ
    • シグナル
    • パイプ
    • ソケット
  • 排他制御
  • 排他制御の堂々巡り
  • マルチプロセスとマルチスレッド
    • Column カーネルスレッドとユーザスレッド

第6章 デバイスアクセス

  • デバイスファイル
    • キャラクタデバイス
    • ブロックデバイス
    • Column ループデバイス
  • デバイスドライバ
    • メモリマップトI/O(MMIO)
    • ポーリング
    • 割り込み
    • Column あえてポーリングを使う場合
  • デバイスファイル名は変わりうる

第7章 ファイルシステム

  • ファイルへのアクセス方法
  • メモリマップトファイル
  • 一般的なファイルシステム
  • 容量制限(クォータ)
  • ファイルシステムの整合性保持
    • ジャーナリングによる不整合の防止
    • コピーオンライトによる不整合の防止
    • 一にも二にもバックアップ
  • Btrfsが提供するファイルシステムの高度な機能
    • スナップショット
    • マルチボリューム
    • Column 結局どのファイルシステムを使えばいいのか
  • データ破壊の検知/修復
  • その他のファイルシステム
    • メモリベースのファイルシステム
    • ネットワークファイルシステム
    • procfs
    • sysfs

第8章 記憶階層

  • キャッシュメモリ
    • 参照の局所性
    • 階層型キャッシュメモリ
    • キャッシュメモリへのアクセス速度の計測
  • Simultaneous Multi Threading(SMT)
    • Column Translation Lookaside Buffer
  • ページキャッシュ
    • ページキャッシュの効果
  • バッファキャッシュ
  • 書き込みのタイミング
  • direct I/O
  • スワップ
  • 統計情報

第9章 ブロック層

  • HDDの特徴
  • ブロック層の基本機能
  • ブロックデバイスの性能指標と測定方法
    • 1プロセスだけがI/O発行する場合
    • 複数プロセスが並列にI/O発行する場合
    • Column 推測するな、測定せよ
    • 性能測定ツール:fio
  • ブロック層がHDDの性能に与える影響
    • パターンAの測定結果
    • パターンBの測定結果
    • Column 何のための性能測定
    • 技術革新に伴うブロック層の変化
  • ブロック層がNVMe SSDの性能に与える影響
    • パターンAの測定結果
    • パターンBの測定結果
    • Column 現実世界の性能測定

第10章 仮想化機能

  • 仮想化機能とは何か
  • 仮想化ソフトウェア
  • 本章で使う仮想化ソフトウェア
    • Column Nested Virtualization
  • 仮想化を支援するCPUの機能
    • QEMU+KVMの場合
    • Column CPUによる仮想化機能が存在しない場合の仮想化
  • 仮想マシンは、ホストOSからどう見えているか?
    • ホストOSから見たゲストOS
    • 複数マシンを立ち上げた場合
    • Column IaaSにおけるオートスケールの仕組み
  • 仮想化環境のプロセススケジューリング
    • 物理マシン上でプロセスが動いている場合
    • 統計情報
  • 仮想マシンとメモリ管理
    • 仮想マシンが使うメモリ
  • 仮想マシンとストレージデバイス
    • 仮想マシンにおけるストレージI/O
    • ストレージデバイスへの書き込みとページキャッシュ
    • 準仮想化デバイスとvirtio-blk
    • Column ホストOSとゲストOSでストレージI/O性能が逆転?
  • virtio-blkの仕組み
  • Column PCIパススルー

第11章 コンテナ

  • 仮想マシンとの違い
  • コンテナの種類
  • namespace
    • pid namespace
    • コンテナの正体
  • セキュリティリスク

第12章 cgroup

  • cgroupが制御できるリソース
  • 使用例:CPU使用時間の制御
    • Column cgroup機能のLinuxカーネルへの取り込み経緯
  • 応用例
    • Column cgroup v2

終章 本書で学んだことと今後への生かし方

著者プロフィール

武内覚(たけうちさとる)

2005年から2017年まで,富士通(株)においてエンタープライズ向けLinux,とくにカーネルの開発,サポートに従事。2017年からサイボウズ(株)技術顧問。2018年,サイボウズ(株)に入社。cybozu.comの新インフラのストレージ開発に従事。