我想分享一下我最近遇到的一个测试问题并进行讨论:
编写一个C程序,该程序大致测量UNIX / Linux系统上内核和用户空间之间的上下文切换的开销(不使用> pthread API)。请指出您的粗略估计所基于的假设。
我想与更高级的C程序员讨论这种问题的不同选择。
我对C编程的了解有限,我记录了自己以提供可接受的答案:
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);
}
答案 0 :(得分:1)
您应该尝试其他方法。
如前所述,您正在尝试测量
上下文切换的开销>在内核和用户空间之间
从用户到内核的上下文切换是通过syscall
完成的。当然,下面的printf使用write
系统调用,但是此系统调用太重了,无法获得可靠的估计。为了提高这一估计,您应该回答以下问题-Linux中最快的syscall是什么?答案是-syscall带有无效参数。
P.S。 不要忘记测量精度。另外,您应该将结果除以2,因为syscall是往返行程。
答案 1 :(得分:0)
令人惊讶的是,我在此测试中提供的答案被认为是正确的。
但是,要优化准确性,我们应该排除“ printf”方法,并使用Alex Hoppus提到的带有无效参数的系统调用或空方法。
最后,如Alex Hoppus所述,结果应除以2。