Linux核心 定時器和時間管理

2021-09-07 04:27:47 字數 4582 閱讀 3278

系統定時器是一種可程式設計硬體晶元。它能以固定頻率產生中斷。該中斷就是所謂的定時器中斷。它所相應的中斷處理程式負責更新系統時間,還負責執行須要週期性執行的任務。

系統定時器和時鐘中斷處理程式是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。核心提供了四個巨集來幫助比較節拍計數,它們能正確地處理節拍計數迴繞情況。

實時時鐘(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 變數中,而且在系統的執行中不斷更新這個值。

定時器:管理核心時間的基礎。推後或執行時間執行某些**。

時器由結構

time_list 表示:

struct timer_list ;

使用定時器:

struct timer_list my_timer;

init_timer( &my_timer ); /* 初始化定時器 */

my_timer.expires = jiffies + delay; /* 定時器超時時的節拍數 */

my_timer.data = 0; /* 給定時器處理函式傳入 0 值 */

my_timer.function = my_function; /* 定時器超時時呼叫的函式 */

add_timer( &my_timer ); /* 啟用定時器 */

假設須要更改超時時間,能夠呼叫

mod_timer

函式:mod_timer

函式無論

my_timer

是否已被啟用,一旦從

mod_timer

返回,my_timer

都被啟用並且設定了新的定時值。

假設呼叫時my_timer

未被啟用。該函式返回

0。否則返回1。

假設須要停止定時器。能夠使用

del_timer

和del_timer_sync

函式。核心**除了使用定時器或下半部機制以外還須要其它方法來推遲執行任務。這樣的推遲通常發生在等待硬體完畢某些工作時,並且等待的時間往往很短。

忙等待想要延遲的時間時節拍的整數倍,或者精確要求不高時才幹夠使用。

unsigned long delay = jiffies + 5 * hz;

while( time_before( jiffies, delay ) )

cond_resched();

cond_resched函式將排程乙個新程式投入執行,但它僅僅有在設定完 need_resched 標誌後,才幹生效。換句話說。該方法有效的條件是系統中存在更重要的任務須要執行。注意由於該方法須要呼叫排程程式,所以它僅僅能在程序上下文中使用。

void udelay( unsigned long usecs );

void mdelay( unsigned long msecs );

前乙個函式利用忙迴圈將任務延遲到指定的微秒數後執行,後者延遲指定的毫秒數。

該方法會讓須要延遲執行的任務睡眠到指定的延遲時間耗盡後再又一次執行。但不保證睡眠時間正好等於指定的延遲時間——僅僅能盡量使睡眠時間接近指定的延遲時間。當指定的時間到期後。核心喚醒被延遲的任務並將其又一次放回執行佇列。

/* 將任務設定為可中斷睡眠狀態 */

set_current_state( task_interruptible );

/* 小睡一會兒,「s」秒後喚醒 */

schedule_timeout( s * hz);

唯一的引數是延遲的相對時間,單位為 jiffies,注意在呼叫 schedule_timeout 函式前必須首先將任務設定為 task_interruptible 或 task_uninterruptible 兩種狀態之中的乙個,否則任務不會睡眠。

因為schedule_timeout()函式須要呼叫排程程式。所以呼叫它的**必須保證可以睡眠。

簡而言之,呼叫**必須處於程序上下文中,而且不能持有鎖。

程序上下文中的**為了等待特定事假發生,能夠將自己放入等待佇列。然後呼叫排程程式去執行新任務。

一旦事件發生後。核心呼叫wake_up

函式喚醒在睡眠佇列上的任務,使其又一次投入執行。

有時。等待佇列上的某個任務可能即在等待乙個特定事件到來,又在等待乙個特定時間到來——就看誰來的更快。這樣的情況下。**能夠簡單的使用schedule_timeout()函式取代schedule()函式。這樣一來。當希望指定時間到期。任務都會被喚醒。當然,**須要檢查被喚醒的原因——有可能是被事件喚醒。也有可能由於延遲的時間到期,還可能由於接收到了訊號——然後執行對應的操作。

被啟用或未被啟用的定時器都能夠使用。假設定時器還未被啟用,該函式返回

0,否則返回

1。注意。不須要為已經超時的定時器呼叫該函式,由於它們會自己主動被刪除。兩者差別在於

del_timer_sync

會等待其它處理器上執行的定時器處理程式都退出才執行。所以

del_timer_sync

不能在中斷上下文中使用。

但在安全性方面考慮。優先使用del_timer_sync。

參考linux核心設計與實現

linux核心時間管理及核心定時器

linux核心時間管理 linux核心中有大量的函式需要時間管理,比如延時程式 週期性的程式排程等。硬體定時器提供時鐘源,時鐘源的頻率是可以設定的,設定好以後通過週期性中斷來計時。週期性中斷的頻率也叫系統節拍,系統節拍在編譯核心的時候可以設定。核心原始碼的根目錄下的.config檔案中有相關巨集定義...

linux定時器和時間管理

linux系統的時間是靠乙個叫 系統定時器 的晶元控制的 系統定時器相當於乙個晶振,產生固定的頻率,作業系統利用這個固定頻率來計時 系統定時器按照一定的頻率傳送中斷訊號,這個中斷我們叫定時器中斷 這個頻率值叫節拍率是可配置的,linux 2.5之前節拍率是100 2.5之後提高到了1000hz 就是...

linux 核心學習之 定時器和時間管理

1.概述 目的 核心 系統定時器和時鐘中斷處理程式是linux系統核心管理機制的中樞。2 基本概念 系統定時器 一種可程式設計硬體晶元,用於幫助核心計算和管理時間,能以固定頻率自發產生定時器中斷,對應的中斷處理程式負責更新系統時間及執行需要週期性的任務。節拍率 系統定時器自行觸發時鐘中斷的頻率,即系...