一,linux時間管理基礎
http://blog.csdn.net/droidphone/article/details/7975694
http://blog.csdn.net/smilingjames/article/details/6205540
linux全部時間基礎都是以低層硬件爲基礎的,低層硬件有GPT和cpu local timer,好比GPT的時鐘源爲13M HZlinux低層時間的架構分爲clock source,clock event device,clock source上層分爲Xtimer和Hrtimer,Xtimer主要是指牆上時間(開機的時候從RTC寄存器讀取牆上時間),Hrtimer主要是高精度的計時器,精度能夠到ns級別,Clock event Device向上層提供jiffies以及時間輪的概念,好比進程切換的最小精度是10ms。linux
struct clocksource,定義了一個clock device的基本屬性及行爲, 這些clock device通常都有計數,定時, 產生中斷能力, 好比GPT
struct clock_event_device Clock event的主要做用是分發clock事件及設置下一次觸發條件. 在沒有clock event以前,時鐘中斷都是週期性地產生, 也就是熟知的jiffies和HZ架構
二:jiffies和HZ的概念
在ARM系統上HZ的大小通常爲100,表示1s內有100個節拍,jiffies表示的是系統自從啓動以來的節拍總數,jiffies通常爲unsigned long類型,因此可能會溢出。好比:unsigned long jiffies; unsigned long timeout=jiffies+HZ/2;表示的是將來的0.5s
jiffies迴繞的問題:spa
其中jiffies是個不斷在增大的unsigned long,timeout能夠看做比jiffies「大不了多少」的unsigned long。當jiffies變得比2^32-1還要大的時候會發生溢出,「迴繞」(wrap around)到0附近。
此時,判斷語句爲真,雖然實際上超時了,可是判斷爲沒有超時。
Linux內核提供了一組宏解決這個問題。其中宏time_after(a, b)是考慮可能的溢出狀況後判斷時間a是否在時間b以後(即「b < a」)。.net