Dev Study
← 研修トップ

OSとカーネルの土台

第13週で「アプリとカーネルの境界」を見ました。今度はその向こう側です。カーネルはどこで動いているのか、頼んでいない割り込みがなぜ入るのか、プロセスはなぜ複製で生まれるのか。そして、同じ値を2人が書くと何が起き、書いたはずのデータがどこにいて、消したファイルがなぜ消えないのか。man-pageとkernel.orgの逐語、そして実機の出力から積み上げます。

  1. 1
    カーネルはどこで動いているのか — プロセス一覧に出ない理由
    第10期は、アプリの下でカーネルが実際に何をどう実行しているかを扱います。最初に押さえるのは、カーネルが「ずっと走り続けている常駐プログラム」ではないことです。
    約 9 分
  2. 2
    割り込み — 頼んでいないのに止められる
    ハードウェア割り込みは走っている命令列と無関係に入ります。プログラム側が依頼していないのに、実行が止められてカーネルの入口へ移ります。
    約 9 分
  3. 3
    プロセスは複製で生まれる — forkとexecが分かれている理由
    新しいプロセスは無から起動されるのではなく、既存のプロセスの複製として生まれます(`fork`)。別のプログラムにするのは中身の入れ替え(`execve`)で、これは別の呼び出しです。
    約 9 分
  4. 4
    シグナル — プログラムへの割り込み
    シグナルは、実行中のコードと無関係にプロセスへ届く通知です。シグナルごとに既定の動作が決まっていて、多くは受け取った側のコードを一行も通さずにプロセスを終わらせます。
    約 9 分
  5. 5
    ファイルディスクリプタが指しているもの — 番号の先にある表
    fd はファイルを指していません。open(2) は「fd は open file description への参照である」と書き、その open file description が「開いたファイルの表(システム全体)の1エントリ」で、オフセットとフラグはそこに記録されます。
    約 9 分
  6. 6
    同じ値を2人が書く — 「1行」が1命令とは限らない
    `count += 1` は1つの動作に見えますが、読んで・変えて・書くの3段階に分かれています。分かれているから、途中に別の実行の流れが割り込めます。
    約 9 分
  7. 7
    ロックが止まるとき — 誰も間違えていないのに進まない
    デッドロックは、待ちの関係に**輪**ができた状態です。どのスレッドも規則どおりにロックを取っているのに、全員が止まります。
    約 9 分
  8. 8
    書いたはずのデータはどこにいるか — fsyncが待っているもの
    `write` が成功を返してもディスクに届いた保証はない、は第23週で確認済みです。本レッスンはその先。`fsync` が待つのは**デバイスが転送完了を報告すること**で、しかも `fsync` しただけでは、ディレクトリの項目が届いた保証は付きません。
    約 9 分
  9. 9
    ファイルは名前ではない — 消しても消えないものがある
    ディレクトリの中の名前と、ファイルの実体(inode)は別です。名前は実体を指す参照にすぎないので、同じ実体に複数の名前を付けられますし、名前を消しても実体はすぐには消えません。
    約 9 分
  10. 10
    メモリは平らではない — 誰がどこに触るのか
    メモリを「どこを触っても同じ一枚の板」と見なすのは便利な近似であって、事実ではありません。触りに行くCPUと触られる場所の位置関係でアクセス時間が変わる構成があり(NUMA)、さらにCPU以外もメモリを読み書きします。
    約 9 分