[linux內核][linux]linux內核時間管理基礎

一,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

[cpp]  view plain copy
 
  1. 01.unsigned long jiffies;  
  2. 02.unsigned long timeout = jiffies + HZ/2;  
  3. 03.//......  
  4. 04.if (timeout > jiffies) {  
  5. 05.        //沒有超時,很好  
  6. 06.}  
  7. 07.else {  
  8. 08.        //超時了,發生錯誤  
  9. 09.}  

其中jiffies是個不斷在增大的unsigned long,timeout能夠看做比jiffies「大不了多少」的unsigned long。當jiffies變得比2^32-1還要大的時候會發生溢出,「迴繞」(wrap around)到0附近。
此時,判斷語句爲真,雖然實際上超時了,可是判斷爲沒有超時。
Linux內核提供了一組宏解決這個問題。其中宏time_after(a, b)是考慮可能的溢出狀況後判斷時間a是否在時間b以後(即「b < a」)。.net

[cpp]  view plain copy
 
    1. 01.#define time_after(a, b) ((long)(b) - (long)(a) < 0)  
相關文章
相關標籤/搜索