1. 程式人生 > >Linux Kernel 定時器和時間管理(淺析)

Linux Kernel 定時器和時間管理(淺析)

前言

計算機時間:

這個三維的世界就是由時間,空間,物質構成的,即使是計算機也離不開時間這個東西,時間之於計算機舉足輕重。

計算機的時間

時間管理在核心中佔有很重要的地位。相對於事件驅動而言,核心中有大量的函式都是基於時間驅動的。

這裡先說幾個重要的概念:

相對時間:

假設某一個事件在5秒後發生,那麼系統需要的時間就是相對時間。

絕對時間:

如果要求管理當前日期和當前時間,則核心不但需要計算流逝的時間還需要計算絕對時間。

定時器中斷:

週期性產生的事件比如10MS一次都是由系統定時驅動的,系統定時器是一種可程式設計硬體晶片,它能以固定的頻率發生中斷。

它所對應的中斷處理程式負責更新系統時間,也負責週期性執行任務。

動態定時器:

一種用來推遲執行程式的工具,核心可以動態的建立或撤銷動態定時器。

核心中的時間

事實上核心必須在硬體的幫助之下才能計算和管理時間。硬體為核心提供了一個系統定時器用來計算流逝的時間。系統定時器以某種頻率自行觸發也稱為“射中” 或 “擊中” 時鐘中斷,該頻率可以通過程式設計預定,稱作節拍率。當時鍾中斷髮生時,核心就通過一種特殊的中斷處理程式對其進行處理。

這個間隔的時間就稱為節拍,它等於節拍率分之一秒。

牆上時間

實際時間對使用者空間的應用程式來說最重要,核心通過控制時鐘中斷維護實際時間,另外核心也為使用者空間提供一組系統呼叫以獲取實際日期和實際時間。

系統執行時間

自系統啟動開始所經過的時間對使用者空間和核心都很有用,因為許多程式都必須清楚流逝的時間。通過求兩個時間的差就可以計算出相對的流逝時間了。

一些利用時間中斷週期執行的工作

更新系統執行時間,更新實際的時間,在SMP上,各個CPU 執行佇列,均衡。執行超時的動態定時器。更新資源消耗和處理器時間的統計值。

節拍率:

系統定時器是通過靜態預處理定義的,就是HZ,在系統啟動時按照HZ值對硬體進行設定。體系結構不同,HZ的值也不同。

核心也定義了這個值,接拍率有一個HZ頻率,一個週期為1/HZ秒。在X86體系結構中,預設值為100,就是100HZ.也就是每秒鐘時鐘中斷100次,當然也有體系結構的預設頻率為250 和 1000,分別對應4ms 和 1ms .根據體系結構的不同選擇一個合適的頻率就必須在各個因素之中取的一個折中的結果。

高頻率與低頻率的爭論:

提高頻率的優勢:

更高的時鐘中斷解析度可以提高時間驅動時間的解析度。

提高了時間驅動事件的準確度。

提高節拍率等同於提高中斷解析度。比如HZ = 100 的時鐘的執行粒度為10 ms ,就是系統中週期事件最快一次為每10ms 執行一次。但是當HZ = 1000 時解析度就便成了1ms 精細了10倍。

核心定時器能夠以更高的頻度和更高的準確度執行。

依賴定時執行的系統呼叫,比如poll 和 select 能夠以更高的精度執行。

提高程序搶佔的精度,尤其是對於需要高搶佔精度的程序和對時間有著嚴格需求的時間來說的程序,有巨大提升。

高頻率的劣勢

首先高頻率意味著系統負擔的增加,這樣會不斷的呼叫時鐘中斷處理程式,更會頻繁打亂處理器的高速
快取直接增加了系統的耗電。(但是現在,1000HZ 的負擔並不能對現在的處理器造成威脅)

無時鐘OS

其實作業系統不一定必須使用固定頻率的時鐘,其實可以根據系統的空閒程度動態的改變頻率,比如當一個系統比較空閒的時候我們假設可以設定50 MS 為中斷間隔,當系統非常繁忙的時候我們可以假設設定1MS為系統中斷的時間。

jiffies

全域性變數jiffies 用來計算自系統啟動以來產生的節拍總數,啟動時核心將該初始變數設定為0 ,然後每次時鐘中斷處理程式會增加這個值.

實時時鐘與定時器

實時時鐘:

RTC 是用來持久存放系統時間的裝置,就是電腦內部的那個微型電池,在PC體系結構中RTC 和 CMOS 整合在一起,而且RTC 和 BIOS 的儲存設定都是通過統一個電池供電的。核心通過RTC 來初始化牆上時間每然後存放在xtime 中。

系統定時器:

系統定時器是核心定時機制中最為重要的角色。一些體系結構通過電子晶振進行分頻來實現系統定時器。

在X86 體系結構中,主要採用可程式設計中斷時鐘(PIT)。PIT 在PC機器中普遍存在,而且從DOS 時代開始它就已經是時鐘的中斷源了。

時鐘中斷處理程式:

就是每次發生時鐘中斷後,需要執行的程式,類似於中斷處理程式,已經註冊到核心中了,這個程式一般會完成以下的一些工作:

1.獲得牆上時間鎖

2.設定系統時鐘

3.週期性的使用牆上時間更新實時時鐘。

4.呼叫體系結構無關的時鐘例程。

所以簡單來說:

從CPU的角度看程序:

時鐘中斷  ---->    更新時間    ---->    呼叫定時器(執行軟中斷)----> 排程新程序  ---->時鐘中斷