Linux時間管理(三) GTOD

2021-06-08 12:45:04 字數 3196 閱讀 8663

系統中可以提供一定精度的計時裝置都可以作為時鐘源裝置。如x86構架裡的tsc、hpet、acpi pm-timer、pit等。但是不同的時鐘源提供的時鐘精度是不一樣的。像tsc、hpet等時鐘源既支援高精度模式(high-resolution mode)也支援低精度模式(low-resolution mode),而pit只能支援低精度模式。此外,時鐘源的計時都是單調遞增的(monotonically),如果時鐘源的計時出現翻轉(即返回到0值),很容易造成計時錯誤,核心的乙個patch(commit id: ff69f2)就是處理這類問題的乙個很好示例。時鐘源作為系統時鐘的提供者,在可靠並且可用的前提下精度越高越好。

linux

中不同的時鐘源有不同的

rating

,有更高

rating

的時鐘源會優先被系統使用,如圖2 所示。

系統中可以觸發one-shot(單次)或者週期性中斷的裝置都可以作為時鐘事件裝置。如hpet、cpu local apic timer等。hpet比較特別,它既可以做時鐘源裝置也可以做時鐘事件裝置。時鐘事件裝置的型別分為全域性和per-cpu兩種型別。全域性的時鐘事件裝置雖然附屬於某乙個特定的cpu上,但是完成的是系統相關的工作,例如完成系統的tick更新;per-cpu

的時鐘事件裝置主要完成

local cpu

上的一些功能,例如對在當前

cpu

上執行程序的時間統計,

profile

,設定local cpu

上的下一次事件中斷等。和時鐘源裝置的實現類似,時鐘事件裝置也通過

rating

來區分優先順序關係

tick device

全域性的tick device

用來更新諸如

jiffies

這樣的全域性資訊,

per-cpu

的tick device

則用來更新每個

cpu相關的特定資訊。broadcast

broadcast的出現是為了應對這樣一種情況:假定cpu使用local apic timer作為per-cpu的tick device,但是某些特定的cpu如intel的westmere之前的cpu)在進入c3+ 的狀態時local apic timer也會同時停止工作,進入睡眠狀態。在這種情形下broadcast可以替代local apic timer繼續完成統計程序的執行時間等有關操作。本質上broadcast是傳送乙個ipi(inter-processor interrupt)中斷給其他所有的cpu,當目標cpu收到這個ipi中斷後就會呼叫原先local apic timer正常工作時的中斷處理函式,從而實現了同樣的功能。目前主要在

x86

以及mips

下會用到

broadcast

功能(補充:在

arm cortex-a9

上也可以使用)。

timekeeping(可以理解為時間測量或者計時)是核心時間管理的乙個核心組成部分。沒有timekeeping,就無法更新系統時間,維持系統「心跳」。gtod 是乙個通用的框架,用來實現諸如設定系統時間do_gettimeofday或者修改系統時間do_settimeofday等工作。這些功能的實現都依賴於系統的clocksource裝置。

為了實現以上功能,linux 實現了多種與時間相關但用於不同目的的資料結構。

ø  struct timespec

struct timespec ;

timespec 精度是納秒。它用來儲存從00:00:00 gmt, 1 january 1970開始經過的時間。核心使用全域性變數xtime來記錄這一資訊,這就是通常所說的「wall time」或者「real time」。與此對應的是「system time」。system time是乙個單調遞增的時間,每次系統啟動時從0開始計時。

ø  struct timeval

struct timeval ;

timeval精度是微秒。timeval主要用來指定一段時間間隔。

ø  ktime

typedef union tv;

#endif

}ktime_t;

ktime_t是hrtimer主要使用的時間結構。無論使用哪種體系結構,ktime_t始終保持64bit的精度,並且考慮了大小端的影響。

ø  cycle_t;

typedef u64 cycle_t;

cycle_t 是從時鐘源裝置中讀取的時鐘型別。

為了管理這些不同的時間結構,linux 實現了一系列輔助函式來完成相互間的轉換。

ktime_to_timespec,ktime_to_timeval,ktime_to_ns/ktime_to_us,反過來有諸如ns_to_ktime 等類似的函式。

timeval_to_ns,timespec_to_ns,反過來有諸如ns_to_timeval 等類似的函式。

timeval_to_jiffies,timespec_to_jiffies,msecs_to_jiffies, usecs_to_jiffies, clock_t_to_jiffies 反過來有諸如ns_to_timeval 等類似的函式。

clocksource_cyc2ns / cyclecounter_cyc2ns

時鐘源裝置和時鐘事件裝置的引入,將原本放在各個體系結構中重複實現的冗餘**封裝到各自的抽象層中,這樣做不但消除了原來timer wheel與核心其他模組的緊耦合性,更重要的是系統可以在執行狀態動態更換時鐘源裝置和時鐘事件裝置而不影響系統正常使用,譬如

cpu

由於睡眠要關閉當前使用的時鐘源裝置或者時鐘事件裝置時系統可以平滑的切換到其他仍處於工作狀態的裝置上。timekeeping/gtod在使用時鐘源裝置的基礎上也採用類似的封裝實現了體系結構的無關性和通用性。hrtimer則可以通過timekeeping提供的介面完成定時器的更新,通過時鐘事件裝置提供的事件機制,完成對timer的管理。在圖2 中還有乙個重要的模組就是tick device的抽象,尤其是dynamic tick。dynamic tick的出現是為了能在系統空閒時通過停止tick的執行以達到降低cpu功耗的目的。使用dynamic tick的系統,只有在有實際工作時才會產生tick,否則tick是處於停止狀態。

Linux 系統時間管理

時間伺服器ntp 計畫任務 週期性計畫任務 date 顯示系統時間 date mmddhhmm 以特定格式顯示時間timedatectl list timezone 檢視時區列表 timedatectl set timezone 設定時區 timedatectl set time yyyy mm d...

Linux 系統時間管理

時間伺服器ntp 計畫任務 週期性計畫任務 date 顯示系統時間 date mmddhhmm 以特定格式顯示時間timedatectl list timezone 檢視時區列表 timedatectl set timezone 設定時區 timedatectl set time yyyy mm d...

時間管理 三象限法

一 時間管理 昨天石總已經講述過了,做事情來了一件做一半,再做另一件。最終什麼都沒有完成,但都做了,也沒有成就感。針對這樣的現象,如何做?怎麼做?我來分享下自己的經驗。管理好自己的時間,就是管理好自己的事。二 起源 我接觸到時間管理是在喜馬拉雅上的葉武濱100講,大家到喜馬拉雅上去搜尋就可以找到。免...