Linux 時鐘與計時器

對 Linux 系統來講,時鐘和計時器是兩個十分重要的概念。時鐘反應的是絕對時間,也可認爲是實時時間。計時器反應的則是相對時間,即相對於系統啓動後的計時。操做系統內核須要管理運行時間(uptime)和牆上時間(wall time),而內核中大量事務須要由時間驅動。linux

系統時鐘

系統內核須要藉助硬件設施來管理時間,實時時鐘(RTC)是用來持久存放系統時間的設備,它由主機電池供電,所以即便關閉系統,實時時鐘仍然在持續工做。編程

當系統啓動時,系統內核從實時時鐘(RTC)讀取實時時間,並將該時間轉換爲自 1970 年 1 月 1 日零時零分零秒以來所經歷的秒數(即 Linux 時間秒),並將該秒數保存在系統變量 xtime 中。能夠說實時時鐘的主要做用就是初始化 xtime 變量。架構

系統計時器

系統計時器驅動着週期性發生的事件,在 X86 架構的系統中,系統計時器一般是一種可編程硬件芯片。系統計時器的頻率稱之爲節拍率(tick rate),在內核中使用 HZ 變量來表示節拍率。函數

對 X86 架構系統而言,內核版本 2.4 以前,系統計時器的節拍率爲 100。自內核版本 2.6 開始,系統計時器節拍率設置爲 1000。節拍率 HZ = 1000 的含義是系統計時器每秒鐘可產生 1000 次中斷請求,每個計時中斷週期稱之爲一個節拍(tick),也就是說每一個節拍時長爲 1 秒 / 1000次 = 0.001 秒 = 1 毫秒。節拍的時長決定着系統時間控制的精度,當節拍率從 100 提高到 1000 時,也就意味着系統計時器的精度從 10 毫秒提高到了 1 毫秒,這大大提升了系統對時間驅動事件調度的精度。而過於頻繁的時鐘中斷會不可避免地增長系統計時開銷。操作系統

系統計時器及其計時中斷處理程序是 Linux 內核管理機制的中樞,計時中斷處理程序會按期地處理如下事務(包含而不限於):.net

  1. 更新系統運行時間(uptime)
  2. 更新牆上時間(wall time)
  3. 在對稱多處理器系統(SMP)上,均衡調度各處理器上的運行隊列
  4. 檢查當前進程時間片(time slice)是否耗盡,若是耗盡,則從新調度
  5. 運行超時的動態定時器
  6. 更新資源耗盡和處理器時間的計算

節拍、節拍率、節拍數

運行時的 Linux 內核會週期性地發出計時中斷請求(IRQ),每秒鐘發出的計時中斷請求數稱之爲節拍率,每次計時中斷週期稱之爲節拍,實際計時中斷次數稱之爲節拍數。blog

Linux 內核的節拍率在編譯時經過變量 HZ 來指定,通常設置爲 100 或 1000,表示每秒中斷 100 次或 1000 次。若是節拍率設置爲 1000,那麼一個節拍週期則爲 1 秒 / 1000 次 = 1 毫秒。Linux 系統使用變量 jiffies 來記錄系統開機以來經歷的節拍數,即從系統啓動開始,每發生一次計時中斷,jiffies 則加 1。經過計算 jiffies 所表示的節拍數,即可獲得系統的運行時間。隊列

節拍數轉換爲時間

時間(秒) = 節拍數 × 節拍時長 = 節拍數 / 節拍率進程

時間轉換爲節拍數

節拍數 = 時間(秒) / 節拍時長 = 時間(秒) × 節拍率事件

所以若已知系統內核 HZ = 1000,jiffies = 1000 時,即可以快速算出系統的運行時間爲 jiffies / HZ = 1000 / 1000 = 1 秒

術語

名詞 釋義 備註
Real Time Clock (RTC) 實時時鐘
Wall Time 牆上時鐘 即當前實時時間
Uptime 運行時間
Time Slice 時間片
Timer 計時器
Timer Interrupt Request (IRQ) 計時中斷請求
HZ 每秒計時中斷請求次數,也可稱爲節拍率(tick rate) HZ 值通常爲 100, 250, 300 或 1000。最多見的爲 1000 和 100。
Tick 節拍 Tick 與 HZ 互爲倒數,表示單次計時中斷的時長。
Jiffies 節拍數 表示系統開機以來的節拍數,即經歷的 Tick 數量。
Second (s)
Millisecond (ms) 毫秒 1s = 1000ms
Microsecond (us) 微秒 1ms = 1000us
Nanosecond (ns) 納秒 1us = 1000ns
Picosecond (ps) 皮秒 1ns = 1000ps

Ref.:

Linux 內核中的 jiffies 及其做用介紹及 jiffies 等相關函數詳解
Linux Kernel - Jiffies
Kernel Timer Systems

相關文章
相關標籤/搜索