我有一个过程要做一些事情,需要在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)
(我会尝试使用ppoll
和timerfd_create
,但我会接受跳过一些毫秒刻度)
您应该告诉我们更多关于您的硬件和内核的信息。我甚至不确定我的台式机i3770K处理器,asus P8Z77V主板(3.13.3PREEMPT
Linux内核)是否能够可靠地处理单毫秒延迟。
(当然,一个简单调用clock_nanosleep
的普通循环,或者更好的是,将timerfd_create
与ppoll
一起使用,通常会完成这项工作。但这不是可靠的…)