信息技术大学
进程与线程
计算机基础面试八股 · 第 2 章 操作系统
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
信息技术大学
进程与线程
计算机基础面试八股 · 第 2 章 操作系统
进程与线程的区别与选型
进程是资源分配的单位,线程是调度的单位:要隔离用进程,要轻量并发用线程。
进程
独立地址空间与资源,崩溃互不传染
线程
共享进程资源,切换轻,通信免拷贝
共享边界
线程共享堆与全局量,栈各自私有
选型
隔离容错用多进程,并发密度用多线程
多进程与多线程
并发的两个流派,隔离与效率各有胜负。
多进程
- 隔离好,一个崩不连累其他
- 创建切换与通信成本高
- Chrome、Nginx 的选择
多线程
- 共享内存,通信零拷贝
- 切换轻量,并发密度高
- 一崩全损,需锁护共享数据
隔离与效率的取舍:浏览器用进程保命,服务端用线程提效。
进程状态与转换
三态是骨架:就绪排队等 CPU,运行正在执行,阻塞等 IO 去了另一条队伍。
三态
就绪、运行、阻塞,转换由调度与事件驱动
挂起态
内存吃紧时进程被换出到外存暂停
僵尸态
子进程退出而父进程未收割,残留退出信息
上下文切换成本
切换不是免费的:寄存器、内核栈、缓存全要换,频繁切换吃掉算力。
直接成本
保存恢复寄存器,切换内核栈与页表
间接成本
CPU 缓存与 TLB 失效,隐性开销更大
量级感知
进程切换贵过线程,频繁切换毫秒可见
协程与用户态调度
协程把调度搬进用户态:切换不走内核,一个线程扛起十万并发任务。
用户态切换
不进内核,保存恢复几个寄存器即完成
协作式
让出点由代码显式安排,无需内核介入
IO 挂起
遇 IO 主动让出执行权,适合 IO 密集
代表
Go goroutine、Python asyncio、Kotlin 协程
本节要点
- ✓进程隔离资源,线程共享轻量
- ✓就绪/运行/阻塞三态是骨架
- ✓切换成本:寄存器显性,缓存隐性
- ✓协程用户态切换,IO 密集利器
延伸主题:写个多线程计数器踩坑看看 Go 调度器 GMP
课后思考
先自己回答,再展开参考答案——能讲出来才算真懂。
1浏览器为什么用多进程而不是多线程隔离标签页?
参考答案标签页跑的是不可信的第三方代码,必须硬隔离:进程崩溃或被攻破不殃及其他页面;多线程共享内存,一个越界写就全盘皆输。安全边界优先于资源效率。
2线程切换为什么比进程切换便宜?
参考答案同进程线程共享地址空间,切换不必换页表,TLB 与缓存大多保得住;进程切换要换地址空间,页表、缓存全冷,那才是开销大头。
3协程为什么不适合 CPU 密集型任务?
参考答案协程是协作式调度,让出点由代码显式安排;CPU 密集循环不让出,同一事件循环里的其他任务全被饿死。CPU 密集应交给多进程/多线程的抢占式调度。