uClinux进程调度器的实现分析
if (unlikely(!c)) {
/*若处于运行队列中的进程没有可调度的,那么得重新分配时间片*/
struct task_struct *p;
for_each_task(p)
p->counter = (p->counter >> 1) + NICE_TO_TICKS(p->nice);
goto repeat_schedule;
}
sched_data->curr = next;
task_set_cpu(next, this_cpu);www.51kaifa.com
if (unlikely(prev == next)){
/*如果选中的进程和原来运行的进程是同一个*/
prev->policy = ~SCHED_YIELD;
goto same_process;
}
kstat.context_swtch++;
/*全局统计进程上下文切换次数*/
prepare_to_switch();
/*准备进行进程切换*/
{
……/*进程的页表处理,代码略*/
}
switch_to(prev, next, prev); www.51kaifa.com
/*切换到选中的进程中*/
__schedule_tail(prev);
/*考虑将当前被切换下来的进程,放到别的CPU上运行*/
same_process:
reacquire_kernel_lock(current);www.51kaifa.com
/*重新获得内核锁*/
if (current->need_resched)
goto need_resched_back;
return;
}
整个schedule()的工作流程可以概述成以下几步:
1). 清理当前运行中的进程
2). 选择下一个投入运行的进程
3). 设置新进程的运行环境www.51kaifa.com
4). 执行进程上下文切换
5). 后期整理
5 结束语
uClinux的进程调度有其独有的特征,比如为了将三种调度策略协调一致同时不增加程序复杂度,uClinux为每一个进程设置相应的调度策略,并设置实时进程的优先级远高于非实时进程,使得在调度过程中不必去区分实时进程和非实时进程,从而获得最佳响应时间。同时,uClinux操作系统采用底半部分处理策略,将中断处理服务程序分割成两部分,提高了响应时间。另外,被暂时挂起的中断处理程序及任务队列,都要放在schedule( )中去处理,并优于其它进程调度,形成了uClinux独具特色的调度风格。
参考文献:
[1] Claudia Salzberg Rodriguez,Gordon Fischer,Steven Smolski.The Linux Kernel Primer[M].北京:机械工业出版社,2006www.51kaifa.com
[2] 邹治锋,张曦煌.Linux 2.6进程调度[J].微计算机信息.2006,1-2:77-79[3] uClinux官方网站源码下载. http://www.uclinux.org/pub/uClinux/dist/.2007
评论