OSとプロセス Deep Dive
プロセス・スレッド・仮想メモリ・ファイル・システムコール・I/Oモデル、そしてNode.jsのイベントループとlibuvまで。情報系を履修していない実務エンジニアが「なぜNode.jsは1スレッドで大量の接続をさばけるのか」「なぜ本番でOOMKilledになるのか」を根拠を持って説明できるようになるための全12章。CPUシリーズの一つ上の層として、CTSSからLinux 7.x・Node.js 26までを一次情報と手元での実測で辿る
目次
- 第1章第1章: なぜWebエンジニアがOSを学ぶのか — CTSSからNode.jsまでの系譜OSの3つの役割(抽象化・資源管理・保護)と、CTSS→Unix→Linux→Node.jsへ続く歴史を辿り、全12章の地図を手に入れる→
- 第2章第2章: カーネルとシステムコール — ユーザー空間とカーネル空間の境界ユーザーモードとカーネルモード、syscall命令とvDSO、システムコールの直接コストと間接コスト、モノリシック対マイクロカーネル論争→
- 第3章第3章: プロセスの一生 — fork・exec・シグナル・ゾンビtask_struct、プロセス状態(R/S/D/Z)、forkとコピーオンライト、execとwait、シグナル、終了コード128+N、ゾンビと孤児→
- 第4章第4章: スレッドとスケジューラ — 何を共有するかがスレッドを決めるclone()の共有フラグ、コンテキストスイッチのコスト、並行と並列、CFSからEEVDFへ移ったLinuxスケジューラ→
- 第5章第5章: 仮想メモリ — RSS・VSZ・ページフォールト・OOM Killerアドレス空間とページング、TLB、マイナー/メジャーページフォールト、スワップ、オーバーコミットとOOM Killer、Node.jsのheapUsedとRSSの違い→
- 第6章第6章: ファイルとファイルディスクリプタ — Everything is a fileFDとopen file description、VFS、ページキャッシュとfsync、パイプとソケット、EMFILEとulimit→
- 第7章第7章: I/Oモデルの進化 — selectからepoll・kqueue・io_uringへ同期/非同期とブロッキング/ノンブロッキングの2軸、UNPの5モデル、readiness型とcompletion型、C10K問題とnginx→
- 第8章第8章: 並行処理モデル比較 — プロセス・スレッド・イベントループ・軽量スレッドprefork、スレッドプール、イベントループ、goroutineとVirtual Threads、async/awaitを比較し、PayPal・LinkedIn・Cloudflare・Discordの事例から選び方を学ぶ→
- 第9章第9章: Node.jsのイベントループとlibuv — 本当にシングルスレッドなのかV8・バインディング・libuvの3層構造、イベントループの各フェーズ(Node 20.3.0以降)、nextTickとマイクロタスクのCJS/ESM差、スレッドプール→
- 第10章第10章: イベントループを止めない設計 — ReDoS・巨大JSON・スレッドプール枯渇Cloudflareの2019年障害に学ぶReDoS、JSON処理、スレッドプール枯渇、worker_threads・child_process・clusterの使い分けと計測方法→
- 第11章第11章: コンテナとプロセス運用 — cgroups・OOMKilled・SIGTERM・PID 1namespacesとcgroup v2、終了コード137の正体、graceful shutdown、PID 1問題とtini、コンテナを考慮したV8のヒープ上限→
- 第12章第12章: 手を動かして確かめる — straceで覗くNode.jsと2026年の動向Docker上のstraceでNode.jsのシステムコールを観察し、スレッドプールとブロッキングを実験で確かめる。sched_ext・io_uring・Node.js 26 LTSの動向と学習ロードマップ→