Mik*_*yan 2 linux posix linux-kernel
我需要一个线程在我的进程中每5ms(精确)唤醒并做一些工作.
我使用了posix定时器,当cpu有点负载时,它们似乎准确率为90%并且准确度进一步降低.
我相信这是因为posix计时器必须在每个到期时分叉新线程.
有没有其他可靠的方法在Linux中实现高分辨率计时器,并将提高线程帮助的优先级?
我在CentOS 5.6上.
POSIX定时器(由其创建timer_create()
)已经是高分辨率.你的问题在于交付方式 - 如果你想要非常精确的时机,那么SIGEV_THREAD
这不是一个好主意.
您可以使用,SIGEV_SIGNAL
以便通过信号通知计时器到期,然后使用sigwaitinfo()
等待它到期.或者,您可以使用timerfd而不是POSIX计时器(使用timerfd_create()
)创建.
此外,如果您希望线程在计时器到期时抢占其他正在运行的线程,则需要为其提供实时调度策略(SCHED_FIFO
或SCHED_RR
)sched_setscheduler()
.
您还需要确保使用该CONFIG_PREEMPT
选项编译内核,该选项允许大多数内核代码可抢占.由于不可抢占的内核工作(如硬件中断和softirq)会导致一定程度的抖动.为了进一步减少这种情况,您可以尝试使用CONFIG_PREEMPT_RT
内核补丁集.
归档时间: |
|
查看次数: |
3221 次 |
最近记录: |