1 / 4
文档名称:

调度子系统2_核心调度器.pdf

格式:pdf   页数:4
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

调度子系统2_核心调度器.pdf

上传人:翩仙妙玉 2013/12/22 文件大小:0 KB

下载得到文件列表

调度子系统2_核心调度器.pdf

文档介绍

文档介绍:奔跑的Linerdx的专栏
调度子系统2_核心调度器
分类: Linux调度子系统 2013-12-10 20:04 203人阅读评论(0) 收藏举报
进程调度linux内核
// 核心调度器
// 当进程决定让出cpu时调用
// 函数任务:
//
//
//
//
//
// resched标志
// ,并且当前非内核抢占路径
// 如果当前进程有信号待处理,设置当前进程为就绪状态
// 否则进程出队rq
//
// 通过load balance从其他进程搬进程
//
//
//
// 执行进程切换
//
//
// resched,重复1
asmlinkage void __sched schedule(void)
{
struct task_struct *prev, *next;
unsigned long *switch_count;
struct rq *rq;
int cpu;
need_resched:
//禁止抢占
preempt_disable();
cpu = smp_processor_id();
//本cpu的rq
rq = cpu_rq(cpu);
//当前rq上正在运行的进程
prev = rq->curr;
//进程被切换的次数
switch_count = &prev->nivcsw;
//取消为当前进程运行的hrtimer
if (sched_feat(HRTICK))
hrtick_clear(rq);
//获取队列锁
raw_spin_lock_irq(&rq->lock);
//更新队列时钟
update_rq_clock(rq);
//清除当前进程need resched标志
clear_tsk_need_resched(prev);
//当前进程非运行状态,并且非内核抢占
if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
//当前进程有信号待处理,设置进程为运行态
1
if (unlikely(signal_pending_state(prev->state, prev)))
{
prev->state = TASK_RUNNING;
}
else
{ //进程出队rq
deactivate_task(rq, prev, 1);
}
switch_count = &prev->nvcsw;
}
//通知调度器类,即将发生进程切换
pre_schedule(rq, prev);
//当前rq没有可运行进