Scheduler 学习之二:主调度器_schedule函数

Flow static void __sched notrace __schedule(bool preempt){ struct task_struct *prev, *next; unsigned long *switch_count; struct rq_flags rf; struct rq *rq; int cpu; cpu = smp_processor_id(); rq = cpu_rq(cpu); prev = rq->curr;//现在的将变成过往 .
摘要由CSDN通过智能技术生成
  1. Summary
    1.1 _schedule函数是又被称作为主调度器,负责选择新的task run到当前的cpu当中
    1.2 _scheduler将选核的功能交给各调度类完成
    1.3 pick_next_task提供了一个优化功能 :假定fair class中的Task数量与rq 中一致,刚直接从fair class中选即可
    1.4 主调度器起作用的时间主要是在task切换的时候,例如,抢锁抢不到,或者初始开启抢占,以及从kernel space回到user space
  2. Flow
     
    static void __sched notrace __schedule(bool preempt)
    {
    	struct task_struct *prev, *next;
    	unsigned long *switch_count;
    	struct rq_flags rf;
    	struct rq *rq;
    	int cpu;
    
    	cpu = smp_processor_id();
    	rq = cpu_rq(cpu);
    	prev = rq->curr;//现在的将变成过往
    
    	schedule_debug(prev, preempt);//此函数检查当前调用schedule是否合适,如不能在原子上下文(即抢占被关闭的情况下)中调用schedule,栈崩溃等.
    
    	if (sched_feat(HRTICK))
    		hrtick_clear(rq);
    
    	local_irq_disable();
    	rcu_note_context_switch(preempt);//通知RCU的相关操作
    
    	/*
    	 * Make sure that signal_pending_state()->signal_pending() below
    	 * can't be reordered with __set_current_state(TASK_INTERRUPTIBLE)
    	 * done by the caller to avoid the race with signal_wake_up().
    	 *
    	 * The membarrier system call requires a full memory barrier
    	 * after coming from user-space, before storing to rq->curr.
    	 */
    	rq_lock(rq, &rf);
    	smp_mb__after_spinlock();
    
    	/* Promote REQ to ACT */
    	rq->clock_update_flags <<= 1;//为什么要修改clock_update_flags呢?
    	update_rq_clock(rq);
    
    	switch_count = &prev->nivcsw; //根据上下文,switch_count此时指向的是非自愿切换计数器
    	if (!preempt && prev->state) {//如果不是被抢占的,且task处于非running状态
    		if (signal_pending_state(prev->state, prev)) {//如果有signal pending,则重新将prev task置为running状态
    			prev->state = TASK_RUNNING;
    		} else { //否则做dequeue的操作.
    			deactivate_task(rq, prev, DEQUEUE_
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值