我想知道在linux下,一个程序/线程是否在c中被调度/调度,如果可能的话,调度的频率是多少。原因是我正在测量循环的运行时间,并希望防止出现错误的结果。
这是一个最小的例子:

#include <stdio.h>

int times_dispatched() {
    // how to check?
    return 0;
}

int main() {
    int i, dummy = 0;
    for(i=0; i<10000000; i++) {
        dummy++;
    }

    printf("counted to %d; program was dispatched %d times\n", dummy, times_dispatched());
}

最佳答案

在Linux上,您可以使用getrusage函数。

#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>

int times_dispatched(long *vol, long *invol) {
    struct rusage usage;
    int err;

    if ((err = getrusage(RUSAGE_SELF, &usage)) != 0) {
        return err;
    }

    *vol   = usage.ru_nvcsw;
    *invol = usage.ru_nivcsw;

    return 0;
}

测试应用:
#include <stdlib.h>
#include <stdio.h>

#define LOOPS 100000000

static void loop(volatile unsigned int count) {
    while(count--) { }
}

int main(void) {
    long vol, invol;

    loop(LOOPS);

    if (times_dispatched(&vol, &invol) != 0) {
        fprintf(stderr, "Unable to get dispatch stats");
        exit(1);
    }
    printf("Context switches: %ld voluntarily, %ld involuntarily\n",
        vol, invol);

    return 0;
}

Ideone输出:
Context switches: 3 voluntarily, 283 involuntarily

我想知道为什么它会显示非零自动切换,可能是因为使用了IDEONE…在我的桌面上,它总是零,正如预期的那样。

关于c - 是否可以检查在Linux下用C调度/调度程序的频率(以及调度频率),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11834153/

10-13 04:49