- 协同调度
任务之间如果具有依赖关系,那么先执行完的任务依然还要等待它所依赖的任务执行完,协同调度希望让一组任务并行执行
群组调度:把关联的任务设置成一组,以组为单位调度任务在多个CPU核心上执行,使开始和结束时间接近相同,如果有4个核,任务有A1-4,B1-2,C1-6,那么A1-A4先为一组执行,然后B1-2,C1-2为一组,C3-6为一组。群组调度在特殊场景中性能优秀,但场景不匹配时会让无关任务同时进入和退出cpu - 两级调度
因为全局调度器会让任务在不同CPU之间切换,故为每个CPU引入本地调度器
当一个任务进入os,全局调度器根据每个核心负载情况决定哪个cpu执行,然后该任务会一直被本地调度器管理,不会迁移到其它cpu - 负载追踪和负载均衡
运行队列粒度负载追踪:以运行队列的长度为负载的依据,越长越高
调度实体粒度负载追踪:调度器以1024微秒为一个周期,记录任务的正在运行及等待运行的时间x微秒,该任务在第i个周期里对当前cpu利用率为x/1024,负载为scale_cpu_capacity(CPU核心处理能力)*x/1024。并且计算L的方法时根据衰减系数y来算之前周期的负载
负载均衡:CPU的核心之间是不同的,所以尽量要往迁移开销小的cpu转移
linux中使用调度域(相似特性的CPU核心的集合),调度组(一个调度域里面进行负载均衡的整体单位)两个数据结构,其中两个逻辑核组成逻辑CPU域,两个物理核组成物理CPU域,物理CPU组成NUMA域(非一致内存访问)。而每次迁移都会先从较小的域进行迁移,然后再往高层次
- 能耗感知调度EAS
能量模型:
- 容量:当前CPU核心在当前频率下的处理能力,这是一个相对的概念,linux把整个系统中处理能力最强的核心在最高频率下的容量设为1024,故其它核心可以相对地设置容量
- 功率:当前cpu在当前频率的功率,单位mw
系统的cpu核心被划分为多个 性能域,同一个性能域用同一个模型。一个模型有多个性能操作点,核心的频率只能在操作点给定的频率中切换