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

Full software timer : derivate time?

有人问我问题,但我不确定我是否回答正确。

"Is it possible to rely only on software timer?"

我的回答是"yes, in theory"

但是然后我补充说:

"Just relying on hardware timer at the kernel loading (rtc) and then software only is a mess to manage since we must be able to know how many cpu cycles each instruction took + eventual cache miss + branching cost + memory speed and put a counter after each one or group (good luck with out-of-order cpu).

And do the calculation to derivate the current cpu cycle. That is insane.

Not talking about the overall performance drop.

The best we could have is a brittle approximation of the time which become more wrong over time. Even possibly on short laps."

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

谢谢

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

典型的台式机或笔记本电脑每秒接收数百或数千次 interrupts,其中大部分与时间相关。在 Linux 机器上尝试 运行ning cat /proc/interrupts 两次,在 运行 之间间隔几秒钟。

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

在实践中,您确实需要使用操作系统提供的一些计时器。对于 Linux,阅读 time(7)

所以你实际上不能依赖纯软件定时器。然而,处理器有内部定时器....即使在原则上,你也无法避免当前处理器上的定时器....

如果你能把你的硬件放在一个非常受控的环境中(恒温),你也许可以运行一个非常有限的软件(一个OS-like free standing thing)完全坐在里面处理器缓存,然后可能会获得一些确定性,但实际上当前的笔记本电脑或台式机(或平板电脑)硬件是非确定性并且您无法预测给定小机例程.

计时器在有趣的(非平凡的)软件中非常有用,参见例如J.Pitrat CAIA, a sleeping beauty blog entry for an interesting point. Also look at the many uses of watchdog timers in software (e.g. in the Parma Polyhedra Library) 另请阅读 Worst Case Execution Time (WCET)。

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