2

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

4

1 回答 1

6

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

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

此外,如果您希望您的线程在计时器到期时抢占其他正在运行的线程,则需要为其提供实时调度策略(SCHED_FIFOSCHED_RRsched_setscheduler()

您还需要确保使用该CONFIG_PREEMPT选项编译您的内核,该选项允许大多数内核代码是可抢占的。仍然会有一定程度的抖动,这是由硬件中断和软中断等不可抢占的内核工作引起的。为了进一步减少这种情况,您可以尝试使用CONFIG_PREEMPT_RT内核补丁集

于 2012-11-14T01:01:40.493 回答