题目重点:两篇 15 分钟初筛问进程和线程区别、是否共享内存及风险;以所有权、隔离和同步说明。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 讨论典型操作系统进程与线程:同进程线程共享虚拟地址空间中的堆/全局变量,各线程有自己的栈和寄存器上下文;进程默认有隔离的地址空间。
- 进程间可显式用共享内存或 IPC 交换数据,因此‘进程绝不共享内存’过于绝对。
- 性能比较取决于负载、runtime 和通信方式,不能给普适线程一定更快的结论。
解题路线
- 先定义执行与保护边界:进程拥有地址空间/资源句柄集合,线程是进程内执行流;同进程线程共享可变堆,进程间默认需要 IPC。
- 共享的好处是传对象/队列容易、内存复制少;风险是读改写竞态、可见性、锁顺序死锁与一个线程损坏共享状态。进程隔离提高故障边界,但序列化与跨进程协调有成本。
- 列 IPC 选项:pipe/socket、消息队列、共享内存;共享内存同样需要 mutex/semaphore/原子协议,隔离不是免费同步。
- 用实际项目回答时指出哪些工作并发、状态归谁拥有、为何选线程或进程、如何测试竞态和故障恢复;不把个人项目编造成通用面试原题。
- 若与 q10 async 结合,说明 async 是调度模型、thread 是执行资源、process 是隔离边界,可以在多进程内各跑多线程 async runtime。
手动走一遍
训练例:两个线程同时做 balance=balance+1,若都先读 0 再写 1,最终为 1 而非 2。分成两个进程后,各自的 balance 默认独立,无法靠同名变量累计;若使用共享内存计数仍会有同样竞态,需原子加或锁。
规模与取舍
线程与进程创建、切换和通信成本由 OS/runtime 决定;共享线程内传引用可避免大对象拷贝,进程 IPC 可能需要序列化或映射。题目无数据规模,不能给固定速度倍数。
易错点与追问
容易失分的边界
- 说线程各有完全独立内存,忽略堆共享。
- 说进程永远不能共享内存。
- 以为共享变量读写天然原子且有序。
- 只背定义,无法映射到本人项目的同步/故障边界。
继续深挖
- 多个线程只读同一不可变对象还需要锁吗?
- 共享内存跨进程如何同步?
- 一个 worker 崩溃时线程池和进程池有何不同?
- 为何 Python CPU 工作线程的收益要看 runtime?
