如果为所有程序设计的是静态优先级,那么天生的弊端就是低优先级任务饿死。所以在设计调度策略的时候,考虑动态优先级是必不可少的。本文简单说明一下动态优先级
通常一个程序包含两种情况
而这两种情况并不代表着程序一直都是,而是在运行过程中切换的。也就是一个任务一会儿是CPU密集型,一会儿是IO密集型。我们应该在不同情况下为其设置不同的优先级情况。通常来说,对于IO密集型的任务,应该将其优先级设置较高,让其立马能够将任务推向IO去处理,而对于CPU密集型任务,应该将其优先级稍微降低,从而保证IO型的任务不会出现饿死的情况。
这样,我们可以构造一个公式如下

因为在100-140优先级范围内,越高代表越优先级越低,此公式的关键点在于bonus值,这个值是等待IO的时间。也就是说,一个任务等待IO时间越长,那么其整体优先级会更高。
在多核系统上,为了避免大小脚的问题,也就是某个核心任务过重,而其他核心任务太轻,所以需要进行负载均衡。首先,我们知道现在runqueue是per-CPU的,所以当任务从一个CPU迁移到另一个CPU的时候,那么此任务相当于也是在做动态优先级调整。这种调整的目的是为了CPU的负载更均衡
在Linux上通过PELT计算负载,其思路是在一个任务开始运行的时候,先判断CPU的负载情况,如果当前CPU负载较高,则将其迁移到负载低的那个CPU队列上运行。
PELT的量化负载公式如下

实际算力公式:

在安卓平台,可能会采用WALT
https://static.linaro.org/connect/sfo17/Presentations/SFO17-307%20WALT%20vs%20PELT.pdf