要解决的问题
- 通过什么方式实现上下文的切换,并且方便测量时间。
- 如何保证在具有多个CPU的系统中,保证上下文切换的进程处于同一个处理器上
上下文切换的方式
利用两个管道,测量在父子进程之间互相切换的时间成本,具体流程见下图
[管道的介绍](Linux管道通信 | SnowDawn’Home)
使用双管道在父子进程之间相互切换
- 父进程向管道
Pi1
写入获取到的开始时的时间,使用gettimeofday()
函数 - 父进程从
Pi2
读取,但是此时的Pi2
中还没有内容写入,所以父进程陷入等待,系统切换到子进程 - 子进程从
Pi1
中读取开始的时间,并且记录此时的时间,与开始的时间相减,输出切换的时间 - 子进程向
Pi2
中写入开始时间,此时切换到等待读取的子进程,再次算出一个切换时间
使切换进程保证在同一个处理器上
使用sched_seaffinity()
调用实现,该函数的参数比较复杂,这里只是简单的使用,没有详细的研究与介绍。
测量程序代码(标明在注释中)
1 |
|
测试程序的运行结果如下
1 | 90 |
对测试结果的分析
在十次循环的测量中,开始的一次和最后的一次测量时间较长,具体为何会出现这样的情况有以下猜测:
- 对于刚创建的子进程,还未进入到系统的缓存,进程之间的切换较慢。
- 对于最后一次测量上下文切换时间,待解决,择日向老师请教。
另,此测试程序得到的结果并不只是上下文切换的时间,还包括对读和写的系统调用,将字符串转化为数字,设置cpu亲和度的调用等时间,根据之前对系统调用的测量,并且忽略其他细小的时间消耗,该系统的上下文切换时间应该在 4 – 5 微秒。