Linux中的時鐘概念Linux中的時鐘概念

2021-09-07 06:15:50 字數 2933 閱讀 5847

linux的時鐘中斷中涉及至二個全域性變數乙個是xtime,另乙個則是jiffies。

有乙個與時間有關的時鐘:實時時鐘(rtc),這是乙個硬體時鐘,用來持久存放系統時間,系統關閉後靠主機板上的微型電池保持計時。系統啟動時,核心 通過讀取rtc來初始化wall time,並存放在xtime變數中,即xtime是從cmos電路中取得的時間,一般是從某一歷史時刻開始到現在的時間,也就是為了取得我們作業系統上 顯示的日期,它的精度是微秒。這是rtc最主要的作用。

jiffies是記錄著從電腦開機到現在總共的時鐘中斷次數。在linux核心中jiffies遠比xtime重要,jiffies取決於系統的頻 率,單位是 hz,是週期的倒數,一般是一秒鐘中斷產生的次數,所以,假如我們需要知道系統的精確的時間單位時,需要換算了,假如我們系統的頻率是200mhz,那麼 一次中斷的間隔是1秒/200,000,000hz=0.000 000 005秒,所以理論上我們系統的精確度是5ns。linux系統時鐘頻率是乙個常數hz來決定的, 通常hz=100(linux核心從2.5版核心開始把頻率從100調高到1000),那麼他的精度度就是10ms(毫秒)。也就是說每10ms一次中 斷。所以一般來說linux的精確度是10毫秒。

核心一般通過jiffies值來獲取當前時間。儘管該數值表示的是自上次系統啟動到當前的時間間隔,但因為驅動程式的生命期只限於系統的執行期 (uptime),所以也是可行的。驅動程式利用jiffies的當前值來計算不同事件間的時間間隔。硬體給核心提供乙個系統定時器用以計算和管理時間, 核心通過程式設計預設系統定時器的頻率(即上面所說的hz=100)。節拍率(tick rate),每乙個週期稱作乙個tick(節拍)。jiffies是核心中的乙個全巨變數。系統啟動一來產生的節拍數。譬如,如果計算系統執行了多長時 間,可以用 jiffies/tick rate 來計算。

jiffies定義在檔案

如果您需要更精確的時間來測量或者記錄某些事情的話,核心中有個xtime全域性變數,型別是struct timespec 按照這個資料結構,它是ns級的。

有乙個current_kernel_time函式,通過它就可以獲取xtime的值。但是xtime是在時鐘中斷裡更新的,而乙個tick往往是 10ms或者100ms,它只能保證在時鐘中斷isr呼叫時刻,它返回的值是精確到ns級,並不能保證任何乙個呼叫這個函式的時刻都能這樣,原因是 xtime的更新速度比它差幾個數量級.

這些time之間互相關聯, 互相可以轉換.

system_time = xtime + cyc2ns(clock->read() - clock->cycle_last) + wall_to_monotonic;

real_time = xtime + cyc2ns(clock->read() - clock->cycle_last)

也就是說real time是從2023年開始到現在的nanosecond, 而system time是系統啟動到現在的nanosecond.

這兩個是最重要的時間, 由此hrtimer可以基於這兩個time來設定過期時間. 所以引入兩個clock base:

clock_realtime: base在實際的wall time

clock_monotonic: base在系統執行system time

clock_realtime 呼叫ktime_get_real()來獲得真實時間, 該函式用上面提到的等式計算出realtime.

clock_monotonic 呼叫ktime_get(), 用system_time的等式獲得monotonic time.

clock api

clock_gettime(clockid_t, struct timespec *)

獲取對應clock的時間

clock_settime(clockid_t, const struct timespec *)

設定對應clock時間

clock_nanosleep(clockid_t, int, const struct timespec *, struct timespec *)

程序nano sleep

clock_getres(clockid_t, struct timespec *)

獲取時間精度, 一般是nanosec

clockid_t 定義了四種clock:

前兩者前面提到了, 後兩個是和程序/執行緒統計時間有關係, 應用層可以利用這四種clock, 提高靈活性及精度.

timer api

timer 可以建立程序定時器,單次或者週期性定時。

int timer_create(clockid_t clockid, struct sigevent *restrict evp, timer_t *restrict timerid);

建立定時器。

clockid 指定在哪個clock base下建立定時器。

evp (sigevent) 可以指定定時器到期後核心傳送哪個訊號給程序,以及訊號所帶引數;預設為sigalrm。

timerid 返回所建timer的id號。

在signal 處理函式裡,可以通過siginfo_t.si_timerid 獲得當前的訊號是由哪個timer過期觸發的。試驗了一下,最多可建立的timer數目和ulimit裡的pending signals的有關係,不能超過pending signals的數量。

int timer_gettime(timer_t timerid, struct itimerspec *value);

獲得timer的下次過期的時間。

int timer_settime(timer_t timerid, int flags, const struct itimerspec *restrict value, struct itimerspec *restrict ovalue);

設定定時器的過期時間及間隔週期。

int timer_delete(timer_t timerid);

刪除定時器。

這些系統呼叫都會建立乙個posix_timer的hrtimer,在過期的時候傳送訊號給程序。

時鐘的相關概念

前言 主要是pll dcm pll,即鎖相環。是 fpga 中的重要資源。由於乙個複雜的 fpga 系統往往需要多個不同頻率,相位的時鐘訊號。所以,乙個 fpga 晶元中 pll 的數量是衡量 fpga 晶元能力的重要指標。fpga 的設計中,時鐘系統的 fpga 高速的設計極其重要。dcm dig...

Linux中的時鐘與時間

日期 2010 02 04 hz 核心通過定時器中斷來跟蹤時間流,時鐘中斷由系統定時硬體以週期性的間隔產生,這個間隔由核心根據hz的值設定。hz與體系結構有關,定義在中或者該檔案包含的某個子平台相關的檔案中。預設值為50 1200,x86的預設值為1000。如果想改變系統時鐘中斷的頻率,可以修改hz...

修改Linux中的主機名 如何檢視Linux IP

查詢 修改主機資訊一 如何修改linux主機名稱 1.變更當前主機名 1.1 echo new hostname proc sys kernel hostname 系統啟動時,從此檔案中讀取主機名字 1.2 hostname new hostname 即時生效,但系統重啟後將失效 2.修改配置檔案,...