题目重点:进程隔离资源与虚拟地址空间,线程共享进程内存但有独立执行上下文;比较切换、通信与故障边界。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 按普通操作系统用户态进程/线程回答;某些语言的‘线程’可能是绿线程、协程或 runtime 任务,应先确认术语。
解题路线
- 进程通常有独立虚拟地址空间、页表和资源句柄命名空间;线程属于某进程,共享地址空间与多数进程资源,但各自有寄存器、程序计数器和栈。
- 线程共享使传递指针/对象便捷,也使数据竞争、锁顺序、内存可见性成为问题;进程间通过 pipe/socket/shared memory 等 IPC,隔离更强但序列化/权限管理成本可能高。
- 线程切换不一定比进程切换始终快:成本取决于内核调度、地址空间/TLB、缓存局部性和工作负载;不能给绝对毫秒值。一个线程崩溃/内存破坏常可能影响整个进程,进程隔离可限制故障范围。
- 选择模型按隔离、安全、资源边界、共享状态复杂度和扩缩容需求:浏览器/服务多进程可隔离失败,单服务内部多线程可并行 CPU/IO,但仍要同步。
手动走一遍
两个线程同时给共享计数器 `count += 1`,读改写可能丢增量,需要锁/原子操作;两个独立进程各有自己的 count,不会直接互相覆盖,但若用共享内存仍需同步。
规模与取舍
本题没有单一 Big-O;共享内存操作可低复制,但锁争用/缓存一致性成本随线程数和写热点增长;IPC 消息成本随数据大小和复制/序列化变化。具体数值需基准测试。
易错点与追问
容易失分的边界
- 说线程完全不占独立内存,忽略栈。
- 说进程绝不共享内存,忽略 shared memory。
- 说线程切换一定比进程切换快。
- 把协程等同 OS 线程。
- 共享对象并发更新无同步。
继续深挖
- 线程间栈和 heap 哪些共享?
- 进程共享内存后还算隔离吗?
- 多线程 CPU 密集任务如何受语言 runtime 限制?
- 崩溃隔离如何影响服务部署?
