熟悉了基本的程式設計方法之後,我們的興趣就在於,電腦如何實現這一切的呢? 在那些應用層 API 和底層系統硬體之間,作業系統和庫函數究竟做了些什麼?
首先看下 Linux 時間處理的一般過程:
圖 1. 時間處理過程
應用程式部分已經在第一部分詳細介紹過了,在第二部分我將介紹硬體和 GlibC 相關實現的一些概況。
硬體
PC 機裡常見的時鐘硬體有以下這些。
RTC (Real Time Clock,系統時鐘)
人們需要知道時間的時候,可以看看鐘錶。 電腦系統中鐘錶類似的硬體就是外部時鐘。 它依靠主機板上的電池,在系統斷電的情況下,也能維持時鐘的準確性。 電腦需要知道時間的時候,就需要讀取該時鐘。
在 x86 體系中,這個時鐘一般被稱為 Real Time Clock。 RTC 是主機板上的一個 HTTP://www.aliyun.com/zixun/aggregation/19282.html">CMOS 晶片,比如 Motorola 146818,該晶片獨立于 CPU 和其他晶片,可以通過 0x70 和 0x71 埠操作 RTC。 RTC 可以週期性地在 IRQ 8 上觸發中斷,但精度很低,從 2HZ 到 8192HZ。
以 Motorola 146818 為例,軟體可以通過 I/O 指令讀寫以下這些值:
圖 2. Motorola 146818
可以看到,RTC 能提供精確到秒的即時時間值。
TSC (Time Stamp Counter)
CPU 執行指令需要一個外部振盪器產生時鐘信號,從 CLK 管腳輸入。 x86 提供了一個 TSC 寄存器,該寄存器的值在每次收到一個時鐘信號時加一。 比如 CPU 的主頻為 1GHZ,則每一秒時間內,TSC 寄存器的值將增加 1G 次,或者說每一個納秒加一次。 x86 還提供了 rtdsc 指令來讀取該值,因此 TSC 也可以作為時鐘設備。 TSC 提供了比 RTC 更高精度的時間,即納秒級的時間精度。
PIT (Programmable Interval Timer)
PIT 是 Programmable Interval Timer 的縮寫,該11585.html">硬體設備能定時產生中斷。 早期的 PIT 設備是 8254,現在多數可以集成在 Intel 的 I/O Control Hub 電路中,可以通過埠 0x40~0x43 訪問 PIT。 系統利用 PIT 來產生週期性的時鐘中斷,時鐘中斷通過 8259A 的 IRQ0 向 CPU 報告。 它的精度不高,其入口 clock 的頻率為 1MHz,理論上能產生的最高時鐘頻率略小於 0.5MHz。 實際系統往往使用 100 或者 1000Hz 的 PIT。
HPET (High Precision Event Timer)
PIT 的精度較低,HPET 被設計來替代 PIT 提供高精度時鐘中斷(至少 10MHz)。 它是由微軟和 Intel 17872.html">聯合開發的。 一個 HPET 包括了一個固定頻率的數值增加的計數器以及 3 到 32 個獨立的計時器,這每一個計時器有包涵了一個比較器和一個寄存器(保存一個數值,表示觸發中斷的時機)。 每一個比較器都比較計數器中的數值和寄存器中的數值,當這兩個數值相等時,將產生一個中斷。