完整的软件定时器:派生时间?

时间:2015-07-26 06:31:15

标签: timer hardware

我被问到一个问题,但我不确定我是否正确回答了问题。

"是否可以仅依靠软件定时器?"

我的答案是"是的,理论上"

但是然后我补充道:

  

"只需依靠内核加载(rtc)的硬件定时器然后   因为我们必须能够知道,所以软件只是一个一团糟来管理   每条指令花了多少cpu周期+最终缓存未命中+   分支成本+内存速度并在每个或之后放置一个计数器   组(祝你好运无序cpu)。

     

进行计算以推导出当前的cpu周期。那是   疯。

     

不谈论整体性能下降

     

我们所拥有的最好的是时间的脆弱近似值   随着时间的推移变得越来越错误。在短圈内即使可能。"

但即使对我来说似乎合乎逻辑,的想法也出错了?

由于

1 个答案:

答案 0 :(得分:1)

在具有通用操作系统(Linux,Windows,FreeBSD,MacOSX,Android,iOS,...)的当前处理器和硬件(例如Intel或AMD或笔记本电脑或台式机或平板电脑中的ARM)上scheduled在随机的时间。因此缓存行为是不确定的。因此,指令定时是不可再现的。您需要一些硬件时间测量。

典型的台式机或笔记本电脑每秒可获得数百或数千interrupts个,其中大多数时间相关。尝试在Linux机器上运行cat /proc/interrupts两次,运行之间只需几秒钟。

我想即使使用像操作系统一样的单任务MS-DOS,你仍然会得到随机行为(例如由ACPI或SMM引起)。在某些笔记本电脑上,处理器频率可以受其温度的限制,这取决于CPU负载和外部温度...

实际上,您确实希望使用操作系统提供的某些计时器。对于Linux,请阅读time(7)

所以你几乎不能依赖纯软件计时器。但是,处理器有内部定时器....即使在原则上,你也无法避免在当前处理器上使用定时器....

如果您可以将硬件置于一个非常受控制的环境(恒温)中运行一个非常有限的软件(类似操作系统的自由站立的东西)完全位于处理器缓存中,然后可能获得一些确定性,您可能会这样做,但实际上当前的笔记本电脑或台式机(或平板电脑)硬件非确定性并且您无法预测给定小型机器例程所需的时间

定时器在有趣的(非平凡的)软件中非常有用,例如, J.Pitrat CAIA, a sleeping beauty博客文章有趣的一点。另请参阅watchdog timers在软件中的多种用法(例如在Parma Polyhedra Library中) 另请阅读Worst Case Execution Time(WCET)。

所以我要说,即使在理论上也不可能依赖纯粹的软件定时器(当然,除非软件使用处理器定时器,这是硬件电路)。在上个世纪(直到20世纪80年代或90年代),硬件更具确定性,并且记录了每个机器指令所需的时钟周期或微秒量(但是一些指令,例如除法,需要不同的时间,具体取决于实际数据!)。