我想知道你是否有人知道如何使用函数get_timer() 测量上下文切换的时间
如何找到平均值? 什么时候显示它?
有人可以帮我解决这个问题。
是否有专家知道这一点?
答案 0 :(得分:5)
一种相当简单的方法是让两个线程通过管道进行通信。一个线程会做(伪代码):
for(n = 1000; n--;) {
now = clock_gettime(CLOCK_MONOTONIC_RAW);
write(pipe, now);
sleep(1msec); // to make sure that the other thread blocks again on pipe read
}
另一个主题是:
context_switch_times[1000];
while(n = 1000; n--;) {
time = read(pipe);
now = clock_gettime(CLOCK_MONOTONIC_RAW);
context_switch_times[n] = now - time;
}
也就是说,它将测量一个线程将数据写入管道的时间与另一个线程唤醒并读取该数据的时间之间的持续时间。 context_switch_times
数组的直方图将显示上下文切换时间的分布。
时间将包括管道读写的开销和获取时间,但是,它给出了很大的上下文切换时间感。
在过去,我使用Fedora 13内核和实时FIFO线程进行了类似的测试。我得到的最小上下文切换时间约为4-5 usec。
答案 1 :(得分:3)
我认为我们实际上无法从用户空间中测量这段时间,因为在内核中你永远不知道你的进程在时间片到期后被选中的时间。因此,无论您在用户空间中获得什么,还包括调度延迟。但是,从用户空间开始,您可以进行更接近的测量但不总是精确测量即使是短暂的延迟也很重要。
答案 2 :(得分:1)
我相信LTTng可以用来捕捉上下文切换时序的详细痕迹等。