Linux上的setitimer和信号计数。信号计数是否与运行时间成正比?

时间:2012-06-22 14:37:35

标签: linux linux-kernel profiling setitimer

在Linux上有一个与setitimer一起使用的测试程序(内核2.6; HZ = 100)。它设置各种itimers每10 ms发送一次信号(实际上它设置为9ms,但时间片为10 ms)。然后程序运行一段固定的时间(例如30秒)并对信号进行计数。

是否保证信号计数与运行时间成正比?每次运行和每个计时器类型(-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;
}

1 个答案:

答案 0 :(得分:0)

是否保证信号计数与运行时间成正比?

是。通常,对于所有三个定时器,代码运行的时间越长,接收的信号数量就越多。

每次运行和每个计时器类型(-r -p -v)的计数是否相同?

没有。

当使用ITIMER_REAL设置定时器时,定时器实时递减。

当使用ITIMER_VIRTUAL设置时,定时器仅在进程在用户地址空间中执行时递减。因此,当进程进行系统调用或在中断服务程序期间,它不会减少。 所以我们可以期待#real_signals&gt; #virtual_signals

ITIMER_PROF定时器在进程的用户空间执行期间以及OS代表进程执行时(即在系统调用期间)递减。 所以#prof_signals&gt; #virtual_signals

当OS未代表进程执行时,ITIMER_PROF不会减少。所以#real_signals&gt; #prof_signals

总结一下,#real_signals&gt; #prof_signals&gt; #virtual_signals。