2011-06-10 67 views
10

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

目前,这是通过创建与

timerfd_create(CLOCK_MONOTONIC, 0) 

定时器,然后使所期望的睡眠时间在一个结构与

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

一种阻塞读呼叫所做的是在此计时器其停止执行线程执行并报告唤醒呼叫丢失。

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

谢谢。

+1

你在实时调度器上运行这个吗?根据我的经验,只要你的内核没有任何坏行为的驱动程序,它应该足够好,以便在毫秒量级的时间间隔内完成。 (当然,Linux不是专业的RTOS,并不能保证你永远不会错过最后期限。) – 2011-06-10 14:58:21

回答

5

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

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

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

+1

谢谢V Jo,我曾考虑过这个选项。此时此刻,我被锁定到正常的香草版本,但我会进一步研究。另一方面,如果我运行一个RT Linux版本..我有什么保证,调度程序将以准确的时间间隔唤醒此线程以检查阻塞呼叫? - 必须有更安全的方式吗? – 2011-06-10 14:00:39

+0

@K_scheduler取决于RT版本的好坏。你有硬性和软性调度保证,这一切都取决于实施。我想在硬担保错误是低于1毫秒(不确定寿) – 2011-06-10 14:07:04

+3

作为一个例子,请检查https://rt.wiki.kernel.org/index.php/CONFIG_PREEMPT_RT_Patch – stefaanv 2011-06-10 14:19:51

1

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

2

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

这通常会延长很多延迟,但仍然不能保证,为了进一步减少延迟峰值,您需要迁移到linux的实时分支,或实时操作系统,如VxWorks,RTEMS或QNX。

1

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

+0

谢谢,但系统不能是x86特定的。 – 2011-06-11 12:28:42

0

除了其他建议(例如将调度类设置为SCHED_FIFO)之外,还需要使用编译的Linux内核具有足够高的刻度以满足截止日期。

例如,编译为CONFIG_HZ的100或250 Hz(每秒定时器中断)的内核永远不会对定时器事件的响应速度快于此速度。

您还必须设置定时器,只是一个比实际需要点点更快,因为计时器被允许超越他们要求的时间,但从来没有早到期,这会给你更好的结果。如果你需要1毫秒,那么我建议要求999美元。

相关问题