Linux時間子系統一 時間子系統綜述

2021-10-02 03:11:02 字數 1529 閱讀 3871

timer在硬體上是乙個非常簡單的東西(這裡不考慮虛擬化,安全相關的問題),一般來說timer都會支援兩種模式,一是periodic模式和free running模式,前者週期性的產生中斷,後者一直往前累加到配置的最大值,報一次中斷,稱為one shot。

軟體上將timer抽象成clocksource和clockevent,從名字大概就猜得出來,clocksource是提供時間資訊的,如當前的系統時間;而clockevent是提供事件資訊的,就是在未來某個時間點提醒cpu某個事件需要處理了,比如定時器超時了,或者乙個新的tick的到來。

現代作業系統基本都是分時作業系統,也就是說多工分時共享cpu,而分時的基礎就是timer,所以timer驅動是作業系統基礎架構性質的驅動,從timer的角度去理解作業系統,會對作業系統有乙個更加巨集觀和具體化的認識。

timer之所以可以讓多進城輪動起來,是因為它會週期性的產生中斷,如config_hz配置為250,意味著每4毫秒產生一次中斷,而每次中斷來的時候jiffs會增加一,所以jiffs是乙個核心裡面很重要的計時單位。在中斷處理函式裡面判斷當前程序的時間片是否用完,如果用完的話就選擇另外乙個程序,這是分時復用最核心的邏輯。

config_hz並不是越大越好,也不是越小越好,如果config_hz太大,會導致頻繁的產生中斷,中斷的軟體棧會消耗過多的cpu資源,如果config_hz過小,程序之間的切換頻率較低,可能會導致某些高優先順序程序響應速度慢。

timer分高精度timer和低精度timer,前者是基於硬體timer頻率的,所以精度很高,而後者是基於jiffs的,所以精度比較低。這裡簡單介紹下原理:

前面說過,硬體timer支援periodic模式和free running模式,當工作在periodic模式時,timer只能按固定週期才生中斷事件,這其實是有很大限制的,如config_hz設定為250,那麼timer只能每4ms才生一次中斷,那麼定時器定時時間只能是timer的整數倍,所以精度非常低,稱為低優先順序定時器,除此以外,低優先順序定時器執行在軟中斷上下文,所以是可以被中斷搶占的,此外如果軟中斷執行緒話,其精度將更低。

如果要使用高精度定時器,就必須使用free running模式,free running模式又可以成為one shot模式,也就是說每次定時只會才生一次中斷,要想產生下一次中斷,則需要重新配置定時器。這樣開起來雖然麻煩了一點,但是卻更加靈活,它想什麼時候才生中斷就什麼時候產生中斷,再也不會受限於config_hz的配置,當然one shot模式需要統一定時器和tick事件,本質上他們都要求以固定的週期發生中斷事件,只不過它們所要求的週期不一樣,所以需要在每次中斷發生後,要將最近的一次超時時間配置到timer中去。

時間怎麼辦?乙個timer是怎麼既做clocksource又做clockevent的呢?話句話說,系統是如何基於乙個隨時可能被重新賦值的timer來維護持續向前的系統時間的呢?答案其實很簡單,offset。硬體timer並非一直往前計數,但是我們可以分步累加offset,來維護持續向前的系統時間。

簡單來說,就是每次timer中斷事件中,會將上次更新系統時間到現在經歷的時間加到系統時間上去,而每次獲取時間的時候,也會同樣將上次更新系統時間到現在經歷的時間加到系統時間上去,作為現在的系統時間。

timestamp可用於應對統一時間需求

假設這樣的場景。歐洲的玩家與中國的玩家匹配上了一場對局,而負責提供對戰支援的伺服器在美國 問題來了,這場對局的發生時間以哪個為準?能不能滿足一種需求,中國玩家檢視對局資訊時,對局開始時間是按北京時間日期算 而歐洲玩家檢視對局資訊時,又是按他當地的時間日期算。其實很簡單,資料庫裡使用timestamp...

一 時間複雜度

一 時間複雜度計算規則 1.基本操作,即只有常數項,其時間複雜度為o 1 比如if,print 與規模n無關 2.順序結構 按加法計算 3.迴圈結構,按乘法計算 4。分支結構,時間複雜度取最大值。二 常見時間複雜度與大小關係 常數項 o 1 12線性項 o n 2n 3平方項 o n 2 4n 3 ...

vue cli 使用過濾器統一時間

寫入 引用自 格式化時間 param date 時間 param fmt 格式化型別 returns 格式化後的時間 const fmtdate date,fmt if y test fmt for let k in o return fmt 日期資料轉為數字時間戳 param time 時間 pa...