在Linux中使用C ++实现低开销间隔计时器

时间:2014-11-04 18:14:29

标签: c++ linux timer overhead

我正在尝试实现一个后台用户空间程序,它将在Linux中每100ms执行各种任务和计算。我可以通过在Linux中使用警报信号来实现这一点,以下结构是我实现间隔计时器的方式。

void timer_handler (int signum){
    printf("In timer handler!\n");
}

int main (){

    struct sigaction s_action;
    struct itimerval timer;

    /* Set Up a Timer */
    /* Install timer_handler as the signal handler for SIGVTALRM. */
    memset (&s_action, 0, sizeof (s_action));
    s_action.sa_handler = &timer_handler;
    sigaction (SIGVTALRM, &s_action, NULL);

    /* Timer configuration for 100ms */
    timer.it_value.tv_sec = 0;
    timer.it_value.tv_usec = 100000;
    timer.it_interval.tv_sec = 0;
    timer.it_interval.tv_usec = 100000;

    /* Set up the timer */
    setitimer (ITIMER_VIRTUAL, &timer, NULL);

    while(1);
}
然而,由于无限循环,这种方法似乎不是(在性能方面)这样做的最佳方式。它显着提高了CPU利用率。一旦它开始在后台运行,我的其他程序的性能降低了15%。

我理想的是要有一个程序,除非发生定时器中断,否则会继续睡眠。多线程似乎是一种选择,但我对该主题不是很有经验。我将非常感谢有关如何以最小的开销实现此类程序的任何建议或指示。

1 个答案:

答案 0 :(得分:0)

阅读time(7)signal(7)timerfd_create(2)poll(2)nanosleep(2)Advanced Linux Programming

您的信号处理程序不正确(不应调用printf;它可以write)。

你可以

while(1) poll(NULL, 0, 1);

但可能在使用poll初始化的文件描述符上使用timerfd_create的真实事件循环应该更好。

我当然假设您相信每个周期性任务的持续时间都比周期少得多。 (例如,每个任务需要的时间不超过50毫秒,但周期为100毫秒)。