「試して理解 Linuxのしくみ」を読んだ

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

読んだ理由

せっかく自宅の環境をUbuntuにしたので

sasa5740.hatenablog.com

Linuxの基本的な知識知りたいなぁと思ったのと、A Tour of Goとかruby/rubyの並行テストとか見て並行処理の意味が全くわからんちんだったので、プロセスを詳しく知るために購入した。

全体的な感想

試して理解ということでサンプルコードがたくさん載っていた。最初はGitHubに全部上がってるの知らずにポチポチC言語写経しながら読んでいた。

実際にハードウェアにアクセスするのがカーネルで、普段僕が書いてるアプリケーションはあくまでプロセスとしてシステムコールのラッパー関数を呼び出しているだけ、という事からして初めて知ったので、全編に渡って新しい発見の連続だった。
あと著者の方の環境がメモリ32Gで人権を感じた。

要約感想的なもの

 3章

  • fork()関数もこの本で初めて知った。webサーバーがなんで同時に複数のリクエストをさばけるのか少しわかりかけてきた。

techracho.bpsinc.jp

(この記事の意味がようやく少しわかった。)

 4章 プロセススケジューラー

  • 論理CPU一個が同時に二つプロセス動かすことはない。プロセスはコンテキストスイッチでそのプロセス関係なく処理が一旦止まることがありうる。

  • 単位時間あたりの処理量と結果的な処理にかかる時間はトレードオフ

     5章 メモリ管理

  • メモリアドレスを直接扱うのはプロセスにはまだ早すぎるので仮想アドレスを使う。

  • ページテーブルはルーティングテーブルみたいなもの。コンピュータというのはどこも二分探索にするための工夫が多い気がする。

  • デマンドページング 仮想メモリ確保 != 物理メモリ確保

  • copy on write fork()時にいきなり新しい物理メモリを確保するのではない。 書き込むときに子プロセス用のメモリを確保して書き込む。

  • ヒュージページ 葉を増やすと枝も増える。仮想メモリと物理メモリの関係も増える。単位を大きくして防ぐ。 ubuntu 19.04ではトランスペアレントヒュージページのデフォルトはmadvise()だった。

     6章 記憶階層

  • メモリとキャッシュメモリは違うもの

  • キャッシュメモリに局所性(実際に使うところ)をいかにおさめるか

  • メモリにキャッシュしたものをダーティにして実際に変更してダーティを解除

  • ページテーブルもCPUにあるTLBで

  • Linuxはファイルを可能な限りページキャッシュしようとするって大規模サービス実践技術入門にもあった気がする。実際有無を比べると早さが違う

  • write backは自分の環境でも五秒に一回だった。想像の何百倍も間隔長かった。ダーティのまま中断は普通に起こりそう。 

     7章 ファイルシステム

  • ファイルシステムがないとお前がカーネルになるしかない

  • ファイルシステムでもcopy on write 書き換えるときはコピーする

     8章 ストレージデバイス

  • ファイルは連続あるいは近く

  • 連続する領域へのアクセスは一回で

終わりに

サンプルコードや実際に手を動かすところが多かったのも良かったけど、解説において過程を飛ばさないで一つ一つ全部図解してくれていたことがありがたかった。
どうやって並行処理の整合性保ってるのかはあんまりわかってない。 子プロセスで書き込みしたらcopy on writeで別の物理アドレスになってしまうのでは???
次は「なるほどUNIXプロセス Rubyで学ぶUnixの基礎」を買ったのでまた知識の上塗りをしていきたい。