雑種路線でいこう

ぼちぼち再開しようか

OSの内部構造を何故,どうやって勉強するか

デバドラとか組込系の仕事をしたいというのでない限り,いまどきOSについて詳しくても困ることはないんだけど,やはり基本的なことは知っておいた方がいい.*1とはいえ,ここ数年で学習環境が大幅に改善したとはいえ選択肢が増えすぎて,何から手をつけていいか却って分かりにくくなった感がある.
僕が学ぼうとした1990年代後半は,教科書というと『オペレーティングシステム―設計と理論およびMINIXによる実装』とか『インサイド WINDOWS NT 第2版 (マイクロソフト公式解説書)』だった.会社には当時は幻だった*2Lions’ Commentary on UNIX (Ascii books)』の原書とかも置いてあったし,何となく眺めて「あー昔はこんなに見通しが良かったのか」と感動したけど,*3
長文エントリになったんで先に結論を書いちゃうと,今日ぼくが調べた範囲だとFreeBSDを入れて『BSDカーネルの設計と実装―FreeBSD詳解』を読むのが一番シアワセになれそうな気がする.ここは是非Linux派の反論&情報が欲しいところ.
言語の話の続きで学習に適したOSについて考えようとしたんだけど,なかなか難しい.いまどきのLinuxの内部構造ってどの本を読めば分かるんだろう.LinuxってSlackwareの頃まではLoadable Kernel Moduleの仕掛けが成熟してなかったこともあって,誰もがハード構成に合わせてカーネルを再構築するのが当たり前だったし,新しいgccでビルドしたりコンパイルオプションを変えてみたり,あとサーバーとして運用するにはファイルディスクリプタの数とか諸々を書き換えたり,あちこちから集めたパッチを適用して遊んだものだけど,気付いたらFedoraなんか,最近どうインストールしても/usr/src以下が空だったりするしね.いちいちsrc.rpmを展開してソースを眺めたり,自分で再ビルドする奴ってどれくらいいるんだろう.本家のtarball引っ張って再構築すると,却ってハマるのが目に見えているし.
そういう意味で,ビルドシステムがシステム管理者によるカーネル再構築を念頭に置いている*BSDの方がまだカーネルは身近だ.けど,カーネル構造の奥まで解説したBSD本の多くは旧過ぎる.NetBSDOpenBSDMach VMを捨ててしまったし,FreeBSDもマトモにSMPをサポートするために大幅に書き換わってしまった.ファイルシステムも昔のUFSからは激変してるし.とか思ってたら,いつの間に『BSDカーネルの設計と実装―FreeBSD詳解』なんて本が出ていたのか.この本は良さげだ.こんど探してみよう.
MacDarwinのkernel sourceがビルド可能なかたちで公開されて,x86への移行とParallelsの登場でMac上でゲストOSとしてカーネルを動かしてデバッガにかけるのが楽になった気がするけど,いい教科書がない.Mach 3.0ベースといっても,UNIXサブシステムをカーネル内の関数呼び出しに戻してしまっていたりとかMachの教科書を読めばいい感じでもないし.
up to dateな教科書の充実という点では最近『インサイド MS WINDOWS 第4版 上 (マイクロソフト公式解説書)』『インサイド MS WINDOWS 第4版 下 (マイクロソフト公式解説書)』が出たWindowsもなかなかいいのだが,いかんせんデバッガでソースコードを追えないと,OSの勉強というのは実感が湧かないじゃない.どーせkernel coreだけ公開したって丸ごとパチられることもないだろうし,"Windows Research Kernel"といって,研究用途ではライセンスも緩くなってるんだから,個人的にはkernel sourceをDDKの一部としてカーネルデバッガから参照できるかたちで配ったらどうだろう,とか思うのだが...
とゆー訳で仮想化環境の普及とか,書籍の充実とか,諸々の面でOS内部環境の学習インフラは向上しているかにみえて,どれも細かく検討してみると帯に短し襷に長しという気がしないでもない.*4ただ,学習環境がないから勉強できないのか勉強したいひとが少ないから本にならないのか微妙なところだ.
LinuxとかBSD界隈をみていると,細かいところで面白い論争*5が色々とあるんだけど,やっぱりカーネル周りの話題って総じて地味なんだよね.BSD vs. System VとかLinus - タンネンバウム論争くらいまでが華でさ.マイクロソフトWindows 95とかNT 4.0くらいまでは「9xの実装をプリエンプティブ・マルチタスクと呼んでいいのか」とか「NT 4.0でGDIをkernel modeに持って行ったのは理解できない」とか好事家の間で下らない話題の種になってたんだけど「Windows Vistaではスケジューラのデータ構造をいじって云々」とか,誰も話題にしているのを聞いたことがない.NGSCBがちゃんと実装されればTCBの信頼モデルってどうよとか,話題に華が咲いたのかも知れないけどさ.
たぶん諸々のマイクロカーネルとか分散OSが商業的には成功しなかったあたりから,OS研究って地味だよね的な雰囲気が醸成されたのかな.身の回りのカーネルハッカー達をみていても,まだOS研究が輝いていた時代に勉強された世代の方々が多いような気がする.それはこう,ルータ技術者のコミュニティに顔を出しても感じたりするのだが... という訳でOSって地味に進化してるけど,基本は20〜30年前からあまり変わってないし,勉強したくなる誘因ってあるのだろうか,研究して何か大きな進歩を勝ち取る機会ってあるのだろうか,ということが問題だったりする.

*1:サーバー運用の現場でパラメータ設定とかする時に役に立ったり,JavaC#でもThreadは自分で切らなくちゃならないし,未だに再現性の低い面倒なバグというとThreadの競合だったりするのであって,JavaC#が言語仕様としてThreadをどう扱っているか,それが実行環境の下でどうハンドリングされているかとか,知っておくおくに超したことがない.性能チューニングの面でも,これまでMPUはパイプラインを深くしてクロックを高くする方向だったので,ハードの性能向上によって勝手に性能が上がっていった訳だが,これからはマルチコアとかメニーコアが増えてマルチスレッド化しないと性能が上がらないし,コアの数が増えるとメモリバンド幅と遅延はこれまで以上にボトルネックとなるので,キャッシュコヒーレンシのトラヒックとか考えながらメモリアクセスの局所性を保つ必要がある

*2:AT&TがUCBを訴えたとばっちりかどうか知らないけど,知財の問題で絶版になってしまったのだ.だから原書はAmazonで検索しても出てこない

*3:いまさらPDP-11のアセンブラ覚える気もせず.気になってはいたのでCalderaがUNIX Version 6とかのソースコードを公開した時は,PDP-11エミュレータUNIX Version 6を動かす記事とかSDに書いたけどね.

*4:逆に,これぞ決定版ですよという話があったら教えて欲しい

*5:1:1 threadかm:n threadか,ThreadやSMPスケーラビリティをどう高めるか,Journaling File Systemをvfs層で実装するか,個別Filesystem Driverで実装するか,等々