进程分为实时进程和普通进程,分别对应实时调度策略和普通调度策略。
普通调度策略主要采用完全公平调度算法(CFS)。这个算法运行逻辑是:
CPU为每一个进程安排一个虚拟运行时间(vruntime)。这样随着运行时间的增长,vruntime也会不断增长,而CPU就会优先去运行vruntime小的进程,这样就做到了基本完全公平。而根据设定的优先级的不同,vruntime+=时间运行时间*NICE_0_LOAD/权重。
想要实现完全公平调度就需要一个调度队列和调度实体。CFS的调度队列排序算法采用的红黑树的数据结构。调度实体叫做sched_entity。
CPU调度队列叫做rq,分为rt_rq和cfs_rq,对应实时调度队列和公平调度队列。
调度类会优先调用实时调度队列的调度实体,当没有实时调度实体时才会去调用普通调度实体。