一本书讲透Java线程:原理与实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3.5 整体任务调度

接下来详细地讲解一下任务的整体调度策略。CPU的任务队列结构如图1-11所示。

图1-11 CPU任务队列结构

每个CPU都有自己的任务运行队列(runqueue)。任务调度就是将需要执行的任务加入runqueue中。runqueue中所有任务的状态都是TASK__RUNNING。同时在runqueue的前面设计了3种任务队列:dl_rq、rt_rq、cfs_rq。dl_rq是SCHED_DEADLINE调度策略的任务队列,rt_rq是实时任务的调度队列,cfs_rq是普通任务的公平调度队列。Linux内核为每个具体的任务队列设置了不同的调度类(Scheduling Class)。CPU调度顺序的详细信息如表1-5所示。

表1-5 CPU调度顺序

每次任务调度的时候,Linux都会从Deadline开始调度,按照调度器优先级(Deadline>Realtime > Fair)运行任务调度器,完成对应的任务调度。也就是先从dl_rq中选择任务去执行,如果dl_rq没有任务,才会从rt_rq里选择任务执行,所以实时任务总是会比普通任务先得到执行。