5

是否可以在 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 烧掉几微秒并不重要。尽管如此,我更喜欢更优雅的解决方案。

我希望这个问题很清楚,找到了很多关于计时器精度的话题,但没有真正解决这个问题。

4

2 回答 2

3

你可以从用户空间做你想做的事

  1. 使用clock_gettime()withCLOCK_REALTIME获取具有nano-second 分辨率的时间
  2. 用于nanosleep()让出 CPU,直到您接近执行任务所需的时间(至少是milli- 秒分辨率)。
  3. 使用自旋循环,clock_gettime()直到达到所需的时间
  4. 执行你的任务

clock_gettime()函数VDSO在最近的内核和现代 x86 处理器中实现 - 需要 20-30nano秒才能获得具有nano-second 分辨率的时间 - 你应该能够clock_gettime()每秒调用超过 30 次micro。使用此方法,您的任务应在预期时间的 1/30micro秒内调度。

于 2013-02-18T20:09:26.887 回答
0

默认的 Linux 内核计时器每毫秒计时一次。微秒远远超出了当前用户硬件的能力。

您看到的抖动是由许多因素造成的,例如中断处理和服务更高优先级的任务。你可以通过仔细选择硬件来减少它,只启用真正需要的东西。内核的实时补丁系列(参见HOWTO)可能是进一步减少它的一个选项。

永远记住,任何收益都会在交互性、稳定性和(最后但并非最不重要的)你在构建、调整、故障排除和防止纸牌屋分崩离析方面的时间方面付出一定的代价。

于 2013-02-18T20:09:13.283 回答