「Linuxのしくみ」を読んだ

linuxのしくみ

Linuxのしくみを読んだので感想を書きます。

本の内容

Linuxのカーネルの動きやハードウェアの動きを、コマンドやプログラムを通して実験し体感できる内容となってます。

第1章ではコンピュータシステムについての概要を説明しています。
この章に触れた内容を、後述する章で詳しく解説していきます。

第2章では、ユーザモードで実現する機能について説明しています。
ユーザモードのプロセスがどうやってカーネルの機能を呼び出しているか、
システムコールの動きを追っていきます。

第3章では、プロセス管理について説明しています。
「同じプログラムの処理を複数のプロセスに分けて処理」する際に呼ばれるfork()、 「まったく別のプログラムを生成」する際に呼ばれるexecve()について動きを追っていきます。

第4章では、プロセススケジューラについての説明です。
Linuxカーネルはいかにして複数のプロセスを同時に動かしているのか、
コンテキストスイッチの様子を見ながら動きを追っていきます。
また優先度(nice())の動きも見ていきます。

第5章では、メモリ管理についての説明です。
プロセスがどのように物理/仮想メモリにアクセスしているのかを動作を追っていきます。

仮想アドレスから物理アドレスへの変換に使われる「ページテーブル」、
ファイルの領域を仮想アドレス空間上にメモリマップするという機能の「ファイルマップ」、
プロセスのメモリ使用を節約するため、仮想メモリを割り当て物理メモリを割り当てない機能の「デマンドページング」、
fork()時にプロセスコピーする際、ページテーブルだけをコピーする「コピーオンライト」、

これらの動きを、本当に丁寧に実験プログラムを通して見ていきます。

第6章では、記憶階層についてです。
以下のような階層にあり、それぞれどのような特性でどのような使われ方をするのか見ていきます。

  • レジスタ
  • キャッシュメモリ
  • メモリ
  • ストレージデバイス

第7章では、ファイルシステムについてです。
ストレージデバイス内のデータにどうやってアクセスしているのかを、
ファイルシステムを使用して実際にアクセスして動作を追っていきます。

ファイルシステム不整合を防ぐ技術である「ジャーナリング」と「コピーオンライト」も詳しく動きを見ていきます。

またファイル、ディレクトリ以外のファイルである「キャラクタデバイス」「ブロックデバイス」についての説明もあります。

第8章では、ストレージデバイスとそれに関するカーネルの説明です。
HDD/SSDの特性をプログラムを通して見ていきます。

感想

なんとなく理解していた知識が「実験」を通してクリアになりました。

例えばプロセス生成時、仮想メモリは確保するが物理メモリは確保されていない。という現象は理解していました。
しかし

  • なぜこれが行われているのか
  • どうやって行われているのか
  • そもそもこの現象の名前は?

っていう感じでした。

このLinuxのしくみを呼んでその疑問が氷解しました。
この現象は「デマンドページング」といい
無駄なメモリ消費を減らすための仕組みで、実際どうやって動くのかをCのプログラムを使って見ていきます。

このようなあやふやな知識をきちんと整理してくれたのが「Linuxのしくみ」です。
これ以外にもたくさん同じ経験をしました。
それは「本の内容」にも書いた通り、プログラムを通して実際の動きを見て自分の目で確かめるから理解がしやすいのです。

Linuxの入門書として非常に良くできていて、
これはもし自分が新人研修とかをやることになったら教材にしたいくらいです。

また今回Cのプログラムを使って実験していましたが、
これをGo言語で書き直して(Goで再現できないところもあるかもだけど)改めて実験したら
さらに自分の理解が深まるなーと思ったのでやっていきたいです。

最後に

これからLinuxの勉強を始める人はもちろん、
僕のように中途半端な知識を持っている人にもおすすめできる良書です。
実際の動きを図やプログラムで具体的に表してくれるのでスッと頭に入ります。

では!