核心定時器

2021-05-25 16:26:29 字數 1725 閱讀 7299

linux核心2.4版中去掉了老版本核心中的靜態定時器機制,而只留下動態定時器。相應地在timer_bh()函式中也不再通過 run_old_timers()函式來執行老式的靜態定時器。動態定時器與靜態定時器這二個概念是相對於linux核心定時器機制的可擴充套件

功能而言的, 動態定時器是指核心的定時器佇列是可以動態變化的,然而就定時器本身而言,二者並無本質的區別。考慮到靜態

定時器機制的能力有限,因此linux核心 2.4版中完全去掉了以前的靜態定時器機制。

linux核心對定時器的描述

linux在include/linux/timer.h標頭檔案中定義了資料結構timer_list來描述乙個核心定時器:

各資料成員的含義如下:

(1)雙向鍊錶元素list:用來將多個定時器連線成一條雙向迴圈佇列。

(2)expires:指定定時器到期的時間,這個時間被表示成自系統啟動以來的時 鐘滴答計數(也即時鐘節拍數)。當乙個定時器的expires值小於或等於jiffies變數時,我們就說這個定時器已經超時或到期了。在初始化乙個定時 器後,通常把它的expires域設定成當前expires變數的當前值加上某個時間間隔值(以時鐘滴答次數計)。

(3)函式指標function:指向乙個可執行函式。當定時器到期時,核心就執行function所指定的函式。而data域則被核心用作function函式的呼叫引數。

核心函式init_timer()用來初始化乙個定時器。實際上,這個初始化函式僅僅將結構中的list成員初始化為空。如下所示(include/linux/timer.h):

由於定時器通常被連線在乙個雙向迴圈佇列中等待執行(此時我們說定時器處於pending狀態)。因此函式time_pending()就可以用list成員是否為空來判斷乙個定時器是否處於pending狀態。如下所示

時間比較操作

在定時器應用中經常需要比較兩個時間值,以確定timer是否超時,所以linux 核心在timer.h標頭檔案中定義了4個時間關係比較操作巨集。這裡我們說時刻a在時刻b之後,就意味著時間值a≥b。linux強烈推薦使用者使用它所定義 的下列4個時間比較操作巨集(include/linux/timer.h):

將乙個定時器插入到鍊錶中

函式add_timer()用來將引數timer指標所指向的定時器插入到乙個合適 的定時器鍊錶中。它首先呼叫timer_pending()函式判斷所指定的定時器是否已經位於在某個定時器向量中等待執行。如果是,則不進行任何操作, 只是列印一條核心告警資訊就返回了;如果不是,則呼叫internal_add_timer()函式完成實際的插入操作。其原始碼如下 (kernel/timer.c):

函式internal_add_timer()用於將乙個不處於任何定時器向量中的定時器插入到它應該所處的定時器向量中去(根據定時器的expires值來決定)。如下所示(kernel/timer.c):

對該函式的注釋如下:

(1)首先,計算定時器的expires值與timer_jiffies的插值(注意!這裡應該使用動態定時器自己的時間基準),這個差值就表示這個定時器相對於上一次執行定時器機制的那個時刻還需要多長時間間隔才到期。區域性變數idx儲存這個差值。

(2)根據idx的值確定這個定時器應被插入到哪乙個定時器向量中。其具體的確定方法我們在7.6.2節已經說過了,這裡不再詳述。最後,定時器向量的頭部指標vec表示這個定時器應該所處的定時器向量鍊錶頭部。

(3)最後,呼叫list_add()函式將定時器插入到vec指標所指向的定時器佇列的尾部。

核心定時器

核心中最終的計時資源是定時器。定時器用於定時器超時處理程式在未來某個特定時間點執行,或者週期性的輪詢硬體的狀態。linux提供了核心定時器完成這類工作。定 時器的只需要執行一些初始化的操作,如 設定乙個超時時間,指定超時要呼叫的函式,然後啟用定時器就可以了。它的處理和工作佇列還是有點類似的。和任務隊...

核心定時器,

ldd3 當定時器執行時 排程該定時器的程序可能正在睡眠,或在其它處理器上執行,或乾脆推出。沒有執行定時器,排程它的程式推出了,定時器該如何?2.6.35。22核心 gcc 4.4.5 include include include include include include include i...

核心定時器

核心用來控制在未來某個時間點 基於jiffies 排程執行某個函式的一種機制。被排程的函式是非同步執行的,它類似於一種 軟體中斷 而且是處於非程序的上下文中,所以排程函式必須遵守以下規則 1 沒有 current 指標 不允許訪問使用者空間。因為沒有程序上下文,相關 和被中斷的程序沒有任何聯絡。2 ...