Linux,需要精确的编程时间。 调度程序唤醒程序

我有一个在Linux系统上运行的线程,我需要像possbile一样以精确的间隔执行。 例如每ms执行一次。

目前这是通过创build一个计时器来完成的

timerfd_create(CLOCK_MONOTONIC, 0) 

,然后在一个结构中传递所需的睡眠时间

  timerfd_settime (fd, 0, &itval, NULL); 

阻塞读取调用在这个定时器上执行,停止线程执行并报告失去的唤醒调用。

问题是,在更高的频率下,即使CPU使用率低于10%,系统也会开始失去最后期限。 我想这是由于调度程序没有足够频繁地唤醒线程来检查阻塞调用。 有没有一个命令我可以用来告诉调度程序在一定的时间间隔内将线程唤醒? 由于系统处理许多其他任务,忙等待是一个不好的select。

谢谢。

你需要得到RT linux *,然后增加你想要定期唤醒的进程的RT优先级。

除此之外,我没有看到代码中的问题,如果你的进程没有被阻止,它应该可以正常工作。

(*)RT linux – 一个应用了一些实时调度补丁的操作系统。

减少调度程序延迟的一种方法是使用实​​时调度程序(如SCHED_FIFO)运行您的进程。 请参阅sched_setscheduler 。

这通常会延长很多延迟,但仍然不足以保证,为了进一步减少延迟尖峰,您需要转移到Linux的实时操作系统,或者实时操作系统,如VxWorks,RTEMS或QNX。

除非您在实际的“实时操作系统”上运行它,否则您将无法做到自己想要的操作。

如果这只是x86系统的Linux,我会选择HPET定时器。 我认为所有现代PC都有这个硬件计时器,它非常非常准确。 我允许你定义每毫秒会被调用的回调函数,在这个回调函数中,你可以做一些计算(如果它们很简单),或者使用一些同步对象(例如条件变量)来触发其他线程的工作。这个计时器http://blog.fpmurphy.com/2009/07/linux-hpet-support.html

除了将调度类设置为SCHED_FIFO等其他建议之外,还需要使用一个可以满足截止日期的足够高的tick值的Linux内核。

例如,使用100或250 Hz的CONFIG_HZ (每秒定时器中断)编译的内核永远不会对定时器事件做出更快的响应。

您还必须将计时器设置得比实际需要的速度快一点,因为计时器可以超出其要求的时间,但不会提前过期,这样会给您更好的结果。 如果你需要1毫秒,那么我建议要求999美元。