在C

时间:2019-02-06 10:47:22

标签: c linux-kernel pthreads userspace

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

  

编写一个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);
}

2 个答案:

答案 0 :(得分:1)

您应该尝试其他方法。

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

  

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

从用户到内核的上下文切换是通过syscall完成的。当然,下面的printf使用write系统调用,但是此系统调用太重了,无法获得可靠的估计。为了提高这一估计,您应该回答以下问题-Linux中最快的syscall是什么?答案是-syscall带有无效参数。

P.S。 不要忘记测量精度。另外,您应该将结果除以2,因为syscall是往返行程。

答案 1 :(得分:0)

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

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

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