系統定時器是一種可編程硬件芯片,它能以固定頻率產生中斷。該中斷就是所謂的定時器中斷,它所對應的中斷處理程序負責更新系統時間,還負責執行需要周期性運行的任務。系統定時器和時鐘中斷處理程序是Linux系統內核管理機制中的中樞。
另外一個關注的焦點是動態定時器——一種用來推遲執行程序的工具。比如說,如果軟驅馬達在一定時間內都未活動,那麼軟盤驅動程序會使用動態定時器關閉軟驅馬達。內核可以動態創建或銷毀動態定時器。
內核在硬件的幫助下計算和管理時間。硬件為內核提供一個系統定時器用以計算流逝的時間。系統定時器以某種頻率自行觸發,產生時鐘中斷,進入內核時鐘中斷處理程序中進行處理。該頻率可以通過編程預定,稱為節拍率(tick rate)。連續兩次時鐘中斷的間隔時間稱為節拍(tick),它等於節拍率分之一秒。
牆上時間和系統運行時間根據時鐘間隔來計算。
節拍率(HZ)是時鐘中斷的頻率,表示的一秒內時鐘中斷的次數。比如 HZ=100 表示一秒內觸發100次時鐘中斷程序。
提高節拍率中斷產生更加頻繁帶來的好處:
提高時間驅動事件的解析度;
提高時間驅動事件的准確度;
內核定時器以更高的頻度和准確度;
依賴頂上執行的系統調用poll()和select()能更高的精度運行;
系統時間測量更精細;
提高進程搶占的准確度;
提高節拍率帶來的副作用:
中斷頻率增高系統負擔增加;
中斷處理程序占用處理器時間增多;
頻繁打斷處理器高速緩存;
jiffies:全局變量,用來記錄自系統啟動以來產生的節拍總數。啟動時內核將該變量初始化為0;此後每次時鐘中斷處理程序增加該變量的值。每一秒鐘中斷次數HZ,jiffies一秒內增加HZ。系統運行時間 = jiffie/HZ.
jiffies用途:計算流逝時間和時間管理。
jiffies 變量總是無符號長整數(unsignedlong),因此,在32位體系結構上是32位,在64位體系結構是64位,當 jiffies 的值超過它的最大存放范圍後就會發生溢出,它的值會回繞到0。內核提供了四個宏來幫助比較節拍計數,它們能正確地處理節拍計數回繞情況。
Linux內核設計與實現(原書第3版) 清晰中文PDF 下載見 http://www.linuxidc.com/Linux/2014-02/96174.htm
Linux基礎篇之內存管理機制 http://www.linuxidc.com/Linux/2014-03/98293.htm
Linux內核——進程管理與調度 http://www.linuxidc.com/Linux/2014-08/105366.htm
Linux內核——內存管理 http://www.linuxidc.com/Linux/2014-08/105365.htm
實時時鐘(RTC):用來持久存放系統時間的設備,即便系統關閉後,靠主板上的微型電池提供電力保持系統的計時。系統啟動內核通過讀取RTC來初始化牆上時間,改時間存放在xtime變量中。
系統定時器:內核定時機制,注冊中斷處理程序,周期性觸發中斷,響應中斷處理程序。
時鐘中斷處理程序可以劃分為兩個部分:體系結構相關部分和體系結構無關部分。與體系結構相關的例程作為系統定時器的中斷處理程序而注冊到內核中,以便在產生時鐘中斷時,它能夠相應地運行。雖然處理程序的具體工作依賴於特定的體系結構,但是絕大多數處理程序最低限度都要執行如下工作:
1)獲得 xtime_lock鎖,以便對訪問 jiffies_64和牆上時間 xtime進行保護。
2)需要時應答或重新設置系統時鐘。
3)周期性地使用牆上時間更新實時時鐘。
4)調用體系結構無關的時鐘例程:do_timer()。
中斷服務程序主要通過調用與體系結構無關的例程 do_timer執行下面的工作:
1)給 jiffies_64變量增加 1 (這個操作即使是在 32 位體系結構上也是安全的,因為前面已經獲得了 xtime_lock鎖)。
2)更新資源消耗的統計值,比如當前進程所消耗的系統時間和用戶時間。
3)執行已經到期的動態定時器。
4)執行 scheduler_tick函數。
5)更新牆上時間,該時間存放在 xtime變量中。
6)計算平均負載值。
實際時間就是現實中鐘表上顯示的時間,其實內核中並不常用這個時間,主要是用戶空間的程序有時需要獲取當前時間,所以內核中也管理著這個時間。實際時間的獲取是在開機後,內核初始化時從RTC讀取的。內核讀取這個時間後就將其放入內核中的 xtime 變量中,並且在系統的運行中不斷更新這個值。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-08/105369p2.htm