进程模型
每个进程有独立 虚拟地址空间、文件描述符表、PID。fork 复制(CoW),exec 替换镜像。进程间通信:管道、消息队列、共享内存、Socket。
上下文切换:保存 PC、寄存器、栈指针,加载另一进程/线程上下文;有 CPU cache TLB 失效成本。
线程模型
线程共享代码段、堆、打开文件;各有栈与寄存器。多线程编程需同步(mutex、semaphore),见 week02-go-mutex-context。
线程池:固定 worker 处理任务队列,避免频繁创建销毁;Java ThreadPoolExecutor、Go goroutine pool 思想类似。
调度
OS 调度器:时间片轮转、优先级、CFS(Linux)。抢占:高优先级或时间片耗尽切换。
Go:GOMAXPROCS 控制并行度;goroutine 协作式 + 系统监控抢占(Go 1.14+)。
死锁与活锁
死锁:互相等待锁。预防:全局锁顺序、tryLock 超时、死锁检测。
活锁:线程不断改变状态仍无法前进(互相礼让)。饥饿:低优先级长期得不到 CPU。
与后端关联
- 一请求一线程(传统 Servlet)vs 事件驱动(Nginx、Node、Go netpoll)。
- C10K 问题:大量连接需要 epoll/kqueue + 非阻塞 IO。
- 容器:进程 namespace 隔离,看起来独立 PID 1。
对比 goroutine
| | OS 线程 | goroutine | |---|---------|-----------| | 栈 | MB 级 | KB 起 | | 创建成本 | 高 | 低 | | 调度 | 内核 | Go runtime |
面试说清:Go 并非完全无阻塞,syscall 和网络阻塞会挂起 M。
虚拟内存
细节见 week04-virtual-memory:页表、缺页、mmap 与进程地址空间关系。
实战巩固与面试表达
本篇属于 8 周冲刺 week04-os-process-thread 主题。复习时先闭卷回答 frontmatter 中三张 flashcard,再展开口述两个「为什么」:为什么这种方案能 work、边界失败时如何降级。与相邻章节对照:算法篇强调复杂度与模板,Go 篇强调工程默认写法,中间件篇强调线上故障案例。
动手与自检清单
用 25 分钟限时做 1 道相关练习题或画出一张架构/数据结构示意图;用 5 分钟写 STAR 片段说明你在项目里是否用过类似技术。记录 3 个面试追问及你的标准答法,存入 /zh/notebook/master-plan 笔记。若某点不熟,回到对应 /chapters 交互 Lab 重新走一遍流程,比死记卡片更有效。
易错点提醒
避免只背名词不会画图;避免只说优点不谈 trade-off(性能、一致性、运维成本至少提一项);避免把学习 Demo 说成百万 QPS 生产。回答时使用「场景 → 方案 → 结果 → 反思」四段式,体现工程成熟度。
自检
解释僵尸进程(子未 wait)、孤儿进程(父先死由 init 收养)。画图:两线程双锁死锁。结合 MySQL 连接线程模型(Week 5)。