2012-10-03 16 views
0

我正在使用週期性定時器,並在接收到兩個SIGALRM信號之間花費時間。我觀察到的結果是itimer可能會在我設定的時間之前或稍後過期。例如如果我將它設置爲1m sec,則可能會在0.9998msec1.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) 
{ 
} 

} 

回答

0

當計時器到期時,信號被提升,定時器改期。

但是,在信號產生和信號處理之間可能存在延遲 - 如果過程未運行,則必須重新調度。這意味着在計時器的實際到期時間和信號處理程序中調用clock_gettime()運行時間之間存在潛在的可變延遲。

如果在clock_gettime()調用之前的這個延遲比下一個更高一個迭代,那麼即使在隨後的定時器到期之間存在1ms的間隔,調用之間的時間也會略小於1ms。

以圖解形式:

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

你可以看到第二個信號處理程序之前的較長延遲跑所做的第三信號似乎是「早」,即使底層計時器沒有。

+0

首先感謝回覆@caf ..所以,我的理解是,小於時間間隔的測量是由於我的處理程序運行有點遲。當我運行這個程序時,系統的負載非常輕,我仍然得到這些變化。如果我的系統高負載,我的處理程序可能會安排更多的不確定性導致更多的變化。對?其次,這可能是內核本身可能會在計時之前過一會兒嗎? –

+0

還有一個問題....:D .....到期時間(圖中的X標記)是否會在加載系統中遲到? –

+0

@ tulips6:是的,如果你的系統負載更高,變化趨向於更大。如果你把你的過程放在一個實時的優先級中,那麼這應該被減少。到期時間不能早。他們可能會遲到,但下一個到期時間總是從計時器*應該*到期時開始計算。 – caf