您的位置:首页 > 运维架构 > Linux

每日阅读4之linux内核设计与实现——linux调度实现之调度器入口

2013-03-23 16:52 387 查看
linux调度的入口函数时schedule(),定义在文件kernel/sched.c

是内核其它部分用于调用进程调度器的入口:选择哪个进程可以运行,何时将其投入运行

通常需要和一个具体的调度类相关联,一般是优先级最高的,每个调度类都有一个自己的可运行队列

这个函数唯一的作用就是调用pick_next_task,依次检查每个调度器类,并且从最高优先级的调度器类中选择最高优先级的进程运行。。

/*

* Pick up the highest-prio task:

*/

static inline struct task_struct *

pick_next_task(struct rq *rq)

{

const struct sched_class *class;

struct task_struct *p;

/*

* Optimization: we know that if all tasks are in

* the fair class we can call that function directly:

*/

if (likely(rq->nr_running == rq->cfs.nr_running)) {
//这里做了个优化,如果只有一个调度器类( 每一个调度器类都实现了自己的pick_next_task函数,普通进程的调度器类为CFS),

p = fair_sched_class.pick_next_task(rq);

if (likely(p))

return p;

}

class = sched_class_highest;

for ( ; ; ) {

p = class->pick_next_task(rq);
//从最高优先级的调度类开始,选择每个最高优先级调度器类中的那个进程

if (p)

return p;

/*

* Will never be NULL as the idle class always

* returns a non-NULL p:

*/

class = class->next;

}

}

OVER!!!

下一章是睡眠与唤醒
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: