【问题标题】:How to repeat a process ( or to set a period of process) in linux?如何在linux中重复一个过程(或设置一段过程)?
【发布时间】:2014-02-19 17:00:39
【问题描述】:

我有一个进程在做某事,需要在 1 毫秒后重复。如何在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)

}

谢谢。

【问题讨论】:

  • 你考虑过使用 crontab 吗?
  • 到目前为止你研究/尝试了什么?
  • 使用 sleep(),详见 man 3 sleep
  • @EmilCondrea crontab 持续 1 毫秒?你是认真的吗?
  • @arco444:我开始了解clock_nanosleep(),taks1 可以在执行剩余时间后休眠,直到达到1ms,然后可以重复处理。但我不想让 task1 睡觉。谢谢。

标签: c++ linux timer clock


【解决方案1】:

在 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);
}

【讨论】:

  • 它可能不够可靠。 usleep 已过时并从 Posix 2008 中删除。
  • @BasileStarynkevitch 你说得对,先生。 nanosleep() 应改为使用。关于可靠性,我想这取决于作者需要它有多精确。
【解决方案2】:

阅读time(7)

一毫秒真的是很短的一段时间。 (你不能忍受十毫秒的延迟吗?)。我不确定普通笔记本电脑硬件上的常规 Linux 上的常规进程能否可靠处理这么短的时间。也许您需要RTLinux 或至少需要实时调度(参见sched_setscheduler(2)this question),也许还需要一个特别配置的最新3.x 内核

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

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

你可能有一些事件循环,考虑使用ppoll(2)timer_create(2)(另见timer_getoverrun(2)...)和/或timerfd_create(2)clock_nanosleep(2)

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

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

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

【讨论】:

  • 以上答案仍然与您更新的问题相关。你仍然应该解释为什么你想要一毫秒的时间。您的应用程序到底在做什么?循环内部发生了什么(除了毫秒等待)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 2019-10-18
  • 2013-08-21
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 2015-05-16
相关资源
最近更新 更多