- Overview
RT task全称为realtime task,即一种实时任务。和之前的调度器一样,本文件主要研究如下几个问题:
什么样的task属于RT task
RT task如何管理
如何从一个Runqueue中选择一个task出来执行
如何为RT task选择CPU - 什么样的task属于RT task
如下对是否是RT task的判断,可以看出,优先级小于100的即为rt task。static inline int rt_prio(int prio) { if (unlikely(prio < MAX_RT_PRIO)) return 1; return 0; } #define MAX_USER_RT_PRIO 100 #define MAX_RT_PRIO MAX_USER_RT_PRIO
- RT task如何管理呢?
需要从rt scheduler的enqueue与dequeue开始讲起。/* * Adding/removing a task to/from a priority array: */ static void enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags) { struct sched_rt_entity *rt_se = &p->rt; if (flags & ENQUEUE_WAKEUP) rt_se->timeout = 0; enqueue_rt_entity(rt_se, flags); //enqueue到rt调度器正统的queueu当中 if (!task_current(rq, p) && p->nr_cpus_allowed > 1) //可push,从这个条件判断可以看出rt中也是维护了一个可以Push的qeueue,将可以push的task放到这个queue当中去。 enqueue_pushable_task(rq, p); }
static void enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rq *rq = rq_of_rt_se(rt_se); dequeue_rt_stack(rt_se, flags); //先将原来的task dequeue,如果task已经不在runqueue当中,其实相当于什么都不做。 for_each_sched_rt_entity(rt_se) //这个地方为什么要用for each的方式呢?其实只对于CONFIG_RT_GROUP_SCHED才需要循环,而对于非CONFIG_RT_GROUP_SCHED来讲,不需要循环的。 __enqueue_rt_entity(rt_se, flags);//将当前task enqueue到rt 的runqueue当中 enqueue_top_rt_rq(&rq->rt); }
static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rt_rq *rt_rq = rt_rq_of_se(rt_se); struct rt_prio_array *array = &rt_rq->active; struct rt_rq *group_rq = group_rt_rq(rt_se); struct list_head *queue = array->queue + rt_se_prio(rt_se);//通过此处可以判断,rt task的管理为每个优先级都维护一个list,每个优先级都对应一个list。 /* * Don't enqueue the group if its throttled, or when empty. * The latter is a consequence of the former when a child group * get throttled and the current group doesn't have any other * active members. */ if (group_rq && (rt_rq_throttled(group_rq) || !group_rq->rt_nr_running)) { if (rt_se->on_list) __delist_rt_entity(rt_se, array); return; }//如果task被throttled,则不做enqueue的操作。 if (move_entity(flags)) { WARN_ON_ONCE(r
Kernel Scheduler学习之五:RT 调度器
最新推荐文章于 2022-12-29 15:29:49 发布