D
AI
学习工作台
8 周后端冲刺2026-05-221 分钟阅读

进程与线程

上下文切换、死锁四条件、线程池与协程对比

8周冲刺week4操作系统进程线程记笔记标记疑惑

进程模型

每个进程有独立 虚拟地址空间、文件描述符表、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)。

知识卡片

问题

进程与线程根本区别?

点击翻转查看答案

答案

进程是资源分配单位(独立地址空间);线程是调度单位,同进程内共享地址空间与文件描述符,切换开销更小。

问题

死锁四个必要条件?

点击翻转查看答案

答案

互斥、占有且等待、不可抢占、循环等待;破坏任一可防死锁(顺序加锁、超时、银行家算法等)。

问题

用户态线程与内核线程?

点击翻转查看答案

答案

1:1 模型(Go M:N 更复杂):内核可见线程参与调度;纯用户态线程切换快但一阻塞全阻塞(Go 用多 M 规避)。