步骤 6 / 7
恢复另一个程序,以及切换的代价
内核载入 B 的存档并回到用户态;但切换并不免费。
内核恢复 B 的现场并返回用户态,B 接着跑,直到下一次被打断或自己去等待。 每次切换都要存档、读档,还会让 CPU 缓存“变冷”。 切换分两种:程序自己去等 I/O 是“主动”的,时间片用完被换下是“被动”的,/proc 里能分别看到。
操作系统
一个 CPU 核心同一时刻只能跑一个程序,Linux 靠快速轮换制造“同时运行”的效果。
以一个 CPU 核心上轮流运行两个程序为例。
步骤 6 / 7
内核载入 B 的存档并回到用户态;但切换并不免费。
内核恢复 B 的现场并返回用户态,B 接着跑,直到下一次被打断或自己去等待。 每次切换都要存档、读档,还会让 CPU 缓存“变冷”。 切换分两种:程序自己去等 I/O 是“主动”的,时间片用完被换下是“被动”的,/proc 里能分别看到。
| 当前状态 | 发生了什么 |
|---|---|
| A 运行中 | 程序 A 正在使用 CPU |
| 进入内核态 | 时钟到点,CPU 陷入内核 |
| 内核态 | 保存程序 A 的上下文 |
| 内核态 | 调度器选中程序 B |
| 调度 | 按策略挑选下一个 |
| B 运行中 | 切回用户态,程序 B 继续运行 |