2012-12-19 19 views
12

在支持時間戳計數器(TSC)的處理器中,Linux使用TSC提供高分辨率定時器選項。根據我的理解,TSC是一個可以讀取的寄存器,但不提供以配置的速率中斷CPU的選項。因此,對於Linux中的定時器中斷生成,仍然必須依賴I/O APIC(在x86上),HZ值通常設置爲1000或250.是否使用TSC作爲時鐘源提高定時器和調度粒度?

即使TSC以微秒粒度給出時間戳,計時器/調度粒度仍然會在4ms或1ms,具體取決於HZ值。這種理解是否正確?或者有沒有一種選擇可以改善使用TSC的定時器粒度?

+0

如果你想獲得一些計時器事件經常以很高的精度,它是實時系統的任務。通過使用內核的實時機制或在多核系統上使用進程親和性來實現大致相似的行爲(所以您需要實時執行的進程僅安排到一個內核,而其他進程則不能在該核心上運行)。 –

回答

9

在默認的Linux 2.6內核中,可編程中斷控制器(PIT)(可在所有PC上使用)用作系統定時器[1]。顧名思義,PIT可以被編程(通常在內核啓動時)以預定速率中斷CPU。這個預定的速率是你所指的HZ值,它是一個靜態編譯的值,等於內核編譯參數CONFIG_HZ。[2]因此,您可以在編譯時修改CONFIG_HZ,並且PIT將以上述頻率開始中斷CPU。但是請記住,PIT由內部驅動,時鐘頻率約爲1.193 MHZ,因此將CONFIG_HZ設置爲大於此值並不是一個好主意。並且如在[3]

在多處理器系統上的本地APIC(Advanded可編程中斷 控制器)的定時器用於處理器間 同步

,並通過在解釋要指出的[1] ,我相信它的PIT(而不是本地APIC)與HZ值有關(至少直到2.6內核)。

現在,理論上你的想法看起來正確。像本地APIC和PIT這樣的時間戳計數器是另一個時間源[1]。在[4]中,你會發現對此的確認。

Linux可能利用這個寄存器的優勢得到更準確的 時間測量,比那些由可編程間隔定時器 交付。爲此,Linux在初始化系統時必須確定時鐘信號頻率 。實際上,因爲編譯內核時聲明的頻率不是 ,所以相同的內核映像可能會在其時鐘可能以任何頻率打勾的CPU上運行。

但是,請記住時間戳計數器在每個CPU時鐘週期都會遞增。這使我們陷入與CPU時鐘週期相關的計數器相關的棘手問題[5]。一個例子是現代CPU可以改變它們的CPU時鐘頻率以節省電力,這會影響存儲在時間戳計數器中的值。如果發生這種情況,您可以估計它對時間測量的影響。而且,一個完全空閒的內核可能會調用HALT指令,直到接收到外部中斷爲止,該指令將一直停止處理器。所有這些時間,TSC永遠不會增加,你會失去一些寶貴的'增量',否則會使你的測量更精確。簡言之,處理TSC是一個難題,不適合用作可編程中斷。

  1. Robert Love,LKD - 第3版。(第11章)
  2. http://lxr.linux.no/linux+v2.6.31/arch/x86/include/asm/param.h#L5
  3. http://www.6test.edu.cn/~lujx/linux_networking/0131777203_ch02lev1sec7.html
  4. http://www.makelinux.net/books/ulk3/understandlk-CHP-6-SECT-1
  5. http://lwn.net/Articles/209101/
+2

優秀的答案。還有一個額外的複雜因素:在多CPU系統上,各個內核都有自己的代碼,這些代碼可能會或可能不會被同步,具體取決於體系結構,BIOS和月球的相位。在**做**具有同步時鐘的架構中,RDTSC用作*序列點*,實際上是一個爬行器。高度無憂無慮。 – wildplasser