设为首页 加入收藏

TOP

Linux进程调度时机
2014-11-24 01:25:40 来源: 作者: 【 】 浏览:1
Tags:Linux 进程 调度 时机

Linux进程调度程序虽然特别重要,但它不过是一个存在于内核空间中的函数而已,并不神秘。Linux的调度程序是一个叫Schedule()的函数,这个函数被调用的频率很高,由它来决定是否要进行进程的切换,如果要切换的话,切换到哪个进程等等。我们先来看在什么情况下要执行调度程序,我们把这种情况叫做调度时机。


Linux调度时机主要有:


1、进程状态转换的时刻:进程终止、进程睡眠;


2、当前进程的时间片用完时(current->counter=0);


3、设备驱动程序


4、进程从中断、异常及系统调用返回到用户态时;


时机1,进程要调用sleep()或exit()等函数进行状态转换,这些函数会主动调用调度程序进行进程调度;


时机2,由于进程的时间片是由时钟中断来更新的,因此,这种情况和时机4是一样的。


时机3,当设备驱动程序执行长而重复的任务时,直接调用调度程序。在每次反复循环中,驱动程序都检查need_resched的值,如果必要,则调用调度程序schedule()主动放弃CPU。


时机4,如前所述,不管是从中断、异常还是系统调用返回,最终都调用ret_from_sys_call(),由这个函数进行调度标志的检测,如果必要,则调用调用调度程序。那么,为什么从系统调用返回时要调用调度程序呢?这当然是从效率考虑。从系统调用返回意味着要离开内核态而返回到用户态,而状态的转换要花费一定的时间,因此,在返回到用户态前,系统把在内核态该处理的事全部做完。


每个时钟中断(timer interrupt)发生时,由三个函数协同工作,共同完成进程的选择和切换,它们是:schedule()、do_timer()及ret_form_sys_call()。我们先来解释一下这三个函数:


schedule():进程调度函数,由它来完成进程的选择(调度);


do_timer():暂且称之为时钟函数,该函数在时钟中断服务程序中被调用,是时钟中断服务程序的主要组成部分,该函数被调用的频率就是时钟中断的频率即每秒钟100次(简称100赫兹或100Hz);


ret_from_sys_call():系统调用返回函数。当一个系统调用或中断完成时,该函数被调用,用于处理一些收尾工作,例如信号处理、核心任务等等。


这三个函数是如何协调工作的呢?


前面我们看到,时钟中断是一个中断服务程序,它的主要组成部分就是时钟函数do_timer(),由这个函数完成系统时间的更新、进程时间片的更新等工作,更新后的进程时间片counter作为调度的主要依据。


在时钟中断返回时,要调用函数ret_from_sys_call(),前面我们已经讨论过这个函数,在这个函数中有如下几行:


cmpl $0, _need_resched


jne reschedule


……


restore_all:


RESTORE_ALL


reschedule:


call SYMBOL_NAME(schedule)


jmp ret_from_sys_call


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux进程调度的常用数据结构和函.. 下一篇浅析Java中的深拷贝与浅拷贝

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: