2011-09-18 38 views
2

我想知道如果你们谁知道如何使用功能get_timer() 测量时间上下文切换上下文切换测量时间

如何找到平均? 什么时候显示它?

有人可以帮我解决这个问题。

是否有专家知道这一点?

+0

如果你添加了一个标签,说明*你正在谈论/感兴趣的内核(例如,Linux,OSX/Darwin,Windows等),那么这可能会有所帮助 –

+1

[写一个C程序来测量在Linux操作系统上下文切换花费的时间](http://stackoverflow.com/questions/2368384/write-ac-program-to-measure-time-spent-in-context-switch-in-linux-os) –

+0

@ Jerry Coffin 这是一个Linux内核 – soker

回答

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。

3

我不认为我们可以从用户空间实际测量这个时间,因为在内核中你永远不知道什么时候你的进程在时间片到期之后被提取出来。所以无论你在用户空间中得到什么,都包括调度延迟。但是,从用户空间中可以得到更接近的测量值,但始终不准确。即使是很短暂的延迟也很重要。

1

我相信LTTng可以用来捕获上下文切换时序的详细跟踪等等。