More Related Content
What's hot (20)
PDF
Reactive extensions入門v0.1一希 大田
PDF
ドメイン駆動設計をゲーム開発に活かす増田 亨
Viewers also liked (20)
PDF
2章 Linuxカーネル - メモリ管理1mao999
PDF
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...Naoya Ito
KEY
ソーシャルゲームログ解析基盤のHadoop活用事例知教 本間
PDF
aisatsu suruto tomodachiga popopoponnto hueruyoshow you
PDF
TomonkenTohoku40th(20150125)真 岡本
Similar to How to read linux kernel (20)
KEY
Fabricでサーバー管理をDRYにしようmax747
PDF
【学習メモ#11th】12ステップで作る組込みOS自作入門 sandai
PDF
kernel/vm@okinawa 2014y0t4
PDF
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理Yuto Takei
PDF
IIJlab seminar - Linux Kernel Library: Reusable monolithic kernel (in Japanese)Hajime Tazaki
More from Naoya Ito (13)
PPT
Scripting Layer for Android + PerlNaoya Ito
PPT
Introduction to Algorithms#24 Shortest-Paths ProblemNaoya Ito
PPT
090518computing Huffman Code LengthNaoya Ito
Recently uploaded (8)
PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログkataware
PDF
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdfChikakoInami1
How to read linux kernel
- 4. 早速カーネルを読む ! 「なんと かわいい バイナリ」 「0x000000c4 は 俺の嫁 」 「いやいや、そこは 0x0000006d でしょう? なおや 氏 」
- 8. 以前の私 #1 負荷が過剰 「このサーバーはディスクが 重そう 」 (実際どこが正確な原因なんだろう...) (そもそも"負荷"って何だろう...)
- 9. 以前の私 #2 load average が 10.00 「 Google で調べると CPU数で割って 1.00 以下なら OK らしい。」 (なんでCPU数で割るんだろう...) (そもそも load average って何だ...)
- 10. 以前の私 #3 Apache がアクセス過多 「prefork から worker にすればマルチスレッドになって 速くなるかも 」 (なんでスレッドだと速いのかしら...) (とりあえず収まったから良いか...)
- 11. 以前の私 #4 I/O が高くてディスクがもたない 「サーバー増やしてみる? SCSI のディスクに 変えてみよう か」 (I/O ってどうやったら減らせるの...?) ( SCSI にしたところで大して速くならない...)
- 13. 現在の私 #1 負荷が過剰 OS の出力する統計情報から原因を特定 load average が 10.00 load average を上昇させるプロセスを特定 プロセスの挙動からボトルネックを特定
- 14. 現在の私 #2 Apache がアクセス過剰 なぜ応答を返せないか原因を統計から特定 プロセス or スレッドは両者の差異点がどこかを考慮して選択 I/O が高くてディスクが持たない I/O 分散計画をキャッシュを前提に立てる
- 15. カーネルのソースに触れたことで OS の動作原理や統計情報の意味をソースコードレベルで理解することができた 根拠を持って負荷分散戦略を立てられるようになった スケーラブルなアプリケーション設計に自信が持てるようになった 抽象レイヤが透けて見える
- 24. Linux カーネルの設計 モノリシックカーネル 複雑な設計パターンはあまりない ややオブジェクト指向 (VFS など) ただし量は多い ... 500Mステップ
- 29. GNU GLOBAL ソースコードタグシステム 関数の定義場所、呼び出し場所にジャンプ Emacs と連携 if (likely(prev != next)) { rq->nr_switches++; rq->curr = next; ++*switch_count; context_switch (rq, prev, next); } else { ... sched.c 3517 行目 sched.c 1860 行目 static inline void context_switch (...) { struct mm_struct *mm, *oldmm; prepare_task_switch(rq, prev, next); mm = next->mm; ..
- 33. Linux Kernel Hack Japan http://hira.main.jp/wiki/index.php " ひら " さんによる膨大な覚書き ひらメソッド 分からない時のヒントに
- 34. ソースを読む 5 つのコツ 読む対象を絞る いきなり読まない 概観を知った上で読む 重要なデータ構造を把握する テストプログラムのトレースを活用する
- 35. 1. 読む対象を絞る 隅々まで読もうとしない 500Mステップも読めない (自分もまだ数 % です) テーマを決めて読む 「load average の計測方法を調べる」 「コンテキストスイッチの仕組みを調べる」 「 select(2) の実装を調べる」
- 37. 3. 概観を知った上で読む 書籍で知りたい箇所の概観を掴む スケジューラの概要 ... ふむふむ、なるほど -> ソース読む 大枠が分かっていれば迷子にならない
- 38. 4. 重要なデータ構造を把握しておく 重要なデータ構造 struct task_struct struct mm_struct VFS の struct file_operations ...
- 39. 5. テストプログラムを活用 例: スレッド生成周りの処理が知りたい pthread_create() するプログラムを作る プログラムを strace する システムコールの呼ばれ方 -> 実装箇所の当たりが付く
- 40. 例 : usleep(3) の精度が知りたい http://d.hatena.ne.jp/naoya/20080122 まずテストプログラムで実験 strace で nanosleep(2) の呼び出しを確認 書籍の索引で nanosleep を引く タイマ割り込み周りの章を読む タイマ割り込み周りのコードの当たりがつく ack や GNU GLOBAL を駆使して sys_nanosleep() の実装 / 周辺を芋づる式に調べていく ( 道筋の記録を忘れずに ) nanospeel(2) の母体になっている動的タイマが割り込み周期に依存していることが分かる -> 4ms
- 41. 読んで分かった必要な知識 C言語 gcc 拡張 GNU開発ツール CPU の機能 (x86) オブジェクト指向 簡単なパターン (Template Method など) Writing a Simple File System http://www.geocities.com/ravikiran_uvs/articles/rkfs-old.html
- 42. 番外編 手を動かしたい方は ... カーネルモジュール開発が面白い http://d.hatena.ne.jp/naoya/20071201 フィボナッチ数列を計算するデバイス ( アホ ) % cat /proc/fib 10 % cat /dev/fib 55
- 44. 最後に カーネル? 何の役に立つの? 「ただ知りたかった」 カーネルへの興味が負荷分散に繋がるとは思っていなかった 役に立つかどうかは知らなければ分からない。 知りたいと思う動機を大切に。