はぜです.
![[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識 [試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識](https://images-fe.ssl-images-amazon.com/images/I/51r%2BeNsY2fL._SL160_.jpg)
[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識
- 作者: 武内覚
- 出版社/メーカー: 技術評論社
- 発売日: 2018/02/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
読みました.
自分について
買おうか悩んでいる人向けに参考程度ですが, 自分の情報を書いておくと
- SIer Web部 => Web系企業バックエンドエンジニア 合わせて2年
- 高校, 専門学校で情報学はある程度学んでいるが, 実践は少なめ. ハッカソン等には出ていない
- 競技プログラミングは多少経験あり. 上位入賞などはしていない
- コンピュータの抽象的な理論についてはある程度知識がある(応用情報技術者, データベース/情報セキュリティスペシャリスト試験)
- 触ったことのある言語: C/C++/Java/Go/Perl/Ruby
- 広く浅くという感じ. 「使いこなせる」レベルのものは一つもないと思う
- CentOS歴2年程度. Ubuntuはほぼ触れない. 他は全く知らない
という感じです. 所謂「スーパーマン」ではない.
プログラミング自体には長く触れているが, 「がっつり」ではない. ゆるふわエンジニアです.
自宅サーバはこの前破棄しちゃったのでmacで可能な限り試した. 他に動いている処理が結構あるので正確な実験ではないだろうけど, まあ良いでしょう.
以下, 各章ごとの自分用メモと簡単な感想
1章 コンピュータシステムの概要
大体知ってた. そうだねーっていう感じで軽く読み飛ばし.
文章も図もまとまっていてわかりやすい. 人に説明するときに参考にしたい.
2章 ユーザモードで実現する機能
- OSの機能とかプロセス発行をしたいときはシステムコールを使ってカーネルモードで処理をするんだよっていう話
strace
を使ってHello,World!を表示するときにどんなコールが呼ばれているかを確認sar
コマンドでユーザモードとカーネルモードのどちらでプロセスを実行しているかを確認する- システムコールのラッパー, OSが提供するライブラリとプログラムについて
strace
コマンド初めて知った. すごい. よくわからない
無限ループでシステムコールを使う処理を回した時の実験は, 思ったよりuser率高いなーという感想.
3章 プロセス管理
fork()について
- 子プロセス用のメモリ領域を作る
- 親プロセスのメモリ領域を子プロセスのメモリ領域にコピー
- 親と子が別々の処理として動く
execve()について
- 実行ファイルを読んで, その内容を実行中のプロセスに上書き
- 実行
- プロセス数は増えない.
readelf
でコマンドの開始アドレスを見る
実行時に生成されたプロセスのメモリ情報(マップ)は
/proc/[pid]/maps
に書き出される- プログラムを終了するには
_exit()
システムコールが使われる
いわゆる fork
と exec
の話.
forkはすぐイメージできるけど, execは別プロセス化して動くっていうのがなんとなくイメージ付きづらいところがある.
4章 プロセススケジューラ
taskset
... 指定したプログラムを指定したCPU上でのみ動作させるコマンド複数のプロセスを1CPUで同時に実行させた時の進捗度合いを実験する
- 一定時間ごとにプロセスが順番に切り替わっていく(コンテキストスイッチが発生する)ことを確認
- 実行が完了する時間はプロセスが増える分に比例して増えていくことを確認
実行状態, 実行待ち状態, スリープ状態, ゾンビ状態について
アイドルプロセス: 何もしないことでCPUを休止状態にし, 消費電量を抑えた状態にするプロセス
スループットとレイテンシについて
- スループット: 実行完了プロセス数/経過時間
- レイテンシ: 実行完了時間 - 実行開始時間
複数CPUでの複数プロセス同時実行
- nice(): 優先順位
- 優先順位を下げることは誰でもできるが, あげるのはroot権限持ちユーザのみ
プロセスの実行順序と掛かる時間についてのお話.
頭の中では理解しているが, 実際にグラフを見ると面白い. 実際こんな綺麗に結果が出てくるものなんだなーと思った.
macの上にvagrant/virtualboxでCentOSを立ち上げてやってみると, 書籍に書いてあるほど綺麗ではないがそれっぽい挙動を見ることができた.
5章 メモリ管理
free
コマンドでメモリの状態を見る- OOM Killer 「君はたぶんいらない子」
仮想記憶の仕組みを用いない単純なメモリ割り当ての問題点
- メモリの断片化
- 割り当てられた領域以外の領域へのアクセス可
- メモリの断片化によるプロセスのメモリ配置ができなくなる問題
仮想記憶について
ファイルマップ
- ファイルの領域を仮想アドレス空間上にメモリマップする機能
デマントページング
- 領域を確保したが, ユーザに使われなかった領域が出た場合に他のプロセスにその領域を割り当てる機能
仮想メモリ, 物理メモリの枯渇
forkの高速化
ヒュージページ
普通に知らないことが多くて良い. デマントページングとか初めて聞いた.
OOM Killerとかswapとかは仕事でサーバ削減をしていたときに結構気を付けていたので知ってはいたが, ぼんやりした理解だったので確認.
ちゃんと理解して使えるようになりたいと思う反面, この辺を真面目に意識してプログラムを書く機会ってそんな無いよなあ と思ってしまう.
メモリを極力使わないようなコードを書くとか, メモリ領域に合わせて使う分を考えてとかはやると思うけど. 忘れないようにしたい.
6章 記憶階層
- レジスタ
- メモリキャッシュ
- メモリ
ストレージデバイス
- の速度の話
キャッシュメモリの話, 階層型の話
参照の局所性
- 時間的局所性: アクセスされたデータは近いうちに再びアクセスされる可能性が高い
- 空間的局所性: 次にアクセスされるデータは, 前回アクセスされたデータの近くにある可能性が高い
Translation Lookaside Buffer
ページキャッシュ
- ストレージ上のファイルデータをメモリにキャッシュする.
- ダーティページの説明
- open()でファイルを開くときにO_SYNCフラグを立てると可能な限り同期書き込みをする
vm.dirty_writeback_centisecs
パラメータでダーティページのライトバックを行うタイミングを変更できる/proc/sys/vm/drop_caches
- ハイパースレッド
プログラムの高速化, ISUCONでよく考える系の話.
fujiwaraさんの資料がとてもわかりやすくて良い.
http://isucon.net/archives/50648750.html
Translation Lookaside Bufferとハイパースレッドがよくわかってないので調べてまとめたい
/proc/sys/vm/drop_cache
は仕事でお世話になった.
7章 ファイルシステム
- 雑に言えばファイル名/場所/サイズ のリレーションを保管しておいてくれるもの
- ユーザモードで ファイル名, ファイルのオフセット, サイズ を指定しシステムコールを発行すると, カーネルモードでストレージに行って読み出してくれる
データ: 文書, 画像, プログラムなど
メタデータ: ファイルの名前とかストレージ上の位置, サイズなどの補助情報
df
コマンドで表示されるストレージ使用率はデータ+メタデータの総量
クォータ: 用途ごとにファイルシステムの使用料を制限する機能
mvコマンドによるファイル移動の流れ
mv /bar /foo
foo -> bar
リンクを貼る/ -> bar
リンクを削除- 〜完〜
リンクを貼り終わった瞬間に電源が強制的に切られた場合, 二箇所からリンクが貼られた不整合な状態となる
- マウントで検出したらマウントができなくなる, アクセス中に検出すると読み出し専用モードでの再マウントorパニック
シャーナリング
更新中に強制断が発生した場合, ジャーナルログを最初から再生することで処理を完了させることができる.
コピーオンライト
不整合で死んだとき: バックアップを戻す or
fsck
で直すデバイスファイルについて
tmpfs
ネットワークファイルシステム
- いわゆるnfs.
仮想ファイルシステム
- procfs: プロセスの情報を得るためのもの. /proc以下. maps, cmdline, stat など
- sysfs: カーネルのプロセスに関係しない情報を置くためのもの. /sys以下. devices, fsなど
- cgroupfs: cgroupの情報が置かれている. rootのみ使用可
Btrfsについて
この章が一番知らないことが多かった.
journal ってそういう意味のものなのね... というのがこの本読んでの一番の驚きだった. プロセス死んでるときに見るためのログとしか理解していなかった.
普段あんまり意識していないなーという気持ちで読んでいた. 各ファイルシステムのこと(ext4とかXFSとかBtrfs)もある程度は理解しておくべきなんだろうなあ
第8章 ストレージデバイス
- HDDのセクタ
- I/O スケジューラについて
- ブロックデバイスへのアクセス要求をある程度溜めてからアクセスする仕組み
- 連続するセクタへのアクセスを一つにまとめる, 不連続なセクタへの要求を番号順に並べることで性能を高める
先読みについて
- ストレージデバイス内のどこかにアクセスした際, 同時にその周りの領域を先に読んでおく機能
- 空間的局所性
- 読んでおいたところにアクセスが来なかったら捨てる
HDDとSSDの違い
- SSD: アームもないし回転もしない
- 比較的高い
- ランダムアクセスだと差は顕著
基本情報技術者の午前試験思い出した. 懐かしい
HDDはどう動いていて, SSDはどう動いているのかを大雑把にでも理解しておくと, I/Oを考えるときに良いと思う.
数日で, 多少実験しながら読んだ.
覚えるというよりも, 正しく理解するための書籍で, 実験も面白くて良い.
学生のときに読みたかったな. 4月に入ってくる新人の人に貸してあげたりとか, プログラム書いたことあるけどインフラ系触ったことないような人に勧めてみても良い本なんじゃないかなーと思った.