用户空间中的linux高分辨率计时器

时间:2012-11-13 21:26:20

标签: linux linux-kernel posix

我需要一个线程在我的过程中每5ms(精确)唤醒并做一些工作 我使用了posix定时器,它们似乎准确率为90%,当cpu有点负载时,准确度会进一步降低 我相信这是因为posix计时器必须在每个到期时分叉新线程 还有其他一些可靠的方法在linux中实现高分辨率计时器并且会增加线程帮助的优先级吗? 我在CentOS 5.6上。

1 个答案:

答案 0 :(得分:6)

POSIX计时器(使用timer_create()创建)已经是高分辨率。您的问题在于交付方式 - 如果您想要非常精确的时间安排,那么SIGEV_THREAD不是一个好主意。

您可以改为使用SIGEV_SIGNAL,以便通过信号通知计时器到期,然后使用sigwaitinfo()等待它过期。或者,您可以使用timerfd而不是POSIX计时器(使用timerfd_create()创建)。

此外,如果您希望线程在计时器到期时抢占其他正在运行的线程,则需要为其提供{{1, }}

您还需要确保使用SCHED_FIFO选项编译内核,该选项允许大多数内核代码可抢占。由于不可抢占的内核工作(如硬件中断和softirq)会导致一定程度的抖动。为了进一步减少这种情况,您可以尝试使用CONFIG_PREEMPT_RT kernel patchset