在 C 中没有 pthread 的情况下测量开销

Measure overhead without pthread in C

分享一个最近遇到的一道试题,大家一起讨论一下:

Write a C program that roughly measures the overhead of a context switch >between the kernel and userspace on a UNIX/Linux system (without using the >pthread API). Please indicate the assumptions your rough estimation is based >on.

我想与更高级的 C 程序员讨论这个问题的不同选择。

我对 C 编程的了解有限,我记录了自己以提供一个可接受的答案:

https://eli.thegreenplace.net/2018/measuring-context-switching-and-memory-overheads-for-linux-threads/

https://www.researchgate.net/post/How_can_I_measure_thread_creation_and_destruction

https://github.com/eliben/code-for-blog/blob/master/2018/threadoverhead/thread-pipe-msgpersec.c

尽管我知识有限,但我很快意识到这个问题的含糊不清。事实上,这个问题并没有规定是否应该以时间或内存为单位给出答案。

我个人选择使用库 time.h 和一个非常简单的片段来开发我的推理测量时间。结果应除以 1 000 000。

我的回答是否有意义,还是我完全没有抓住要点?

#include<time.h>
#include<stdio.h>
int main(){
    clock_t begin=clock();

    int i;
    for(i=0;i<1000000;i++){
        printf("%d",i);
    }
    clock_t end=clock();
    printf("Time taken:%lf",(double)(end-begin)/CLOCKS_PER_SEC);
}

你应该尝试不同的方法。

如前所述,您正在尝试衡量

overhead of a context switch >between the kernel and userspace

从用户到内核的上下文切换是通过 syscall 完成的。可以肯定的是,下面的 printf 使用了 write 系统调用,但是这个系统调用太重了,无法获得可靠的估计。要改进此估计,您应该回答以下问题 - linux 中最快的系统调用是什么?答案是 - syscall 参数无效。

P.S。 不要忘记测量精度。另外,您应该将结果除以 2,因为系统调用是往返的。

令人惊讶的是,我上面提供的答案在这次测试中被认为是正确的。

然而,为了优化准确性,我们应该排除 "printf" 方法,并使用 Alex Hoppus 提到的具有无效参数的系统调用或空方法。

最后,结果应除以 2,如 Alex Hoppus 所述。