Chinaunix

标题: 动态时钟的疑问 [打印本页]

作者: 我爱芒果叶    时间: 2013-10-14 14:31
标题: 动态时钟的疑问
本帖最后由 我爱芒果叶 于 2013-10-14 14:33 编辑

在进入动态时钟后,重启周期时钟的最后需要对下一个时钟事件编程。这是必要的,因为外部中断的存在,可能导致空闲时间的结束早于预期。
蓝色字体部分是《深入Linux内核架构》中的内容。
我的理解是,在开启动态时钟时,已经对下一个时钟事件编程,即使中断在下一个时钟事件前发生了,之前编程好的时钟事件应该也是会正确发生,没必要再对下一个时钟事件编程。
请指点迷津。
作者: 瀚海书香    时间: 2013-10-14 16:22
回复 1# 我爱芒果叶
在进入动态时钟后,重启周期时钟的最后需要对下一个时钟事件编程。这是必要的,因为外部中断的存在,可能导致空闲时间的结束早于预期。
蓝色字体部分是《深入Linux内核架构》中的内容。
我的理解是,在开启动态时钟时,已经对下一个时钟事件编程,即使中断在下一个时钟事件前发生了,之前编程好的时钟事件应该也是会正确发生,没必要再对下一个时钟事件编程。
请指点迷津


tick_nohz_stop的时候,设置的下一个时钟时间可能是在多个tick之后;而现在restart后,需要每个tick都必须有事件,所有需要重新编程。

比如:

time=1  tick 正常工作
time=2  进入idle状态,并且最新的时钟时间在time=10的时候,所以tick_nohz_stop,并且设置时钟事件在8个tick后,也就是time=10的时候
time=3  idle
time=4  idle
time=5  被中断打断,tick_nohz_restart。这个时候为正常状态,每个tick后都需要有时钟事件,所有需要设置时钟时间在1个tick后,也就是time=6的时候
time=6 tick正常工作。。。

   
作者: 我爱芒果叶    时间: 2013-10-14 16:56
本帖最后由 我爱芒果叶 于 2013-10-24 14:07 编辑

回复 2# 瀚海书香


    谢谢版主,恍然大悟。
作者: humjb_1983    时间: 2013-10-14 17:09
回复 1# 我爱芒果叶
这里说的对下一个“时钟事件”编程,并不是重设下一个到期的定时器,而是指“时钟中断”定时器的到期时间,因为在中断事件触发后,需要重新启动“时钟”机制,而下一个“时钟中断”到期时间,是在停止周期时钟时(进入cpu_idle的时候)就已经算好并设置好了(tick_nohz_stop_sched_tick函数中),如果因为在idle期间有其它中断发生导致周期时钟提前被启用,那么当然需要重设下一个“时钟事件”的到期时间,否则从中断唤醒到内核预期的唤醒时间(下一个到期定时器,对于内核来说是已知的)之前,就没有时钟中断了。



   




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