在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;
}
關於第二個問題:讓我們修復定時器的類型爲REAL;然後開始我們的計劃5次。總信號數是否相同? – osgx
是的。在這種情況下計數應該相同。在高負荷條件下,計數可能會有所不同。 –