多核CPU算法
多核CPU环境下的进程调度算法有哪些,与单核CPU环境下的进程调度有何不同?
多核CPU调度算法
- 全局队列调度
- 操作系统维护一个全局的任务等待队列。
- 当系统中有一个CPU核心空闲时,操作系统就从全局任务等待队列中选取就绪任务开始在此核心上执行。
- 这种方法的优点是CPU核心利用率较高。
- 局部队列调度。
- 操作系统为每个CPU内核维护一个局部的任务等待队列。
- 当系统中有一个CPU内核空闲时,便从该核心的任务等待队列中选取恰当的任务执行。
- 这种方法的优点是任务基本上无需在多个CPU核心间切换,有利于提高CPU核心局部Cache命中率。
- 目前多数多核CPU操作系统采用的是基于全局队列的任务调度算法。
单核CPU调度算法
-
FCFS调度
- 先来的任务先被执行
- 容易造成convoy effect(护航效果)
- 其余进程在等待一个大进程释放CPU,可能导致CPU和设备的使用率变低
-
优先级调度
- CPU调度程序根据任务的优先级来选择谁先被分配到资源
- 可能造成inddefinite blocking/starvation(无限等待/饥饿)
- 某个低优先级进程会被 无穷等待
- 解决方法
- ”老化” 技术: 随着进程等待时间的增加, 优先级随之增加
-
SJF调度(shortest-job-first,SJF)
- 选取CPU区间最短的任务执行
- SJF算法常用于长期调度,控制多道程序设计的程度,平衡IO和CPU的组合进程
- 不能在短期CPU调度上实现
- 抢占SJF(shortest-remaining-time-first scheduling)
- 如果有新到的进程的CPU时间 比正在执行的进程的剩余时间短,则发生抢占
-
RR调度(轮转法)
专门为分时系统设计的
时间片技术
定义一个较小的时间单元
-
为每个进程分配不超过一个时间片的CPU
- 若进程在一个时间片里结束,则释放CPU
- 若进程不能在一个时间片里结束,还是要释放CPU,并进行上下文切换,将进程加入到就绪队列的尾部
时间片的安排
时间片长度和CPU利用率不是线性相关的
-
多级队列调度
- 将ready队列分成多个独立的队列
- 举例(前后台)
-
多级反馈队列调度
- 多级队列调度算法的各各独立的队列之间的进程是不能在队列之间移动的
- 反馈队列调度可以移动
多核CPU调度算法与单核CPU调度算法对比
多核CPU的调度算法更为复杂
-
锁竞争导致串行化
- 有两个线程A和B使用同一个lock,但运行在不同的CPU核上,如果A得到了锁,则B就发生堵塞。B所在的CPU就浪费了一个CPU运行时间
-
负载均衡的区别
在单核CPU中,并不需要考虑CPU间负载均衡的问题,因为无论线程如何切换,CPU始终处于工作状态,它并不会影响程序运行的总时间。
但对于多核CPU,则一定要考虑负载均衡的问题,避免出现负载小的CPU出现空闲等待的现象。
-
任务调度策略的区别
单核CPU:保证优先级高的线程可以抢占CPU时间,先运行。在这种情况下程序员更多的是需要考虑任务的优先级。
多核CPU:不单是要考虑任务的优先级,也要考虑各个任务的耗时,使负载均衡,提高加速比和CPU效率。
-
CPUcache存取区别
- 在单核系统中,同一时刻只有一个硬件线程在执行,因此单核CPU是不存在Cache存储问题的。
- 但在多核CPU中,情况则发生了变化。问题主要是因为CPU读取Cache时是以行为单位。
- 如果两个硬件线程同时执行时,会造成两个硬件线程写同一Cache的问题,造成竞争降低效率