我有一个过程可以做一些事情,需要在1ms后重复。如何在linux上设置进程的周期?
我在Intel i7 -2600 CPU(总共8个核心)@ 3.40 Ghz上使用linux 3.2.0-4-rt-amd64(带RT-Preempt补丁)。 基本上我在代码中显示的while循环中有大约6个线程,我希望线程每1毫秒执行一次。最后,我想测量每个线程的延迟。
那么如何设置1ms的周期?
例如在下面的代码中,如何在每1ms之后重复Task1?
while(1){
//Task1(having threads)
}
谢谢。
答案 0 :(得分:0)
阅读time(7)。
一毫秒真的是很短的一段时间。 (你不能承受例如10毫秒的延迟吗?)。我不确定普通笔记本电脑硬件上普通Linux上的常规流程是否能够在如此短的时间内可靠地处理 。也许您需要RTLinux或至少需要实时调度(请参阅sched_setscheduler(2)和this question)以及可能是特别配置的最新3.x内核
您无法确定您的处理(在循环内)是否小于毫秒。
您应该解释您的应用程序正在做什么,以及循环内部发生了什么。
您可能有一些事件循环,请考虑使用ppoll(2),timer_create(2)(另请参阅timer_getoverrun(2) ...)和/或timerfd_create(2)和clock_nanosleep(2) < / p>
(我会尝试使用ppoll
和timerfd_create
,但我会接受一些毫秒的刻度来跳过)
您应该告诉我们有关您的硬件和内核的更多信息。我甚至不确定我的台式机i3770K处理器,华硕P8Z77V主板(3.13.3 PREEMPT
Linux内核)是否能够可靠地处理一毫秒的延迟。
(当然,只需调用clock_nanosleep
的简单循环,或者更好,使用timerfd_create
ppoll
,通常会完成工作。但是不是可靠 ...)
答案 1 :(得分:0)
在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);
}