王道操作系统笔记,视频链接:2.2.6 多处理机调度
知识总览
- 多处理机调度:
- 与单处理机调度相比,需要面临哪些新问题?
- 方案一:公共就绪队列
- 方案二:私有就绪队列
多处理机遇到问题
- 单处理机调度:只需决定让哪个就绪进程优先上处理机即可。
- 调度算法:先来先服务、最短作业优先、时间片轮转、优先级等
- 多处理机调度:
- ①用调度算法决定让哪个就绪进程优先上处理机;
- ②还需决定被调度的进程到底上哪个处理机。
负载均衡、处理亲和性
- 多处理机调度中,应追求的目标:
- 负载均衡——尽可能让每个CPU都同等忙碌。
- 比如四个CPU分别负载50%、80%、80%、90%,此时CPU1太过“空闲”,CPU4太过“忙碌”,这就不太符合负载均衡。
- 处理机亲和性——尽量让一个进程调度到同一个CPU上运行,以发挥CPU中缓存(Cache)的作用
- 比如CPU4上存在P4、P8、P12、P16的缓存,那么后续需要运行这些程序时,直接在CPU4上运行就可以利用这些缓存,如果把P4上没有P4缓存的CPU1运行,那么就会有更多的访问主存的动作,效率自然更低。
- PS:(来自deepseek)缓存数据的有效停留时间,本质上是该进程与其他进程竞争缓存空间的激烈程度——核心越忙、进程占用缓存越多、缓存本身越小,数据被覆盖得就越快。
- 负载均衡——尽可能让每个CPU都同等忙碌。
公共就绪队列
- 定义:将系统内所有进程放在统一的就绪队列中。
- 特点:
- 所有CPU共享一个就绪队列进程(位于内核区)
- 每个CPU运行调度程序(与单处理机一样,比如FCFS、SJF、RR等,控制优先级),从公共就绪队列中选择一个进程运行
- 比如:CPU1空闲了,启动调度程序,选择了P1上处理机运行,其它CPU同理,它们都是并行运行。
- 为了确保各CPU间对就绪队列的访问互斥(防止多个CPU同时调用同一个进程),在对就绪队列的访问期间,需要对就绪队列上锁
- 优缺点:
- 优点:可以天然地实现负载均衡
- 缺点:各进程频繁地切换CPU运行,“亲和性”不好
- 如何提升处理机亲和性?
- 软亲和:由进程调度程序尽量保证“亲和性”
- 也就是让调度程序尽可能调度存在缓存的进程
- 硬亲和:由用户进程通过系统调用,主动要求操作系统分配固定的CPU,确保“亲和性”
- 软亲和:由进程调度程序尽量保证“亲和性”
私有就绪队列
- 定义:顾名思义,操作系统会为每个CPU配一个就绪队列
- 特点:
- 每个CPU都有一个私有就绪队列
- CPU空闲时运行调度程序,从私有就绪队列中选择一个进程运行
- 各CPU的调度程度只会从自己的私有队列中挑选优先级最高的进程
- 如何实现负载均衡?
- 推迁移(Push)策略:
- 一个特定的系统程序周期性检查每个处理器的负载,如果负载不平衡,就从忙碌CPU的就绪队列中“推”一些就绪进程到空闲CPU的就绪队列。
- 比如:负责周期检查的系统程序检查到CPU4的负载较高,CPU1的负载较低,就可以把CPU4就绪队列中的某一个进程“推”给负载较低的CPU1,以实现负载均衡。
- 类似于有一个包工头专门负责派活
- 拉迁移(Pull)策略:
- 每个CPU运行调度程序时,周期性检查自身负载与其它CPU负载。如果一个CPU负载很低,就从其它高负载CPU的就绪队列中**“拉”一些就绪进程到自己的就绪队列**。
- 比如:每执行10次调度程序,CPU1就检查一下自己和其它CPU负载,此时发现自己负载较低,CPU4负载较高,就主动把CPU4就绪队列中的某些就绪进程“拉”到自己的队列。
- 类似于一群互帮互助的同事(看到其他同事很忙,就主动揽活过来,分担任务)
- 推迁移(Push)策略:
- 如何实现处理机亲和性?
- 私有就绪队列天然地实现了“处理机亲和性”。
- 因为一段时间内,CPU总会调度自己队列中的进程,所以这些进程在一段时间内总是上同一个CPU运行,这样就能发挥Cache的作用。
- 由于推拉策略,可能导致部分进程移动到其他CPU上处理,此时会损失部分“处理机亲和性”,但是依然可以由用户进程通过系统调用,主动要求操作系统分配固定的CPU,实现硬亲和。
- 私有就绪队列天然地实现了“处理机亲和性”。