【问题标题】:linux high resolution timer in user space用户空间中的linux高分辨率计时器
【发布时间】:2012-11-13 21:26:20
【问题描述】:

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

【问题讨论】:

  • Linux 不是实时内核。不,用户空间不能这样做。
  • 您需要一个实时操作系统 (RTOS)。
  • 如果您解释为什么需要这个,也许我们可以建议替代方案。
  • @Thomas 我正在开发一个调度程序,它需要每个间隔(5 毫秒)分配带宽
  • 不确定您所说的“分配带宽”是什么意思。如果是用于填充令牌桶之类的事情,您只需检查下一次访问该桶时经过了多少时间,然后“及时”重新填充。

标签: linux linux-kernel posix


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多