Linux的hrtimer - 微秒精度?

6
有没有可能在Linux主机上以微秒精度执行任务?也就是说,我想在特定的时间点执行一个任务。我知道,Linux不是实时系统,但我正在寻找在Linux上最好的解决方案。
到目前为止,我已经创建了一个内核模块,设置了hrtimer,并测量了回调函数进入时的抖动(我并不真的太关心实际的延迟,而是抖动)-大约是20-50us。这与在用户空间使用timerfd并不显着不同(还尝试过为过程使用实时优先级,但实际上并没有改变任何内容)。
我正在运行Linux 3.5.0(只是一个示例,尝试了从2.6.35到3.7的不同内核),/proc/timer_list显示hrtimer_interrupt,我没有运行在失效安全模式下,这会禁用hrtimer功能。在不同的CPU上尝试过(从Intel Atom到Core i7)。
到目前为止,我最好的想法是将hrtimer与ndelay/udelay结合使用。这真的是最好的方法吗?我不能相信不可能以微秒精度触发任务。在内核空间中作为模块运行代码是可以接受的,但很棒如果代码不会被其他任务中断。我真的不太关心系统的其他部分,该任务仅会执行几次每秒,因此每次执行任务时使用mdelay/ndelay烧掉CPU几微秒不会真的有关系。虽然我更喜欢一种更优雅的解决方案。
我希望问题清晰明了,找到了很多关于计时器精度的主题,但没有真正回答这个问题。
2个回答

3

您可以从用户空间做您想做的事情

  1. 使用clock_gettime()CLOCK_REALTIME来获取带有nano秒分辨率的当前时间
  2. 使用nanosleep()让CPU暂停,直到接近您需要执行任务的时间(至少为milli秒分辨率)。
  3. 使用自旋循环和clock_gettime(),直到达到所需的时间
  4. 执行您的任务

clock_gettime()函数在最近的内核和现代x86处理器中作为VDSO实现 - 它以20-30纳秒的分辨率获取时间,您应该能够每micro-second调用clock_gettime()超过30次。使用此方法,您的任务应在预期时间的1/30微秒内分派。


虽然我不完全确定用户空间解决方案是否能解决我的问题,但是这个解决方案可以实现微秒级别的任务执行。 - user1034081

0

默认的Linux内核定时器每毫秒会进行一次滴答。微秒级别已经远远超出了当前用户硬件的能力范围。

您看到的抖动是由许多因素引起的,例如中断处理和服务更高优先级的任务。您可以通过精心选择硬件、仅启用真正需要的内容来在一定程度上减少这种抖动。内核的实时补丁系列(请参见HOWTO)可能是进一步减少抖动的选项。

始终记住,任何收益都有明确的代价,包括交互性、稳定性以及(最后,但绝不是最不重要的)构建、调整、故障排除和保持系统稳定所需的时间成本。


3
“微秒远超过任何当前用户硬件的能力。” 我不同意 - 一个2GHz的“恐龙级”处理器每个时钟周期为0.5纳秒。如果您假定平均每个指令需要10个时钟周期,并且在执行一个循环时需要50个指令,那么每个循环仍需要250纳秒,这意味着在现代硬件上轻松实现比毫秒更好的时间循环分辨率是完全可能的... - twalberg
@twalberg,你的CPU在一微秒内执行多少条指令?十几条吗? - vonbrand
1
Pentium 4硬件程序员参考资料似乎表明,大多数常用指令的延迟时间都低于10个时钟周期,而这是从2002年开始的。在2GHz的频率下(现代CPU运行速度接近两倍),10个时钟周期就是5纳秒——因此最可能每微秒超过200条指令。显然,缓存问题、数据冲突和其他事项可能会有所影响,但是紧凑的计时循环可以运行得非常快... - twalberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接