B04 · 作業系統基礎(後端視角) 詳細 ROADMAP
計畫文件,不會被 Quartz 渲染。
回主 roadmap → backend/ROADMAP.md
章節目標
不是 OS 課,是「後端工程師遇到的 OS 知識」。你的 process 為什麼會被 OOM killer 殺掉?為什麼 ulimit -n 重要?Signal handling 怎麼做 graceful shutdown?Container 底層到底用了什麼 kernel feature?本章目標是讓讀者看 production incident log 能知道發生什麼事。
🌱 基本介紹
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 01 | 後端工程師該懂多少 OS | 01-what-os-for-backend | 🌱 | 從 application 層到 kernel 的邊界;要懂到哪一層夠 |
❓ 為什麼需要
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 02 | 為什麼不懂 file descriptor 會爆 | 02-why-fd-matters | 🌱 | “Too many open files” 實際案例、connection / log file / socket 都是 fd、ulimit 調多少才對 |
| 03 | 為什麼 graceful shutdown 一定要懂 signal | 03-why-signal-matters | 🌱 | K8s 送 SIGTERM → 你沒處理 → 15 秒後 SIGKILL → 流量斷、連線掉、資料不一致 |
| 04 | 為什麼 container 不是 VM | 04-why-container-not-vm | 🌱 | namespace / cgroup 機制、資源隔離程度、container escape 風險 |
🕰️ 演進
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 05 | Unix Process 模型演進 | 05-process-model-evolution | 🌱 | fork/exec → Thread pthread → lightweight thread(goroutine / M:N)→ async / coroutine |
| 06 | 容器化技術演進 | 06-container-tech-evolution | 🌱 | chroot → LXC → Docker → OCI 標準 → containerd / Podman / CRI-O |
🧠 知識型
F04-A Process / Thread
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 07 | Process vs Thread | 07-process-vs-thread | 🌱 | 記憶體共用差異、context switch cost、fork 成本、Copy-on-Write |
| 08 | Thread Pool 底層 | 08-thread-pool | 🌱 | 為什麼不要每 request 開一個 thread;Java ThreadPoolExecutor / Python concurrent.futures 底層 |
| 09 | 綠色執行緒 / 纖程(Fiber) | 09-green-thread-fiber | 🌱 | Goroutine / Erlang process / Java Project Loom 虛擬執行緒 |
F04-B IO 與 File Descriptor
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 10 | File Descriptor 深入 | 10-file-descriptor | 🌱 | fd 是什麼、process 層的 fd table、system-wide limit、為什麼 socket / file / pipe 都是 fd |
| 11 | select / poll / epoll / kqueue / io_uring | 11-io-multiplexing | 🌱 | 從 O(n) 到 O(1)、epoll LT vs ET、io_uring(2019+)改變遊戲規則 |
| 12 | Blocking vs Non-blocking IO | 12-blocking-vs-nonblocking | 🌱 | 核心差異、怎麼切 non-blocking mode、EAGAIN 怎麼處理 |
F04-C Signal
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 13 | Signal 基礎 | 13-signal-basics | 🌱 | SIGTERM / SIGKILL / SIGINT / SIGHUP / SIGPIPE、async-signal-safe、signal handler 限制 |
| 14 | Graceful Shutdown 實作 | 14-graceful-shutdown | 🌱 | 收 SIGTERM → 停止接新 request → 等舊 request 完 → 關 DB/MQ 連線 → 退出;跟 K8s readiness probe 連動 |
F04-D 記憶體管理
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 15 | Virtual Memory 基礎 | 15-virtual-memory | 🌱 | page、page fault、mmap;為什麼 free -h 數字看起來怪 |
| 16 | OOM Killer 與 cgroup memory limit | 16-oom-killer | 🌱 | OOM score、K8s container OOM、memory request/limit 怎麼設 |
F04-E 容器底層
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 17 | 容器化基礎 | ⛔️ fundamentals/containerization | 🌿 | 跨系列 |
| 18 | Linux Namespace | 18-linux-namespace | 🌱 | PID / Net / Mount / UTS / IPC / User namespace 各自隔離什麼 |
| 19 | cgroup v1 vs v2 | 19-cgroup | 🌱 | 資源限制實作、CPU / Memory / IO controller、K8s 用的版本 |
| 20 | Container Runtime 深入 | 20-container-runtime-deep | 🌱 | runc / crun / gVisor、OCI spec、K8s CRI |
🔧 小實作注意事項
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 21 | 看 process 狀態(/proc) | 21-proc-filesystem | 🌱 | /proc/{pid}/status、fd、maps、常用診斷方式 |
| 22 | 用 strace 抓 syscall | 22-strace | 🌱 | 查「卡在哪」、看 file / network syscall、Docker 內 strace 問題 |
| 23 | 用 lsof 查檔案 / socket | 23-lsof | 🌱 | 找誰占用某 port、查 fd 洩漏 |
| 24 | 實作一個 graceful shutdown(跨語言) | 24-graceful-shutdown-impl | 🌱 | Go / Python / Node.js / Java 各自實作 |
💣 Anti-pattern
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 25 | OS-level Anti-patterns | 25-os-antipatterns | 🌱 | ulimit -n 沒調(預設 1024 根本不夠)、沒處理 SIGPIPE(寫斷掉 socket 整個程式崩)、子 process spawn 完沒 wait 變 zombie、container 跑 root、memory limit 忘設、container 不做 process reaper(PID 1 問題) |
🧰 對應檢查工具
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 26 | OS 診斷工具 | 26-os-diagnostic-tools | 🌱 | top / htop、iotop、vmstat、sar、pidstat、strace、lsof、ss、bpftrace / bcc / eBPF |
📎 補充
| # | 主題 | Slug | Stage | 大綱 |
|---|
| S01 | eBPF 給後端工程師 | s01-ebpf-for-backend | 🌱 | 為什麼 2020+ 後端運維界瘋 eBPF、實戰工具(bpftrace / Cilium / Pixie) |
| S02 | Linux Cgroup v2 的 K8s 影響 | s02-cgroup-v2-k8s | 🌱 | 為什麼 K8s 1.25+ 推 cgroup v2、memory behavior 變化 |
章節進度統計
- 知識主題:26 + 2 補充 = 28 項
- 🌿 growing:1(跨系列)
- 🌱 seed:27
跨系列連結
- →
fundamentals/containerization
- →
backend/deployment/ B18(container / K8s)
- →
backend/observability/ B17(eBPF trace)
- →
infra/ 容器相關