linux核心裡面用了很多的時鐘,其實這些時鐘的用處無外乎就幾種:1.作為心跳,中斷cpu;2.使得使用者可以擷取目前時間;3.實時測量;4.定時 服務。知道了使用目的後,我們來看看到底有哪些時鐘供我們選擇使用:關于這些時鐘的概念,網上已經存在不少文章了,為了不重複(浪費網際網路空間),咱就先來個引用。
/*摘錄開始:http://blog.chinaunix.net/u1/55599/showart.php?id=1179259
1):實時時鐘(RTC)
該時鐘獨立于CPU和其它晶片.即使PC斷電,該時鐘還是繼續運作.該計時由一塊單獨的晶片處理,并把時鐘值存放CMOS.該時間可參在IRQ8上周期性的産生時間信号.頻率在2Hz ~ 8192Hz之間.但在linux中,隻是用RTC來擷取目前時間.
2):時間戳計時器(TSC)
CPU附帶了一個64位的時間戳寄存器,當時鐘信号到來的時候.該寄存器内容自動加1
3):可程式設計中斷定時器(PIC)
該裝置可以周期性的發送一個時間中斷信号.發送中斷信号的間隔可以對其進行程式設計控制.在linux系統中,該中斷時間間隔由HZ表示.這個時間間隔也被稱為一個節拍(tick).
在 ./include/asm-i386/param.h 定義
10#ifndef HZ
11#define HZ 100
12#endif
4):CPU本地定時器
在處理器的本地APIC還提供了另外的一定定時裝置.CPU本地定時器也可以單次或者周期性的産生中斷信号.與上次描述的PIC相比.它有以下幾點的差別:
APIC本地計時器是32位.而PIC是16位.由此APIC本地計時器可以提供更低頻率的中斷信号
本地APIC隻把中斷信号發送給本地CPU.而PIC發送的中斷信号任何CPU都可以處理
APIC定時器是基于總線時鐘信号的.而PIC有自己的内部時鐘振蕩器
5):高精度計時器(HPET)
在linux2.6中增加了對HPET的支援.HPET是一種由intel開發的新型定時晶片.該裝置有一組寄時器,每個寄時器對應有自己的時鐘信号,時鐘信号到來的時候就會自動加1.一個 hpet包括了一個固定頻率的數值增加的計數器以及3到32個獨立的計時器,這每一個計時器有包涵了一個比較器和一個寄存器(儲存一個數值,表示觸發中斷時機)。每一個比較器都比較計數器中的數值和寄存器中的數值,當這兩個數值相等時,将産生一個中斷
實際上,在intel多理器系統與單處理器系統還有所不同:
在單處理系統中.所有計時活動過由PIC産生的時鐘中斷信号觸發的
在多處理系統中,所有普通活動是由PIC産生的中斷觸發.所有具體的CPU活動,都由本地APIC觸發的.
*/摘錄完畢
好了,上面對這麼多種時鐘的概念已經闡述的很清楚了,那麼他們之間到底有何聯系呢?幸運的是,在2.6.21核心以後,一切變得不言自明了,2.6.21以上核心将時鐘架構進行了進一步的抽象整理,抽象出了兩個概念:
struct clocksource :對硬體時鐘裝置的抽象,描述時鐘源,強調靜态事物,源頭
struct clock_event_device :時鐘的事件的抽象,描述硬體時鐘中斷發生時要執行的動作,強調在時鐘源上面的動态方面。
這兩個概念被抽象出來以後,我們就可以用面向對象的思路來分析了。仔細看看這兩個概念,它們的偶合性極低,但是還是有聯系的,比如如果你将 clock_event_device設定成one-shot,而clocksource确是一個精度及其低的時鐘源,那麼系統的響應将會相當慢,它們實 際上會影響到對方。
仔細研究一下上面的衆多時鐘,有的可以産生中斷,有的僅僅是一個計數器,有的...,那麼我們怎麼讀時鐘源啊,不要急,每個clocksource都有一個回調函數用來讀取時鐘源目前值:
struct clocksource {
本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1274051