- 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 - 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_
Scheduler 学习之二:主调度器_schedule函数
最新推荐文章于 2023-07-07 19:30:57 发布
![](https://img-home.csdnimg.cn/images/20240709112858.png)