itimer到期

时间:2012-10-03 08:31:26

标签: c timer linux-kernel

我正在使用周期性计时器,并在收到两个SIGALRM信号之间花费时间。我观察到的是itimer可能会在我设定之前或之后稍微过期。例如如果我将其设置为1m sec,则可能会在0.9998msec1.0023msec过期。

定时器到期时间是否应该总是大于设定值?花费更少的时间是我不理解的。

这是我的代码:

enter code here     
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <stdlib.h>
#include <time.h>

#define INTERVAL 1000


struct timespec ti[100];
int s=0;


void ex(int i)
{int d=0;
struct timespec t[100],s1,s2;
   for(d=0;d<99;d++)
    {
    s1= ti[d];
    s2= ti[d+1];
   printf("%u:%u\t%u:%u\t", s1.tv_sec, s1.tv_nsec, s2.tv_sec, s2.tv_nsec);

    if ((s2.tv_nsec- s1.tv_nsec)<0) {
        t[d].tv_sec = s2.tv_sec-s1.tv_sec-1;
        t[d].tv_nsec = 1000000000 +s2.tv_nsec -s1.tv_nsec;
    } else {
        t[d].tv_sec = s2.tv_sec-s1.tv_sec;
        t[d].tv_nsec = s2.tv_nsec-s1.tv_nsec;
    }

    printf("%u:%u\n",t[d].tv_sec,t[d].tv_nsec);  

    } 
   exit(0);
}

void alarm_wakeup (int i)
{  
   clock_gettime(CLOCK_MONOTONIC, &ti[s]); 
    s++;
    if(s==100)
    { ex(0);
    }
}


void main ()
{
  struct itimerval tout_val;
  tout_val.it_interval.tv_sec = 0;
  tout_val.it_interval.tv_usec = INTERVAL;
  tout_val.it_value.tv_sec = 0; 
  tout_val.it_value.tv_usec = INTERVAL;


  setitimer(ITIMER_REAL, &tout_val,0);

  signal(SIGALRM,alarm_wakeup); /* set the Alarm signal capture */
 signal(SIGINT,ex);

  while (1)
{ 
}

}

1 个答案:

答案 0 :(得分:0)

当计时器到期时,信号被提升并重新安排计时器。

但是,在引发信号和处理信号之间可能存在延迟 - 如果进程尚未运行,则必须重新安排。这意味着在计时器的实际到期和信号处理程序中的clock_gettime()调用运行之间存在潜在的可变延迟。

如果clock_gettime()调用之前的此延迟比下一次调用高一次,则clock_gettime()调用之间的时间将略小于1ms,即使后续计时器之间存在1ms的间隔到期。

以图表形式:

time:                0ms...............1ms...............2ms...............3ms
timer expiry:        X                 X                 X                 X
signal handler runs:  S                      S            S                  S

你可以看到第二个信号处理程序运行之前的较长延迟使得第三个信号看起来是“早期”,即使基础计时器不是。