Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux上设置计数器和信号计数。信号计数是否与运行时间成正比?_Linux_Linux Kernel_Profiling_Setitimer - Fatal编程技术网

在Linux上设置计数器和信号计数。信号计数是否与运行时间成正比?

在Linux上设置计数器和信号计数。信号计数是否与运行时间成正比?,linux,linux-kernel,profiling,setitimer,Linux,Linux Kernel,Profiling,Setitimer,在Linux(内核2.6;HZ=100)上,有一个测试程序可用于setitimer。它将各种itimers设置为每10毫秒发送一次信号(实际上设置为9毫秒,但时间片为10毫秒)。然后程序运行一段固定时间(例如30秒)并对信号进行计数 是否保证信号计数与运行时间成正比?每次运行和每种计时器类型(-r-p-v)的计数是否相同 注意,系统上应该没有其他cpu活动进程;问题是关于固定HZ内核 #include <stdlib.h> #include <stdio.h> #incl

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

是否保证信号计数与运行时间成正比?每次运行和每种计时器类型(-r-p-v)的计数是否相同

注意,系统上应该没有其他cpu活动进程;问题是关于固定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;
}
#包括
#包括
#包括
#包括
#包括
/*使用9毫秒计时器*/
#定义USECS9000
int事件=0;
无效计数(整数a){
事件++;
}
int main(int argc,字符**argv)
{
int定时器,j,i,k=0;
结构itimerval timerval={
.it_interval={.tv_sec=0,.tv_usec=usecs},
.it_值={.tv_sec=0,.tv_usec=usecs}
};
如果((argc!=2)|(argv[1][0]!='-')){
printf(“用法:%s-[rpv]\n-r-ITIMER\u REAL\n-p-ITIMER\u PROF\n-v-ITIMER\u VIRTUAL\n”,argv[0]);
出口(0);
}
开关(argv[1][1]){
案例“r”:
定时器=ITIMER\u REAL;
打破
案例“p”:
定时器=ITIMER_PROF;
打破
案例“v”:
定时器=ITIMER\u虚拟;
};
信号(信号、计数);
信号(SIGPROF,计数);
信号(SIGVTALRM,计数);
setitimer(计时器和timerval,NULL);
/*常数应该调整到某个巨大的值*/
对于(j=0;j是否保证信号计数与运行时间成比例

是的。一般来说,对于所有三个计时器,代码运行的时间越长,接收到的信号数量越多

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

没有

使用ITIMER_REAL设置计时器时,计时器将实时递减

当使用ITIMER_VIRTUAL设置时,计时器仅在进程在用户地址空间中执行时递减。因此,当进程进行系统调用或在中断服务例程期间,计时器不会递减。 所以我们可以预期#真实信号#虚拟信号#

ITIMER_PROF计时器在进程的用户空间执行期间以及操作系统代表进程执行时(即在系统调用期间)都会减小。 所以,教授信号>虚拟信号

当操作系统不代表进程执行时,ITIMER PROF不会减小。因此,real PROF信号>PROF PROF信号


总之,#真实信号>#教授信号>#虚拟信号。

关于第二个问题:让我们将计时器类型固定为真实,然后启动程序5次。总信号计数是否相同?是的。在这种情况下,计数应该相同。在高负载条件下,计数可能会不同。