HMP调度器
为了降低功耗,ARM开发了大小核架构处理器。Linux内核中的负载均衡算法基于SMP模型,并未考虑big.LITTLE模型,因此Linaro开发了一个HMP调度器用于支持这种架构,它也被用于Android 5.x和Android6.x中,但这种调度器并没有被合入内核的基线中。
该调度器的进程调度算法基本上和CFS一样,主要区别在于调度域和负载均衡的处理上。HMP调度域的实现比自带的CFS调度器要简单的多,首先它只包含两个调度域,大核调度域和小核调度域,也不考虑这两个调度域之间的负载均衡问题,没有调度组和调度能力的概念,调度域也没有拓扑层次关系。它的主要工作原理是:
(1)检测小核调度域,如果有繁重的任务(最重的),就迁移到大核调度域中的空闲CPU上(idle CPU)。
(2)检测大核调度域,如果有简单的任务(最轻的),就迁移到小核调度域中的空闲CPU上(idle CPU)。
它的主要复杂点就是如何界定这里的繁重任务和简单任务,HMP使用load_avg_ratio来表示进程负载的轻重:
load_avg_ratio = runnable_avg_sum * 1024 / runnable_avg_period
这和CFS中的默认算法是有区别的,这里的进程负载不再于各进程的权重有关了,而只和两个参量相关。
可迁移的大任务对应的负载要高于:hmp_up_threshold = 700 (runnable_avg_sum / runnable_avg_period > 68.3%)
可迁移的小任务对应的负载要低于:hmp_down_threshold = 512 (runnable_avg_sum