1

setitimerLinux (カーネル 2.6; HZ=100) で動作するテスト プログラムがあります。10ミリ秒ごとに信号を送信するようにさまざまなタイマーを設定します(実際には9ミリ秒に設定されていますが、タイムスライスは10ミリ秒です)。次に、プログラムは一定時間 (たとえば 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;
}
4

1 に答える 1

0

信号数が実行時間に比例することが保証されていますか?

はい。一般に、3つのタイマーすべてについて、コードの実行時間が長いほど、受信する信号の数が多くなります。

カウントは、すべての実行とすべてのタイマータイプ(-r -p -v)で同じになりますか?

いいえ。

ITIMER_REALを使用してタイマーを設定すると、タイマーはリアルタイムでデクリメントします。

ITIMER_VIRTUALを使用して設定されている場合、タイマーは、プロセスがユーザーアドレス空間で実行されているときにのみデクリメントされます。したがって、プロセスがシステムコールを行うとき、または割り込みサービスルーチン中にデクリメントすることはありません。したがって、#real_signals>#virtual_signalsが期待できます

ITIMER_PROFタイマーは、プロセスのユーザースペース実行中と、プロセスに代わってOSが実行されているとき、つまりシステムコール中の両方でデクリメントします。つまり、#prof_signals> #virtual_signals

プロセスに代わってOSが実行されていない場合、ITIMER_PROFはデクリメントしません。つまり、#real_signals> #prof_signals

要約すると、#real_signals>#prof_signals>#virtual_signalsです。

于 2012-10-31T04:03:59.923 に答える