在C中不使用pthread测量开销

在C中不使用pthread测量开销,c,linux-kernel,pthreads,userspace,C,Linux Kernel,Pthreads,Userspace,我想与大家分享我最近遇到的一个测试问题,并就此进行讨论: 编写一个C程序,大致测量UNIX/Linux系统上内核和用户空间之间的上下文切换>的开销(不使用>pthread API)。请说明您的粗略估计所基于的假设 我想与更高级的C程序员讨论这个问题的不同选择 我在C编程方面的知识有限,为了提供一个可接受的答案,我对自己进行了记录: 尽管我的知识有限,但我很快意识到这个问题的模糊性。事实上,这个问题并没有规定答案是否应该以时间或记忆为单位 我个人选择用库time.h和一个非常简单的代码片段来

我想与大家分享我最近遇到的一个测试问题,并就此进行讨论:

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

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

我在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);
}
#包括
#包括
int main(){
时钟开始=时钟();
int i;

对于(i=0;i你应该尝试不同的方法

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

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

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

附言。
别忘了测量精度。你也应该把结果除以2,因为syscall是一个往返过程。

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

然而,为了优化精度,我们应该排除“printf”方法,使用Alex Hoppus提到的带有无效参数的系统调用或空方法


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

测试题使用了不正确的术语。内核模式和用户模式之间的切换在技术上不称为上下文切换。它称为模式切换。您可以通过对非常小的系统调用进行基准测试来衡量模式切换的开销。请参阅以下问题:如果您的循环被另一个不相关的进程中断,该怎么办?您可能会考虑花在这另一个过程上的时间,不是吗?