Chinaunix

标题: 《linux内核设计与实现》进程调度只能发生在时钟中断到来吗? [打印本页]

作者: nwcfafniw    时间: 2013-05-23 13:11
标题: 《linux内核设计与实现》进程调度只能发生在时钟中断到来吗?
在《linux内核设计与实现》第11章中说到高HZ的优势时,说“假定有一个正在运行的进程,它的时间片只剩下2ms,此时调度程序又要求抢占该进程,然后去运行另一个进程,然而,该抢占行为不会在下一个时钟中断到来前发生,也就是说,在这2ms内不可能进行抢占”。根据这段话,是不是能够说明进程其实是等到时钟中断到来时才真正调度的。
如果一个进程打算休眠,它把自己加入到等待队列,再调用schedule(),那么是不是也是等到时钟中断到来时才会挑选另一个进程来执行?
作者: lovegq    时间: 2013-05-23 13:17
本帖最后由 lovegq 于 2013-05-23 13:18 编辑

应该不会,我不知道为什么,但是从现象上看,系统上下文切换次数 是可以用sar等命令统计到的,一次“上下文切换” 至少需要 一次"进程间调度"吧
ok,上下文切换 很多时候都高达几百K,所以如果只有时钟中断时才发生,太不够了

另外,假设我要休眠,都调用sleep了,还要等到时钟中断发生才换给其他进程运行, 这个太傻了,不能够是这样吧
作者: nwcfafniw    时间: 2013-05-23 20:08
lovegq 发表于 2013-05-23 13:17
应该不会,我不知道为什么,但是从现象上看,系统上下文切换次数 是可以用sar等命令统计到的,一次“上下文 ...

其实我问得也有问题。。很多概念不清楚,还是多看看源码吧,多谢你回答!
作者: stephen_du    时间: 2013-05-24 17:36
本帖最后由 stephen_du 于 2013-05-24 17:41 编辑

回复 1# nwcfafniw


   

你要知道调用schedule()函数才是发生抢占的时间,
只是为了保证在一定时间内抢占的请求生效,
所以在中断返回的时候调用一次schedule()函数,做一次集中的抢占请求处理。

别的地方也会调用schedule()不过不是周期性的,
但是同样会处理抢占请求,发生抢占行为。
即1/HZsec发生抢占,只是一个粗鲁额的说法。

作者: asuka2001    时间: 2013-05-26 09:04
本帖最后由 asuka2001 于 2013-05-26 09:07 编辑

发重了。。。。
作者: asuka2001    时间: 2013-05-26 09:06
回复 1# nwcfafniw

LDK3对于抢占时机的总结:

In short, user preemption can occur
        When returning to user-space from a system call
        When returning to user-space from an interrupt handler

Kernel preemption can occur
        When an interrupt handler exits, before returning to kernel-space
        When kernel code becomes preemptible again
        If a task in the kernel explicitly calls schedule()
        If a task in the kernel blocks (which results in a call to schedule())

详见LKD3 P63 - P64


   
作者: leon_yu    时间: 2013-07-05 15:18
本帖最后由 leon_yu 于 2013-07-05 15:18 编辑

时钟中断的确会调度,但不是唯一抢占点,比如那2MS内,若当前进程主动让出,调用schedule(),或者分配“时间片”用完,都会进行调度。
至于休眠,在进程由运行态切换到睡眠状态的时候,就会调用schedule(),马上进行调度,选取下一个可执行进程,而不是等到下一个时钟中断才调度。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2