我的进程中需要一个线程每 5 毫秒(精确)唤醒一次并做一些工作。
我使用过 posix 计时器,它们似乎准确率为 90%,当 cpu 有点负载时,准确度会进一步降低。
我相信这是因为 posix 计时器必须在每次到期时分叉新线程。
是否有其他可靠的方法可以在 linux 中实现高分辨率计时器,并且增加线程的优先级会有所帮助吗?
我在 CentOS 5.6 上。
问问题
4009 次
1 回答
6
POSIX 计时器(使用 创建timer_create()
)已经是高分辨率的。您的问题在于交付方式 - 如果您想要非常精确的时间,那么SIGEV_THREAD
这不是一个好主意。
您可以改为使用SIGEV_SIGNAL
以便通过信号通知计时器到期,然后使用sigwaitinfo()
等待它到期。或者,您可以使用 timerfd 而不是 POSIX 计时器(使用 创建timerfd_create()
)。
此外,如果您希望您的线程在计时器到期时抢占其他正在运行的线程,则需要为其提供实时调度策略(SCHED_FIFO
或SCHED_RR
)sched_setscheduler()
。
您还需要确保使用该CONFIG_PREEMPT
选项编译您的内核,该选项允许大多数内核代码是可抢占的。仍然会有一定程度的抖动,这是由硬件中断和软中断等不可抢占的内核工作引起的。为了进一步减少这种情况,您可以尝试使用CONFIG_PREEMPT_RT
内核补丁集。
于 2012-11-14T01:01:40.493 回答