gpt4 book ai didi

linux - 在 Linux 上设置定时器和信号计数。信号计数与运行时间成正比吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:45 28 4
gpt4 key购买 nike

有一个测试程序可以在 Linux(内核 2.6;HZ=100)上使用 setitimer。它设置各种定时器每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;
}

最佳答案

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

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

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

没有。

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

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

ITIMER_PROF 计时器在进程的用户空间执行期间和操作系统代表进程执行时(即在系统调用期间)递减。所以#prof_signals > #virtual_signals

当操作系统不代表进程执行时,ITIMER_PROF 不会递减。所以#real_signals > #prof_signals

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

关于linux - 在 Linux 上设置定时器和信号计数。信号计数与运行时间成正比吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11158377/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com