kernel筆記 定時器與時間管理

2021-09-08 14:03:23 字數 2388 閱讀 1826

核心中時鐘主要完成以下作用:

為實現以上功能,硬體以及核心提供了不同型別的時鐘。

rtc

實時時鐘(real time clock,rtc),又叫硬體時鐘、牆上時鐘。rtc記錄的是00:00:00 gmt,1 january 1970到當前經歷的時間。

開機時,核心讀取rtc時間,關機時核心更新rtc時間,系統執行的過程中不操作rtc。關機後依靠rtc記錄時間,其由主機板上的電池供電。

核心讀取到的rtc時間,儲存在xtime變數中,xtime是timespec結構型別的變數,在中定義:

struct timespec ;

從結構定義中可以看到,xtime精度為納秒。每次時鐘中斷觸發時,中斷處理函式將呼叫update_wall_time函式更新xtime。

c庫中的gettimeofday/settimeofday,就是基於xtime,獲取或設定基準時間(00:00:00 gmt,1 january 1970)到當前的時間間隔。

rtc裝置在linux中用/dev/rtc表示,可以通過hwclock查詢rtc時間、將rtc時間與系統時間相互同步。

定時器

週期性發生的事件由定時器(timer)觸發,定時器是pit(programmable interval timer)或tsc(time stamp counter)或其他型別的硬體晶元,時鐘中斷由定時器產生。

乙個定時器對應於乙個時鐘源,時鐘源在核心中由clocksource結構表示,該結構定義了時鐘源名稱、讀取時鐘源方法、開啟/關閉時鐘源方法等內容。

乙個時鐘事件由clock_event_device結構表示,該結構包含了時鐘事件名稱、時鐘時間處理方法(event_handler)等字段。

時鐘中斷發生的時間間隔稱為節拍(tick),節拍在核心編譯階段設定:

linux # zcat /proc/config.gz | grep

config_hz

config_hz_250=y

config_hz=250

以上設定節拍為250hz,即每4ms發生一次時鐘中斷,每秒發生250次。jiffies是乙個全域性變數,它記錄了自系統啟動以來產生的節拍數。

每個cpu有各自的定時器,本地時鐘中斷發生時,由中斷處理函式完成更新程序時間片、計算程序使用者用時/系統用時等任務。update_process_times函式在本地時鐘中斷發生時被呼叫,該函式呼叫account_process_tick更新程序的使用者態/核心態佔用率,呼叫run_local_timers執行軟時間中斷,呼叫scheduler_tick更新當前程序的時間片。

單次觸發

相比時鐘中斷提供4ms的計時精度,單次觸發(one-shot)時鐘提供更高的定時器精度。

高精度的時間由hrtimer結構表示,nanosleep函式的底層實現就用到了hrtimer以及相關操作函式。系統呼叫nanosleep的實現如下:syscall_define2(nanosleep, …) -> hrtimer_nanosleep() -> do_nanosleep() -> hrtimer_start_expires()。超時的hrtimer事件由hrtimer_wakeup處理,hrtimer_wakeup呼叫wake_up_process喚醒相應程序。

suse11相比suse10提供了這種單次觸發的時鐘,由於其時間精度更高,poll、select、sleep等呼叫超時返回的頻率更高,而cpu佔用率、程序資源佔用率等統計資料變得更精確。

以下為suse11、suse10下usleep命令對比的例子,在兩個系統上執行strace -ttt usleep 1,跟蹤輸出中與usleep對應的系統呼叫如下:

//

suse11

11:38:44.836889 nanosleep(, ) = 0

<0.000061>

11:38:44.836986 exit_group(0) = ?

//suse10

05:41:21.406039 nanosleep(, null) = 0

<0.000738>

05:41:21.406838 exit_group(0) = ?

從以上對比例子可看出,同樣呼叫usleep休眠1微秒,suse11下usleep實際執行效果更接近1微秒設定值。

clockchips.**件中定義了定時器事件與單次觸發事件相應的巨集:

#define clock_evt_feat_periodic 0x000001

#define clock_evt_feat_oneshot 0x000002

reference: chapter 11 - timers and time management, linux kernel development.3rd.edition

定時器 tick 時間輪定時器學習筆記

參考自時間輪的原理和手錶的指標計時類似,將任務結束的時間加入對應最高端的時間輪轉盤中。例如任務結束時間為4 30 20,時間輪盤有三個,分別對應,小時,分鐘和秒。開始時將任務加入4小時所在的時間輪中。四小時過去後,任務的剩餘時間時間為0 30 20就將任務加入30分所在的時間輪中。30分鐘過去後,將...

定時器 時間配置

cron表示式是乙個字串,字串以5或6個空格隔開,分為6或7個域,每乙個域代表乙個含義,cron有如下兩種語法格式 seconds minutes hours dayofmonth month dayofweek year或 seconds minutes hours dayofmonth mont...

定時器數碼管時鐘

mai.c handlebars include system.h include key.h extern uchar flag 1ms 在其他模組中尋找其定義。另外,extern也可用來進行鏈結指定。void main void 程式的主函式 在這裡插入 片key.c include key.h...