2018年2月20日火曜日

「[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識」 をよんでみたら....

まだいただいてざっと目を通しただけなので、Quick and Dirty Review です。 もう少しよく読んで、興味深い点があれば改めて別の機会にご紹介したいと 思います。

「[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識」
http://gihyo.jp/book/2018/978-4-7741-9607-7

技術書の出版社として定評のある、技術評論社からの出版と言うことで、 見やすくわかりやすい装丁、厚さやページ数も通勤の合間に電車で読むのに ちょうどよい大きさになっています。

私が描きたいことはほとんど本書の最初に小崎 資広さんが「本書によせて」に 書いてしまっているので実はあまり書くことがありません。本屋さんの店頭で 最初の3ページに書いてあるので、是非手にとって開いてみてください。

本書の内容を以下の一言が端的にあらわしていると思います。

常に豊富な図表、および説明を裏付ける実験データを示すことによって具体的、 かつ、簡潔に物事を説明します。」

実際 OS やカーネル内部の機能を説明しようとするとつい難しい概念や数式を 使ってしまい、自分でもなにいってんだっけ?ってなりがちです。 本書はそういった概念の重要な要素に関して簡潔かつ実際の実習を通してわかり やすく説明しています。

じつは本書が出版されなかったら、社内向けでも自分で整理して書こうかと 思っていました。そのときに武内さんが書いてくれないかなぁとついおもって いました。私が書くよりも遥かに簡潔かつ適切に書いてくれるはずです。 本書はその願いがかなった一冊です。

筆者の武内さんはカーネル内部の挙動について、実際の業務で詳細な解析を 迫られた稀有な日本人の一人です。趣味でカーネルの解析を行っている人は かなり多数いると思いますが、現実の切羽詰まった状況でカーネルの解析を 行っている人は相当限定されるのではないでしょうか。そういった経験を元に 本書は書かれていると思います。

実際 Linux カーネルに関して、特に性能指標に関しては風説やら、誤解やらが 多いなあと思っているのでそういった誤解やら風説やらを本書が一掃してくれる のではないかと期待しています。

こういった Linux カーネルをテーマにした本としては、例えば以下の2冊が 有名かなと思うのですが、今となっては若干内容が古くなっている部分が 多くまた、内容が難しく読み解くのが大変だと思います。

「詳解 Linuxカーネル 第3版」
https://www.oreilly.co.jp/books/9784873113135/

「Linuxカーネル2.6解読室」
http://www.sbcr.jp/products/4797338261.html

本書はこういった難解な書物を読み解かなくても、実用的な Linux カーネルの 知識を手に入れることができる貴重な一冊だと思います。

特に「試して理解」とタイトルで記載されている通り、本書では実際に動く コードをベースに動作を検証を通じて理解するように構成されています。 カーネルコードや動作は変わっても、本書に掲載されているコードをベースに 検証することで動作を確認することができると思います。

本書の「はじめに」で

仮想マシンでなく実機上にシステムを構築してください。 その理由は、仮想マシンを使用すると、一部の例については本書に記載したもの と比べて挙動が変わることがあるからです。
とありますが、仮想マシンで実行 した場合との差異といった話題も興味深いのではないでしょうか?機会があれば 実際にいくつかの仮想マシンで実行してみた結果なども触れてみたいと思います。

特に KVM と XEN の仮想マシンのスケジュールの違いなど、興味深いテーマでは 無いでしょうか?

以下章別に本書を概観します。

「第1章 コンピュータシステムの概要」では本書が対象とするコンピュータシステム のモデルが示されます。通常は個別のデバイスについて目が行きがちですが、 全体としてのスループットを検討する際はこういった簡素化されたモデルが有効 です。本書は全体を通して、このモデルに従って説明が進みます。

「第2章 ユーザーモードで実現する機能」として、システムコール呼び出しが 概説されています。普段業務で様々なコマンドを使用しているか方も多いかと 思いますが、カーネルへの入り口としてシステムコールを特に意識することは 少ないと思います。個人的には何かカーネルの動作を確認したくて、カーネルソースを 読まなければいけない場合はまずはシステムコール呼び出しから たどっていくことが多いです。カーネルへの入り口としてシステムコールを 取り上げているのは説明の順序としては、必要なのではないでしょうか。

「第3章 プロセス管理」として、fork() と execve() によるプロセス生成が 取り上げられています。実行ファイルをメモリに読み込んで、プログラムを 実行し、終了するまでの一連の流れが説明されています。

本書は入門書という位置づけなので、ELF フォーマットの詳細を確認したい人は 例えば以下の書籍を参照してはいかがでしょうか?

「ふつうのコンパイラをつくろう」
http://www.sbcr.jp/products/4797337958.html

「第4章 プロセススケジューラ」では、CPU に対してどのようにプロセスが 割り当てられ、利用されているかが概説されます。このあたりから本書の 実力が発揮されている感が出てきます。はじめにで仮想環境では異なる結果が 出る可能性があるとの記載がありますが、一番結果が異なるのはここではない でしょうか?実際の検証用コードを用いてプロセスのスケジュールについて 実験と解説を行っています。

プロセスの状態転移について記載があるので、応用として I/O が絡んだ場合なども あってもよかったような気がしますが、そのあたりは読者への課題として残して あるのでしょう。

「第5章 メモリ管理」ではプロセスへのメモリ割り当てについて、デマンド ページングや階層型メモリ管理、仮想記憶についての記載があります。

ページテーブルについてあまりちゃんと説明されている文書を見かけることが 少ないので、非常に参考になります。詳細まで説明されているものとしては 例えば以下の Intel のマニュアルぐらいしかないのではないでしょうか? ただこれをいきなり読んで理解するのは非常に大変なので、まずは本書に 記載されている範囲で理解するだけでもだいぶ違うと思います。

Intel(R) 64 and IA-32 Architectures Software Developer Manuals
https://software.intel.com/en-us/articles/intel-sdm

ただいきなりこれを読んでも玉砕する可能性が高いので、事前知識として 本書を一読してからをお勧めします。ただエンジニアとしては一度は、 Intel の上記マニュアルを当ってみてはいかがでしょうか?

brk()/sbrk() も見捨てないでほしかったなぁ(ボソ

「第6章 記憶階層」では CPU キャッシュから、ディスクキャッシュまでの 記憶階層について記載しています。特に CPU キャッシュについては 2018 年 2月現在において、一番ホットな話題ではないでしょうか? Spectre / Meltdown に ついては同じ筆者の以下の資料があります。

「 図解でわかる Spectre と Meltdown 」
https://speakerdeck.com/sat/tu-jie-dewakaruspectretomeltdown

記憶階層とスループットに関しては、本書の参考文献にも挙げられていますが、 以下の書籍が詳しいです。

「コンピュータの構成と設計 第5版」
http://ec.nikkeibp.co.jp/item/books/P98420.html

ただこれも上下巻でかなり分厚く、読み応えがある書籍になるので、本書で 一回予習してからあたったほうがベターです。

キャッシュを意識したプログラミングなんて今時ほとんどしないかも知れませんが、 ちょっとした工夫で、まったく実行性能がまったく変わってしまうことがわかると 思います。

キャッシュについてもいろんなキャッシュがあるので、開放できないキャッシュが あることは注意が必要になります。

「第7章 ファイルシステム」ではファイルシステムが提供している、 ジャーナリングや CoW 等について概説しています。とくに Btr FS については 他に解説している文献も少ないので、参考になるのではないでしょうか?

また、実運用上よく発生するファイルシステム不整合について記載があるのも 珍しいと思います。

「第8章 ストレージデバイス」でも同じく実験によって、ストレージデバイスの 機能と性能について解説しています。性能上、ボトルネックになりやすいところ でもあるので、このような性能評価方法と解釈について解説してあるのは大変 有用だとおもいます。

また iostat コマンドの出力で rrqm/s 等の項目について、漫然とこんなもの かなぁとおもっている方も多いのではないでしょうか?本書では実験を通じて そのパラメータがどういう操作に基づいてどういう結果を表しているのかを 理解できるとおもいます。システム管理などの業務についている方にとっては チューニングやサイジングを実施するにあたって有効な参考書となるのでは、 ないでしょうか?

ちなみに本書を読み終えた後のより進んだ話題としては以下の書籍がお勧めです。

「詳解 システム・パフォーマンス」
https://www.oreilly.co.jp/books/9784873117904/

上記書籍と本書とは重複する内容も多いですが、本書の方がより平易な表記に なっていると思います。

また C 言語はちょっとと言う方は、以下の書籍もあわせて読まれることを お勧めします。

「Goならわかるシステムプログラミング」
https://www.lambdanote.com/products/go

ただ go 言語では、メモリ管理が C 言語ほど直接扱っているわけではないので、 少しわかり憎いかもしれません。

以上、ざっと読んだ感想です。