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

Mik*_*yan 2 linux posix linux-kernel

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

caf*_*caf 6

POSIX定时器(由其创建timer_create())已经是高分辨率.你的问题在于交付方式 - 如果你想要非常精确的时机,那么SIGEV_THREAD这不是一个好主意.

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

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

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