utsubo’s blog

競技プログラミングとか.

「Linuxのしくみ」を読んで

はじめに

gihyo.jp
を読みました。

感想

低レイヤ寄りのことを知りたかったので読み始めました。
基本的な用語でも分かってないことがあったので為になりました。
この仕組みで複雑なアプリケーションが動いてるの凄すぎて気持ち悪い。

7章ぐらいから飽きてきてあんまりきちんと読めていないので、そのうち読み直します。
次は、OSの作り方でも読もうかと思います。

メモ

ただのメモ。

1,2章
3章 プロセス管理
4章 プロセススケジューラ
  • スループットとレイテンシ
  • プロセスのスケジューリング(niceで優先度設定ができる)
5章 メモリ管理
  • taskset(cpu指定(それ以外にも色々機能がありそう)),time,ps(時間計測,ユーザ/カーネルモード)
  • OOM killer(Out Of Memory)(メモリが足りなくなった時に適当に要らなそうなやつをkillする機能、vm.panic_on_oom)
  • プロセス毎に 物理メモリに割り当て→ページテーブル(カーネルのメモリ上)作成(mmap)
  • mmap()でページ単位で確保→mallocは内部でそれを切りわけて使っている
  • 無駄なメモリ確保を防ぐデマンドページング(カーネルが初アクセス時に物理メモリへ割り当てる)
  • Copy On Writeとは何か(fork()システムコールの時に仮想記憶が役に立っている、fork後が書き換えられた時にコピーする)
  • OOMの救済にSwap、メモリ↔ストレージのスワップ領域
  • メジャーフォールト(ストレージへのアクセスが発生)←こっちが重い、マイナーフォールト(ストレージへはアクセスしない)
  • ヒュージページ(ページテーブルのメモリを減らす機構、まとめるページ単位を大きくまとめる)
  • トランスペアレントヒュージページ(自動でヒュージページと通常モードを切り替える、Ubuntu16.04ではデフォで有効)
6章 記憶階層
  • ライトバック方式(所定のタイミングでバックグラウンドでメモリに書き込む)、ライトスルー方式(キャッシュラインがダーティになった瞬間にメモリに書き込む)
  • L3キャッシュはCPUで共有してたりする
  • 参照の局所性(近い場所の又近い時間でデータにアクセスすることが多いので基本的にキャッシュが働く)
  • キャッシュでは、物理メモリのページテーブル参照は高速化されない→Translation Lookaside BufferというCPUの機能がある
  • トランスレーション・ルックアサイド・バッファ - Wikipedia MMUがやってるらしい
  • ページキャッシュ(メモリ↔ストレージ)の話、こっちはキャッシュライン単位でなくページ単位で扱う(キャッシュメモリはCPU↔キャッシュメモリ↔メモリ)
  • ダーティページのライトバック周期はvm.dirty_writeback_centisecsパラメータで設定できる
  • or vm.dirty_background_bytesの割合が超えた時ライトバック発生
  • ハイパースレッド機能(よく分からんから後で調べる)
7章 ファイルシステム
  • 容量制限=クォータ(ディレクトリ、ユーザ、サブボリューム等ごとに制限が掛けれる)
  • ファイルシステムの不整合を防ぐ方式→ジャーナリングトランザクションみたいな)、コピーオンライト(アホほどコピーとる)
  • それでも駄目な時はfsck、だけど時間かかる割に望んだ結果にならないことが多い
  • キャラクタデバイス、ブロックデバイスとは?(よく分かってないから後で調べる)
  • tmpfs、メモリ上のファイルシステム、凄そうだけどこれもよく理解できてない
  • ネットワークファイルシステムWindows→cifs、Linuxnfs
  • プロセスの情報は/proc以下にマウントされたprocfsで分かる(top,freeはここから採取)
  • sysfsはprocfsの濫用を防ぐためにできた
  • cgroupでリソース(CPU、メモリ)使用量に制限を掛けられる
  • Btrfs、ファイルシステムのすごいやつらしい
8章 ストレージデバイス
  • I/Oスケジューラ(連続したセクタから読み出す)、先読み
  • SSDは電気的な処理なので読み書きが早い

あとでやる

  • sarの使い方をまとめる
  • ふつうのLinuxを読む
  • OSの作り方を読む