0
我正在使用週期性定時器,並在接收到兩個SIGALRM
信號之間花費時間。我觀察到的結果是itimer
可能會在我設定的時間之前或稍後過期。例如如果我將它設置爲1m sec
,則可能會在0.9998msec
或1.0023msec
處過期。itimer過期
不應該計時器到期總是會比設置的更大?更少的時間是我不明白的。
這裏是我的代碼:
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)
{
}
}
首先感謝回覆@caf ..所以,我的理解是,小於時間間隔的測量是由於我的處理程序運行有點遲。當我運行這個程序時,系統的負載非常輕,我仍然得到這些變化。如果我的系統高負載,我的處理程序可能會安排更多的不確定性導致更多的變化。對?其次,這可能是內核本身可能會在計時之前過一會兒嗎? –
還有一個問題....:D .....到期時間(圖中的X標記)是否會在加載系統中遲到? –
@ tulips6:是的,如果你的系統負載更高,變化趨向於更大。如果你把你的過程放在一個實時的優先級中,那麼這應該被減少。到期時間不能早。他們可能會遲到,但下一個到期時間總是從計時器*應該*到期時開始計算。 – caf