2011-09-18 79 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可以用來捕獲上下文切換時序的詳細跟蹤等等。