2012-06-22 79 views
1

在Linux(內核2.6; HZ = 100)上有一個與setitimer一起使用的測試程序。它設置各種定時器,每隔10毫秒發送一次信號(實際上它被設置爲9毫秒,但時間片爲10毫秒)。然後程序運行一段固定的時間(例如30秒)並對信號進行計數。Linux上的setitimer和信號計數。信號計數是否與運行時間成正比?

保證信號計數與運行時間成正比嗎?在每次運行和每個計時器類型(-r -p -v)中,計數都是相同的?

注意,系統上應該沒有其他的cpu-active進程;問題是關於固定HZ內核。

#include <stdlib.h> 
#include <stdio.h> 
#include <signal.h> 
#include <unistd.h> 
#include <sys/time.h> 

/* Use 9 ms timer */ 
#define usecs 9000 

int events = 0; 
void count(int a) { 
    events++; 
} 

int main(int argc, char**argv) 
{ 
    int timer,j,i,k=0; 
    struct itimerval timerval = { 
     .it_interval = {.tv_sec=0, .tv_usec=usecs}, 
     .it_value = {.tv_sec=0, .tv_usec=usecs} 
    }; 
    if ((argc!=2) || (argv[1][0]!='-')) { 
     printf("Usage: %s -[rpv]\n -r - ITIMER_REAL\n -p - ITIMER_PROF\n -v - ITIMER_VIRTUAL\n", argv[0]); 
     exit(0); 
    } 
    switch(argv[1][1]) { 
     case'r': 
      timer=ITIMER_REAL; 
      break; 
     case'p': 
      timer=ITIMER_PROF; 
      break; 
     case'v': 
      timer=ITIMER_VIRTUAL; 
    }; 
    signal(SIGALRM,count); 
    signal(SIGPROF,count); 
    signal(SIGVTALRM,count); 
    setitimer(timer, &timerval, NULL); 
    /* constants should be tuned to some huge value */ 
    for (j=0; j<4; j++) 
     for (i=0; i<2000000000; i++) 
     k += k*argc + 5*k + argc*3; 
    printf("%d events\n",events); 
    return 0; 
} 

回答

0

確保信號計數與運行時間成正比嗎?

是的。一般來說,對於所有三個定時器,代碼運行時間越長,收到的信號數越多。

在每次運行和每個計時器類型(-r -p -v)中計數是否相同?

當定時器被使用ITIMER_REAL設置,在實時計時器遞減。

當它使用ITIMER_VIRTUAL設置時,定時器僅在用戶地址空間中執行進程時遞減。因此,當進程進行系統調用或中斷服務例程時,它不會減少。 因此,我們可以期望在進程的用戶空間執行期間以及當OS正在代表進程執行時(即在系統調用期間),ITIMER_PROF定時器遞減。 So #prof_signals> #virtual_signals

當操作系統沒有代表進程執行時,ITIMER_PROF不會遞減。 So #real_signals> #prof_signals

總而言之,#real_signals> #prof_signals> #virtual_signals。

+0

關於第二個問題:讓我們修復定時器的類型爲REAL;然後開始我們的計劃5次。總信號數是否相同? – osgx

+0

是的。在這種情況下計數應該相同。在高負荷條件下,計數可能會有所不同。 –