2

我想分享一个我最近遇到的测试问题并讨论它:

编写一个 C 程序,粗略测量 UNIX/Linux 系统上内核和用户空间之间的上下文切换开销(不使用 >pthread API)。请指出您的粗略估计所基于的假设。

我想与更高级的 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);
}
4

2 回答 2

2

你应该尝试不同的方法。

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

>内核和用户空间之间的上下文切换开销

从用户到内核的上下文切换是通过syscall. 肯定 printf 下面使用writesyscall,但是这个 syscall 太重而无法获得可靠的估计。为了改进这个估计,你应该回答这个问题——Linux 中最快的系统调用是什么?答案是 -带有无效参数的系统调用。

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

于 2019-02-07T11:50:18.730 回答
0

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

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

最后,正如 Alex Hoppus 所说,结果应该除以 2。

于 2019-02-27T10:52:00.570 回答