首页 理论教育 操作系统实现之路:定时器注意事项

操作系统实现之路:定时器注意事项

更新时间:2025-01-18 工作计划 版权反馈
【摘要】:因为定时器的回调函数是在时钟中断处理程序中被调用的,如果有大量的回调函数存在,会大大降低系统性能。但如果一次定时器采用发送消息的超时处理机制,则如果处理时间为0.12ms,需要设定250多个一次定时器。采用消息通知作为超时处理机制的定时器会引入误差。在T1时刻,系统给设定定时器的线程发送一个消息,然后继续执行时钟中断处理程序。

考虑到定时器的实现机制以及目标系统的性能要求,在实际应用中使用定时器服务时,需要遵循下列规则。

(1)在使用定时器服务时,如果不是十分必要,建议不要使用回调通知机制(即设定一个回调函数)。因为定时器的回调函数是在时钟中断处理程序中被调用的,如果有大量的回调函数存在,会大大降低系统性能。图8-6是在一个Pentium 42.5GHz处理器上做的测试结果。

978-7-111-41444-5-Chapter08-38.jpg

图8-6 一个测试结果

图中,横坐标是一次定时器个数,每个一次定时器的超时处理都采用回调函数的方式,每个回调函数所做的处理操作都一样,都是从一个优先队列中删除一个对象(该优先队列只有一个对象),因此,可认为回调函数的处理时间都是一样的。纵坐标是处理器的处理时间(通过记录处理器时钟周期个数来计算),可以看出,当一次定时器个数在20个的时候,处理时间达到了0.06ms,如果上升到30个,则处理时间达到了0.12ms。

但如果一次定时器采用发送消息的超时处理机制(即发送一个消息给设定定时器的线程),则如果处理时间为0.12ms,需要设定250多个一次定时器。可以看出,采用回调函数超时机制的定时器,其开销比采用消息通知机制的定时器大得多。

(2)如果一定要采用回调函数机制来处理超时,建议回调函数的处理时间不能太长,一般情况下,处理时间不能大于0.01ms。(www.xing528.com)

(3)采用消息通知作为超时处理机制的定时器会引入误差。比如,假设设定的定时器在T1时刻超时,则在T1时刻,设定定时器的线程会收到一个定时器超时消息,但真正处理该定时器超时消息的时间可能会延迟到T2,如图8-7所示。

978-7-111-41444-5-Chapter08-39.jpg

图8-7 定时器消息的处理延时

图中,tN(t1,t2,t3,..)是时钟中断发生时刻,且tN之间间隔均匀。在T1时刻,系统给设定定时器的线程发送一个消息,然后继续执行时钟中断处理程序。中断处理程序执行完毕,系统会选择线程就绪队列中优先级最高的线程投入运行。此时如果设定定时器的线程是优先级最高的线程,那么会马上投入运行,定时器超时消息会被处理,因此,图中的T2时刻是定时器超时消息得到处理的最早时刻。如果设定定时器对象的线程,优先级不是最高的,那么这个时候,就不会被调度,其他优先级更高的就绪线程会被调度,因此这个时候,定时器消息将一直存放在设定它的线程队列中,除非设定线程得到调度,否则定时器超时消息将一直不能被处理。所以定时器超时消息的处理时间可能会进一步延迟,一种最糟糕的情况就是,定时器超时消息可能永远得不到处理(在设定线程永远得不到调度的时候发生)。

但是对于采用回调函数作为超时处理机制的定时器,在T1时刻,回调函数就可以被调用,即超时消息马上被处理。因此,在一些时间要求十分严格的场合,建议使用回调机制处理超时。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈