如何在linux中重复一个进程(或设置一个进程周期)



我有一个过程要做一些事情,需要在1ms后重复。如何在linux上设置进程的周期?

我在英特尔i7-2600 CPU(总共8核)上使用linux 3.2.0-4-rt-amd64(带有rt Preempt补丁)@3.40 Ghz。基本上,我在代码中显示的while循环中有大约6个线程,我希望线程每1毫秒执行一次。最后,我想测量每个线程的延迟。

那么如何设置1ms的周期呢?

例如,在下面的代码中,如何在每1ms后重复Task1?

while(1){
//Task1(having threads)
}

谢谢。

while循环中对usleep(1000)的调用将完成此任务,即:

while (1) {
// Task1
usleep(1000); // 1000 microseconds = 1 millisecond
}

编辑

由于usleep()已经被弃用,取而代之的是nanosleep(),所以让我们使用后者:

struct timespec timer;
timer.tv_sec = 0;
timer.tv_nsec = 1000000L;
while (1) {
// Task1
nanosleep(&timer, NULL);
}

读取时间(7)。

一毫秒实际上是一小段时间。(你不能忍受例如十毫秒的延迟吗?)。我不确定普通笔记本电脑硬件上的常规Linux上的常规进程是否能够在这么短的时间内可靠地处理。也许您需要RTLinux,或者至少需要实时调度(请参阅sched_setscheduler(2)和这个问题),也许还需要一个经过特殊配置的最新3.x内核

您不能确定您的处理(在循环内)是否小于一毫秒。

您应该解释应用程序在做什么,以及循环内部发生了什么。

您可能有一些事件循环,可以考虑使用ppoll(2)、timer_create(2)(另请参阅timer_getoverride(2…)和/或timerfd_create(2)和clock_nanosleep(2)

(我会尝试使用ppolltimerfd_create,但我会接受跳过一些毫秒刻度)

您应该告诉我们更多关于您的硬件和内核的信息。我甚至不确定我的台式机i3770K处理器,asus P8Z77V主板(3.13.3PREEMPTLinux内核)是否能够可靠地处理单毫秒延迟。

(当然,一个简单调用clock_nanosleep的普通循环,或者更好的是,将timerfd_createppoll一起使用,通常会完成这项工作。但这不是可靠的…)

最新更新