定時器分析

2021-08-28 06:27:06 字數 2733 閱讀 6521

實時時鐘(rtc): 在電腦斷電後還繼續工作, 所以他有乙個外接電池的乙個硬體設施. 它是乙個16位的計數器, 而linux系統的日期和時間也是開機後根據rtc來獲取的, 然後獲取之後就不再需要rtc來獲取時間了, 而是通過軟體進行時間的維護, 當關機的時候在把時間寫回到rtc中,而核心通過0x70和0x71埠訪問rtc.

時間戳計數器(tsc): 它記錄自啟動以來處理器消耗的時鐘週期. 在每個時鐘到來時, 該計數器自動加一. 精準性很高.

可程式設計間隔定時器(pit): 它是根據核心設定的固定頻率來發出時鐘中斷, 頻率可以通過編制改編.

cpu本地定時器(apic): 能夠產生單步中斷的或週期性中斷的裝置.

jiffies是個全域性變數, 它是計數電腦自開機以來到現在經過的節拍總數, 一般設定的是32位, 但是也是通過兩個32位擴充套件到64位, 所以也不會擔心溢位問題.

jiffies在開發中初始化的並不是0, 而是0xfffb6c20的值, 這個值大概在5分鐘會溢位, 這樣用於發現有缺陷的**.

xtime結構是存放了timespec兩個變數,

tv_sec存放自1970.1.1到現在的秒數,

tv_nsec存放自上一秒經過的納秒.

核心中time_none是乙個虛擬定時器的物件,cur_timer指向的是虛擬定時器物件的位址.

在核心初始化的時候, 會呼叫time_init()函式來獲取當前的時間和日期.

初略過程:

初始化xtime變數, 設定xtime 的值為1970.1.1到現在的秒數.

初始化wall_to_monotonic變數 . 他儲存的是將要加到xtime變數的秒和納秒.

通過select_timer()函式設定cur_timer()選擇合適的定時器物件的位址.

mark_offset檢查丟失的時鐘中斷. 時間中斷的可能是中斷被禁止了, 或是其他原因導致時鐘中斷丟失.

全域性時鐘中斷處理程式通過呼叫update_times()函式來更新xtime變數.

void

update_times

(void

)calc_load

(ticks)

;}

檢查有沒有丟失的中斷, 如果有的話就將丟失的中斷加上在更新xtime變數.

update_times()的另乙個作用是每次節拍都會呼叫calc_load統計處在task_tunning或task_uninterruptible程序數, 利用這個來更新平均系統負載.

動態定時器是由核心呼叫執行的.動態定時器在被動的建立和撤銷, 超過時也會被銷毀, 個數也沒有限制.

動態定時器結構是由5個不同大小的vec陣列鍊錶構成的, tv1…tv5大小分別是255, 2^14-1, 2^20-1, 2^26-1, 2^32-1. 定時器的執行是從tv1開始的, 當tv1的255個執行完後, 會從tv2中選擇在新增到tv1中補充, 後面同理的補充前乙個tv, tv5不進行補充.

typedef

struct tvec_base_c

tvec_base_t

動態定時器在撤銷的時候有一點麻煩, 因為在撤銷的時候定時程式剛好還在其他cpu中執行, 所以需要設定函式一直等待, 知道定時器函式結束.

nanosleep動態定時器

nanosleep是實現將呼叫程序掛起, 在設定的時間後在被喚醒.

通常在涉及的時候都是設定好掛起時間, 設定task的狀態為task_interruptible, 然後通過schedule_timeout()函式進行排程, 在設定的時間間隔之內在通過process_timeout()函式喚醒該程序.

sleep和nanosleep()的區別

sleep()和nanosleep()兩者都是使程序睡眠一段時間後被喚醒,但是實現卻完全不同。

linux中並沒有提供系統呼叫sleep(),sleep()是在庫函式中實現的,它是通過呼叫alarm()來設定報警時間,呼叫sigsuspend()將程序掛起在訊號sigalarm上。

nanosleep()則是linux中的系統呼叫,它是使用定時器來實現的,該呼叫使呼叫程序睡眠,並往定時器佇列上加入乙個timer_list型定時器,time_list結構裡包括喚醒時間以及喚醒後執行的函式,通過nanosleep()加入的定時器的執行函式僅僅完成喚醒當前程序的功能。系統通過一定的機制定時檢查這些佇列(比如通過系統呼叫陷入核心後,從核心返回使用者態前,要檢查當前程序的時間片是否已經耗盡,如果是則呼叫schedule()函式重新排程,該函式中就會檢查定時器佇列,另外慢中斷返回前也會做此檢查),如果定時時間已超過,則執行定時器指定的函式喚醒呼叫程序。當然,由於系統時間片可能丟失,所以nanosleep()精度也不是很高。

另外alarm()也是通過定時器實現的,但是其精度只精確到秒級,另外,它設定的定時器執行函式是在指定時間向當前程序傳送sigalrm訊號。

spring定時器分析

spring定時器如何使用?步驟1.定義job bean 1.taskscheduler構造 2.初始化相關服務 步驟2.定義乙個joblist bean來統一管理job 步驟3.定義job factorybean和crontriggerbean 定時任務列表 啟動方法 指定最終封裝出的任務是否有狀...

Mysql 檢視定時器 開啟定時器 設定定時器時間

1.檢視是否開啟evevt與開啟evevt。1.1 mysql evevt功能預設是關閉的,可以使用下面的語句來看evevt的狀態,如果是off或者0,表示是關閉的。show variables like sche 1.2 開啟evevt功能 setglobal event scheduler 1 ...

定時器 STM32定時器 基本定時器1

我是鼎!定時器時鐘一定要明確其中有哪些變數。上圖為stm407資料手冊摘出來的,可能看不清楚,其實就蘊含了幾點資訊。注意一點,我們看圖2,我們以apb1舉例,上面掛著很多的外設,包括usart1 adc 以及定時器,我們知道apb1上面最高時鐘頻率為84mhz,但是定時器的時鐘是要在此基礎上乘2,也...