linux 時間子系統 二 時間系統的組成

2021-09-11 03:05:10 字數 1978 閱讀 1605

時間輪是linux kernel處理核心低精度定時器的機制,由週期的定時器中斷驅動。定時器中斷以配置的hz引數為頻率產生,在中斷中更新系統時間jiffies,摘取到期的定時器執行,更新時間輪時間。

clock source 硬體計數器的一種抽象,它為系統提供一種時間線,通過時間線,每乙個動作都可以確定現在執行時的時間點。一般的clocksource是乙個單調遞增(monotonic)計數器。它應該盡可能的提供高精度,並且要盡可能的穩定。作為clocksource的timer不能夠因為執行讀取動作而出現資料錯誤。

對系統時間的同步操作,不會影響到clocksource,同步操作只會生成乙個時間偏移,通過時間偏移量可以得到當前時間。

clockevent和clocksource是兩種完全不同的機制,雖然同乙個硬體timer可以同時用來做clocksource和clockevents。

clock events管理下的硬體定時器會產生中斷,在時間線上某點觸發event完成它的工作。

clockevents 提供一種管理定時器中斷的driver api,api管理所有註冊的timer。這些api只有小部分的功能跟是硬體相關的,所以kernel可以以體系結構無關的方式使用timer。

利用clockevents機制,系統可以支援高精度定時器。當高精度定時器被申請時,需要做的工作就是選擇乙個合適的timer來支援高精度定時器。 系統可以提供高精度的定時中斷,提供高精度的核心定時器來滿足高的實時需求。

週期定時器tick現在也是用clock events來實現,它的功能仍然與舊的基於定時器中斷的機制相同,都是更新jiffies,計算系統時間等。

時間子系統當中no_hz相關的配置能夠減少排程時鐘中斷的數量。因為系統不會頻繁被排程時鐘打斷,這樣能夠提高系統的工作效率,一方面能夠降低能源消耗,另一方面較低的系統抖動對有高效能計算(hpc)和實時性要求的應用會有較大影響。

主要有三種需求需要管理排程時鐘中斷:

下邊分別解釋下三種情況:

不控制排程時鐘tick

早期的kernel是不控制排程時鐘tick的,排程時鐘中斷以hz設定的頻率到來,執行排程。這種方式在某些情況下被證明仍然是一種非常有效的方式。比如,在系統負載比較重的情況下,cpu只有很少的時間處於idle狀態,只是頻繁的進入idle停留很短的時間。這種負載下,因為有很多正在等待執行的任務,所以及時的排程tick是必要的。這種情況下,控制排程時鐘tick不會有什麼效果。

這種模式需要的配置是config_hz_periodic=y

如果系統處在低負載的情況下,當cpu長時間的處在idle狀態時,週期性的排程tick會增加功耗,這對電池供電的裝置影響很大。

如果系統執行著實時性應用或者計算集中型應用,那麼週期的排程時鐘會影響系統的效能。

cpu idle狀態時禁止排程時鐘tick

當cpu在idle狀態時,不應該向其傳送排程時鐘中斷。排程時鐘中斷的作用是在有多個任務需要處理時切換cpu,乙個處在idle狀態的cpu沒有這樣的需要。

config_no_hz_idle=y配置選項使得kernel不會將排程時鐘中斷傳送給idle狀態的cpu。這種配置對電池供電和大型的虛擬化系統有很大影響。config_hz_periodic=y選項會使得電池供電裝置以2倍的速度消耗電量。執行很多os的虛擬機器系統中periodic配置會導致cpu過多的消耗在無關的排程時鐘中斷中。

不過idle時動態調整tick(dyntick-idle)也是有消耗的:

它會增加idle loop的**量

在許多架構上,動態調整tick需要在時間系統增加很多**

所以,實時性要求高的系統最好使用periodic的配置。

控制處在idle狀態的cpu不接收排程時鐘的方式叫做dyntick-idle 模式或者nohz 模式。

在config_no_hz_idle=y配置下,預設情況下,啟動引數中nohz=引數會關閉dyntick-idle模式,設定為nohz=on會開啟dyntick-idle模式。

在只有乙個任務時禁止排程時鐘tick

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

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

linux時間子系統(九)

3.4.3 模擬tick事件 當系統切換到高精度模式後,tick device被高精度定時器系統接管,不再定期地產生tick事件。核心在3.0.30版本中還沒有徹底的廢除jiffies機制,系統還是依賴定期到來的tick事件,完成程序排程和時間更新等操作,大量存在的低精度定時器仍然依賴於jiffie...

linux時間子系統(六)

3.1.4 定時器處理 static inline void run timers struct tvec base base wake up base wait for running timer spin unlock irq base lock static int cascade struc...