在Linux中用C++实现一个低开销的间隔定时器

Implementing a low-overhead interval timer with C++ in Linux

本文关键字:开销 一个 定时器 中用 Linux C++ 实现      更新时间:2023-10-16

我正在尝试实现一个后台用户空间程序,该程序将在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%。

理想情况下,我想要的是有一个程序,除非计时器中断,否则它将保持睡眠。多线程似乎是一种选择,但我对这个主题没有太多经验。我将感谢任何关于如何以最小的开销实现这样的程序的建议或指针。

读取时间(7)、信号(7),timerfd_create(2)、轮询(2),nanosleep(2)和高级Linux编程。

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

你可以有

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

但是在用CCD_ 4初始化的文件描述符上使用CCD_。

当然,我认为你相当有信心,每一项周期性任务的持续时间都比这段时间短得多。(例如,每个任务不需要超过50毫秒,但具有100毫秒的周期)。