---
type: article
title: OSの内部構造を何故，どうやって勉強するか
timestamp: 2006-05-07T00:00:00Z
profile: sorane-okf/0.1
noFontEmbedding: true
---

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

<p>デバドラとか組込系の仕事をしたいというのでない限り，いまどきOSについて詳しくても困ることはないんだけど，やはり基本的なことは知っておいた方がいい．<a href="#f-54e30149" name="fn-54e30149" title="サーバー運用の現場でパラメータ設定とかする時に役に立ったり，JavaやC#でもThreadは自分で切らなくちゃならないし，未だに再現性の低い面倒なバグというとThreadの競合だったりするのであって，JavaやC#が言語仕様としてThreadをどう扱っているか，それが実行環境の下でどうハンドリングされているかとか，知っておくおくに超したことがない．性能チューニングの面でも，これまでMPUはパイプラインを深くしてクロックを高くする方向だったので，ハードの性能向上によって勝手に性能が上がっていった訳だが，これからはマルチコアとかメニーコアが増えてマルチスレッド化しないと性能が上がらないし，コアの数が増えるとメモリバンド幅と遅延はこれまで以上にボトルネックとなるので，キャッシュコヒーレンシのトラヒックとか考えながらメモリアクセスの局所性を保つ必要がある">*1</a>とはいえ，ここ数年で学習環境が大幅に改善したとはいえ選択肢が増えすぎて，何から手をつけていいか却って分かりにくくなった感がある．<br />
僕が学ぼうとした1990年代後半は，教科書というと『<a href="http://d.hatena.ne.jp/asin/4894710471/mkusunokhaten-22">オペレーティングシステム―設計と理論およびMINIXによる実装</a>』とか『<a href="http://d.hatena.ne.jp/asin/4891000309/mkusunokhaten-22">インサイド WINDOWS NT 第2版 (マイクロソフト公式解説書)</a>』だった．会社には当時は幻だった<a href="#f-595aaf6a" name="fn-595aaf6a" title="AT&TがUCBを訴えたとばっちりかどうか知らないけど，知財の問題で絶版になってしまったのだ．だから原書はAmazonで検索しても出てこない">*2</a>『<a href="http://d.hatena.ne.jp/asin/4756118445/mkusunokhaten-22">Lions’ Commentary on UNIX (Ascii books)</a>』の原書とかも置いてあったし，何となく眺めて「あー昔はこんなに見通しが良かったのか」と感動したけど，<a href="#f-3ddaf556" name="fn-3ddaf556" title="いまさらPDP-11のアセンブラ覚える気もせず．気になってはいたのでCalderaがUNIX Version 6とかのソースコードを公開した時は，PDP-11エミュレータでUNIX Version 6を動かす記事とかSDに書いたけどね．">*3</a><br />
長文エントリになったんで先に結論を書いちゃうと，今日ぼくが調べた範囲だと<a class="keyword" href="http://d.hatena.ne.jp/keyword/FreeBSD">FreeBSD</a>を入れて『<a href="http://d.hatena.ne.jp/asin/4756146791/mkusunokhaten-22">BSDカーネルの設計と実装―FreeBSD詳解</a>』を読むのが一番シアワセになれそうな気がする．ここは是非<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>派の反論＆情報が欲しいところ．

<br />
言語の話の続きで学習に適したOSについて考えようとしたんだけど，なかなか難しい．いまどきの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>の内部構造ってどの本を読めば分かるんだろう．<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>って<a class="keyword" href="http://d.hatena.ne.jp/keyword/Slackware">Slackware</a>の頃まではLoadable Kernel Moduleの仕掛けが成熟してなかったこともあって，誰もがハード構成に合わせて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>を再構築するのが当たり前だったし，新しい<a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>でビルドしたり<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>オプションを変えてみたり，あとサーバーとして運用するにはファイル<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%B9%A5%AF%A5%EA%A5%D7%A5%BF">ディスクリプタ</a>の数とか諸々を書き換えたり，あちこちから集めた<a class="okeyword" href="g:mohican:keyword:パッチ">パッチ</a>を適用して遊んだものだけど，気付いたら<a class="keyword" href="http://d.hatena.ne.jp/keyword/Fedora">Fedora</a>なんか，最近どうインストールしても/usr/src以下が空だったりするしね．いちいちsrc.<a class="keyword" href="http://d.hatena.ne.jp/keyword/rpm">rpm</a>を展開して<a class="okeyword" href="g:mohican:keyword:ソース">ソース</a>を眺めたり，自分で再ビルドする奴ってどれくらいいるんだろう．本家のtarball引っ張って再構築すると，却ってハマるのが目に見えているし．<br />
そういう意味で，ビルドシステムがシステム管理者による<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>再構築を念頭に置いている*<a class="keyword" href="http://d.hatena.ne.jp/keyword/BSD">BSD</a>の方がまだ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>は身近だ．けど，<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>構造の奥まで解説した<a class="keyword" href="http://d.hatena.ne.jp/keyword/BSD">BSD</a>本の多くは旧過ぎる．<a class="keyword" href="http://d.hatena.ne.jp/keyword/NetBSD">NetBSD</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/OpenBSD">OpenBSD</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mach">Mach</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>を捨ててしまったし，<a class="keyword" href="http://d.hatena.ne.jp/keyword/FreeBSD">FreeBSD</a>もマトモにSMPをサポートするために大幅に書き換わってしまった．<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0">ファイルシステム</a>も昔のUFSからは激変してるし．<span style="font-weight:bold;">とか思ってたら，いつの間に『<a href="http://d.hatena.ne.jp/asin/4756146791/mkusunokhaten-22">BSDカーネルの設計と実装―FreeBSD詳解</a>』なんて本が出ていたのか．</span>この本は良さげだ．こんど探してみよう．<br />
<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Darwin">Darwin</a>のkernel sourceがビルド可能なかたちで公開されて，<a class="keyword" href="http://d.hatena.ne.jp/keyword/x86">x86</a>への移行と<a class="keyword" href="http://d.hatena.ne.jp/keyword/Parallels">Parallels</a>の登場で<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>上でゲストOSとして<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>を動かしてデバッガにかけるのが楽になった気がするけど，いい教科書がない．<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mach">Mach</a> 3.0ベースといっても，<a class="keyword" href="http://d.hatena.ne.jp/keyword/UNIX">UNIX</a>サブシステムを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>内の関数呼び出しに戻してしまっていたりとか<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mach">Mach</a>の教科書を読めばいい感じでもないし．<br />
up to dateな教科書の充実という点では最近『<a href="http://d.hatena.ne.jp/asin/4891004738/mkusunokhaten-22">インサイド MS WINDOWS 第4版 上 (マイクロソフト公式解説書)</a>』『<a href="http://d.hatena.ne.jp/asin/4891004746/mkusunokhaten-22">インサイド MS WINDOWS 第4版 下 (マイクロソフト公式解説書)</a>』が出た<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>もなかなかいいのだが，いかんせんデバッガで<a class="okeyword" href="g:mohican:keyword:ソース">ソース</a>コードを追えないと，OSの勉強というのは実感が湧かないじゃない．どーせkernel coreだけ公開したって丸ごとパチられることもないだろうし，"<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> Research Kernel"といって，研究用途ではライセンスも緩くなってるんだから，個人的にはkernel sourceを<a class="keyword" href="http://d.hatena.ne.jp/keyword/DDK">DDK</a>の一部として<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>デバッガから参照できるかたちで配ったらどうだろう，とか思うのだが...<br />
とゆー訳で仮想化環境の普及とか，書籍の充実とか，諸々の面でOS内部環境の学習インフラは向上しているかにみえて，どれも細かく検討してみると帯に短し襷に長しという気がしないでもない．<a href="#f-6408bd29" name="fn-6408bd29" title="逆に，これぞ決定版ですよという話があったら教えて欲しい">*4</a>ただ，学習環境がないから勉強できないのか勉強したいひとが少ないから本にならないのか微妙なところだ．<br />
<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>とか<a class="keyword" href="http://d.hatena.ne.jp/keyword/BSD">BSD</a>界隈をみていると，細かいところで面白い論争<a href="#f-a4c3c72f" name="fn-a4c3c72f" title="1:1 threadかm:n threadか，ThreadやSMPスケーラビリティをどう高めるか，Journaling File Systemをvfs層で実装するか，個別Filesystem Driverで実装するか，等々">*5</a>が色々とあるんだけど，やっぱり<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>周りの話題って総じて地味なんだよね．<a class="keyword" href="http://d.hatena.ne.jp/keyword/BSD">BSD</a> vs. System Vとか<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linus">Linus</a> - タンネンバウム論争くらいまでが華でさ．<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%AF%A5%ED%A5%BD%A5%D5%A5%C8">マイクロソフト</a>も<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%2095">Windows 95</a>とかNT 4.0くらいまでは「9xの実装をプリエンプティブ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%EB%A5%C1%A5%BF%A5%B9%A5%AF">マルチタスク</a>と呼んでいいのか」とか「NT 4.0でGDIをkernel modeに持って行ったのは理解できない」とか好事家の間で下らない話題の種になってたんだけど「<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%20Vista">Windows Vista</a>ではスケジューラのデータ構造をいじって云々」とか，誰も話題にしているのを聞いたことがない．NGSCBがちゃんと実装されればTCBの信頼モデルってどうよとか，話題に華が咲いたのかも知れないけどさ．<br />
たぶん諸々の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%AF%A5%ED%A5%AB%A1%BC%A5%CD%A5%EB">マイクロカーネル</a>とか<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AC%BB%B6OS">分散OS</a>が商業的には成功しなかったあたりから，OS研究って地味だよね的な雰囲気が醸成されたのかな．身の回りの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CF%A5%C3%A5%AB%A1%BC">ハッカー</a>達をみていても，まだOS研究が輝いていた時代に勉強された世代の方々が多い<a class="okeyword" href="g:mohican:keyword:ような気がする">ような気がする</a>．それはこう，ルータ技術者のコミュニティに顔を出しても感じたりするのだが... という訳でOSって地味に進化してるけど，基本は20〜30年前からあまり変わってないし，勉強したくなる誘因ってあるのだろうか，研究して何か大きな進歩を勝ち取る機会ってあるのだろうか，ということが問題だったりする．</p>
<div class="footnote">
<p class="footnote"><a href="#fn-54e30149" name="f-54e30149" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">サーバー運用の現場でパラメータ設定とかする時に役に立ったり，<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%23">C#</a>でもThreadは自分で切らなくちゃならないし，未だに再現性の低い面倒なバグというとThreadの競合だったりするのであって，<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%23">C#</a>が言語仕様としてThreadをどう扱っているか，それが実行環境の下でどうハンドリングされているかとか，知っておくおくに超したことがない．性能チューニングの面でも，これまで<a class="keyword" href="http://d.hatena.ne.jp/keyword/MPU">MPU</a>はパイプラインを深くしてクロックを高くする方向だったので，ハードの性能向上によって勝手に性能が上がっていった訳だが，これからはマルチコアとかメニーコアが増えてマルチスレッド化しないと性能が上がらないし，コアの数が増えるとメモリバンド幅と遅延はこれまで以上に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DC%A5%C8%A5%EB%A5%CD%A5%C3%A5%AF">ボトルネック</a>となるので，キャッシュコヒーレンシの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%D2%A5%C3%A5%AF">トラヒック</a>とか考えながらメモリアクセスの局所性を保つ必要がある</span></p>
<p class="footnote"><a href="#fn-595aaf6a" name="f-595aaf6a" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a class="keyword" href="http://d.hatena.ne.jp/keyword/AT%26T">AT&T</a>がUCBを訴えたとばっちりかどうか知らないけど，<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C3%CE%BA%E2">知財</a>の問題で絶版になってしまったのだ．だから原書は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Amazon">Amazon</a>で検索しても出てこない</span></p>
<p class="footnote"><a href="#fn-3ddaf556" name="f-3ddaf556" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">いまさら<a class="keyword" href="http://d.hatena.ne.jp/keyword/PDP">PDP</a>-11の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%E9">アセンブラ</a>覚える気もせず．気になってはいたのでCalderaが<a class="keyword" href="http://d.hatena.ne.jp/keyword/UNIX">UNIX</a> Version 6とかの<a class="okeyword" href="g:mohican:keyword:ソース">ソース</a>コードを公開した時は，<a class="keyword" href="http://d.hatena.ne.jp/keyword/PDP">PDP</a>-11<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%DF%A5%E5%A5%EC%A1%BC%A5%BF">エミュレータ</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/UNIX">UNIX</a> Version 6を動かす記事とかSDに書いたけどね．</span></p>
<p class="footnote"><a href="#fn-6408bd29" name="f-6408bd29" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">逆に，これぞ決定版ですよという話があったら教えて欲しい</span></p>
<p class="footnote"><a href="#fn-a4c3c72f" name="f-a4c3c72f" class="footnote-number">*5</a><span class="footnote-delimiter">:</span><span class="footnote-text">1:1 threadかm:n threadか，ThreadやSMPスケーラビリティをどう高めるか，Journaling File Systemを<a class="keyword" href="http://d.hatena.ne.jp/keyword/vfs">vfs</a>層で実装するか，個別Filesystem Driverで実装するか，等々</span></p>
</div>
