打印本文 打印本文 关闭窗口 关闭窗口
Linux 2.4进程调度分析 5
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2147  更新时间:2009/4/22 20:45:51  文章录入:mintao  责任编辑:mintao
                    cli

                    cmpl $0,need_resched(%ebx)                         #ebx中存放着current指针

                    jne reschedule

               ……

               reschedule:

                    call SYMBOL_NAME(schedule)   

                    jmp ret_from_sys_call                                        #反复查询need_resched

                   

 

  

因此,只需要设置当前进程(current)的need_resched,就有机会启动调度器。通常有如下几种场合会设置need_resched:

  • update_process_times(),由时钟中断触发,负责管理除0号进程(idle进程)以外的其他各个进程的时间片消耗。如果当前进程(SCHED_FIFO实时进程除外)的时间片用完了(counter==0),则设置need_resched为1;(注意:此时并不计算或重置counter值,这个工作在所有进程的时间片都耗完以后在schedule()中进行)
  • reschedule_idle(),此函数的功能在"调度器工作流程"一节中已经详细描述了,不过,最经常的调用者是在某一事件等待队列上休眠的进程的唤醒过程--wake_up_process()及其他一系列wake_up函数(见上"主动式调度");
  • sched_setscheduler()、sched_yield()系统调用,以及系统初始化(rest_init()中)、创建新进程(do_fork()中)等从语义上就希望启动调度器工作的场合。

由于启动schedule()的时机实际上由当前进程决定,因此设置了need_resched并不意味着就能及时调度,这也是"Linux内核不可抢占"的原因(详见下"Linux 2.4调度系统的一些问题"之"内核不可抢占")。

上一页  [1] [2] [3] 

打印本文 打印本文 关闭窗口 关闭窗口