Kernel Scheduler学习之五:RT 调度器

  1. Overview
    RT task全称为realtime task,即一种实时任务。和之前的调度器一样,本文件主要研究如下几个问题:
    什么样的task属于RT task
    RT task如何管理
    如何从一个Runqueue中选择一个task出来执行
    如何为RT task选择CPU
  2. 什么样的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
  3. 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
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值