步骤 7 / 7
多核:每个核心各自轮转
有多个核心时,每个核心有自己的运行队列,调度器还要在核心之间搬任务。
多核上,几个程序是真的同时在跑,但每个核心内部仍然在分时轮换。 Linux 给每个核心一条运行队列,忙的核心会把任务“分”给闲的核心(负载均衡)。 但任务搬到别的核心后,原来缓存里的数据用不上了,所以调度器倾向让任务留在原核心(亲和性),taskset 可以手动指定。
操作系统
一个 CPU 核心同一时刻只能跑一个程序,Linux 靠快速轮换制造“同时运行”的效果。
以一个 CPU 核心上轮流运行两个程序为例。
步骤 7 / 7
有多个核心时,每个核心有自己的运行队列,调度器还要在核心之间搬任务。
多核上,几个程序是真的同时在跑,但每个核心内部仍然在分时轮换。 Linux 给每个核心一条运行队列,忙的核心会把任务“分”给闲的核心(负载均衡)。 但任务搬到别的核心后,原来缓存里的数据用不上了,所以调度器倾向让任务留在原核心(亲和性),taskset 可以手动指定。
| 当前状态 | 发生了什么 |
|---|---|
| A 运行中 | 程序 A 正在使用 CPU |
| 进入内核态 | 时钟到点,CPU 陷入内核 |
| 内核态 | 保存程序 A 的上下文 |
| 内核态 | 调度器选中程序 B |
| 调度 | 按策略挑选下一个 |
| B 运行中 | 切回用户态,程序 B 继续运行 |
| 负载均衡 | 在核心间迁移任务 |