在Linux內(nèi)核的世界里,有一個(gè)默默工作的"計(jì)時(shí)器"——jiffies。它不像我們手機(jī)上的時(shí)鐘那樣顯示年月日,卻掌控著內(nèi)核中絕大多數(shù)時(shí)間相關(guān)的操作:從進(jìn)程調(diào)度到設(shè)備驅(qū)動(dòng)的定時(shí)檢查,都離不開它的身影。
今天我們就來揭開jiffies的神秘面紗,再通過一段真實(shí)的網(wǎng)卡驅(qū)動(dòng)代碼,看看它在實(shí)際場景中如何大顯身手。

一、什么是jiffies?內(nèi)核的"心跳計(jì)數(shù)器"
jiffies本質(zhì)上是一個(gè)全局變量,更形象地說,它是內(nèi)核的"心跳計(jì)數(shù)器"。
當(dāng)Linux系統(tǒng)啟動(dòng)時(shí),jiffies會(huì)被初始化為0,之后每過一個(gè)"時(shí)鐘節(jié)拍"(Clock Tick),它的值就會(huì)加1。這個(gè)"時(shí)鐘節(jié)拍"由內(nèi)核常量HZ決定,比如HZ=1000時(shí),每1毫秒就會(huì)產(chǎn)生一個(gè)節(jié)拍,jiffies也就每秒增加1000。
不同系統(tǒng)的HZ值可能不同(常見的有100、250、1000),但核心作用不變:用簡單的整數(shù)遞增,記錄系統(tǒng)從啟動(dòng)到現(xiàn)在的"時(shí)間長度"。
二、jiffies為什么重要?內(nèi)核時(shí)間管理的基石
你可能會(huì)問:為什么內(nèi)核不用我們熟悉的"年/月/日/時(shí)/分/秒"來計(jì)時(shí)?
因?yàn)閮?nèi)核需要的是高效、輕量、可移植的計(jì)時(shí)方式。jiffies用一個(gè)整數(shù)遞增實(shí)現(xiàn)計(jì)時(shí),不需要復(fù)雜的日期計(jì)算,在任何硬件上都能穩(wěn)定工作。它主要用于:
?進(jìn)程調(diào)度:決定進(jìn)程何時(shí)被喚醒
?延時(shí)操作:讓程序等待指定時(shí)間
?超時(shí)判斷:檢測(cè)操作是否超時(shí)(比如網(wǎng)絡(luò)請(qǐng)求)
?頻率控制:限制某些操作的執(zhí)行頻率
三、從代碼看jiffies:網(wǎng)卡驅(qū)動(dòng)中的實(shí)際應(yīng)用
下面我們通過一段Realtek 8125網(wǎng)卡驅(qū)動(dòng)的代碼(rtl8125_fiber_link_ok函數(shù)),看看jiffies如何控制光纖鏈路的檢查頻率。
這段代碼的核心功能是:判斷網(wǎng)卡的光纖鏈路是否正常,但為了避免頻繁檢查消耗資源,需要控制檢查頻率(每100毫秒最多檢查一次)。

關(guān)鍵代碼解析
// 獲取當(dāng)前jiffies值(當(dāng)前"心跳數(shù)")unsignedlongnow = jiffies;// 核心邏輯:如果距離上次檢查還不到100毫秒,直接返回上次結(jié)果if(time_before(now, tp->last_check +msecs_to_jiffies(100)))returntp->last_link_status;// ...省略鏈路檢查邏輯...// 記錄本次檢查的jiffies,用于下次判斷時(shí)間間隔tp->last_check = now;
幾個(gè)關(guān)鍵知識(shí)點(diǎn):
1.msecs_to_jiffies(100):毫秒轉(zhuǎn)jiffies
它的作用是把"100毫秒"轉(zhuǎn)換成對(duì)應(yīng)的jiffies數(shù)。比如HZ=1000時(shí),100毫秒= 100個(gè)jiffies,這個(gè)函數(shù)會(huì)自動(dòng)幫我們計(jì)算。
2.time_before(now, ...):安全的時(shí)間比較
由于jiffies是整數(shù),總有溢出的一天(比如32位jiffies在HZ=1000時(shí)約49天溢出)。time_before是內(nèi)核提供的安全比較宏,即使溢出也能正確判斷"現(xiàn)在是否早于某個(gè)時(shí)間點(diǎn)"。
3.頻率控制的邏輯
代碼通過記錄上次檢查的jiffies(tp->last_check),計(jì)算與當(dāng)前jiffies的差值,確保每100毫秒內(nèi)最多執(zhí)行一次鏈路檢查。這種"節(jié)流"操作在驅(qū)動(dòng)中很常見,能減少不必要的硬件交互,提升性能。
四、jiffies的小缺點(diǎn)與內(nèi)核的解決方案
jiffies雖然簡單高效,但也有缺點(diǎn):精度受HZ限制(比如HZ=100時(shí),精度只有10毫秒)。
為此,內(nèi)核還提供了更高精度的計(jì)時(shí)方式(如ktime、hrtimer),但jiffies憑借輕量、兼容性好的特點(diǎn),依然是內(nèi)核中最基礎(chǔ)的計(jì)時(shí)工具。
總結(jié):不起眼卻不可或缺的"心跳"
jiffies就像Linux內(nèi)核的脈搏,每一次跳動(dòng)都記錄著系統(tǒng)的運(yùn)行軌跡。從進(jìn)程調(diào)度到設(shè)備驅(qū)動(dòng),它用最簡單的計(jì)數(shù)方式,支撐著內(nèi)核復(fù)雜的時(shí)間管理。
看懂了jiffies,你就理解了Linux內(nèi)核時(shí)間管理的基石。下次看到內(nèi)核代碼中的jiffies、time_before等關(guān)鍵字,相信你會(huì)有更清晰的認(rèn)識(shí)~
(如果覺得有用,歡迎點(diǎn)贊分享給更多技術(shù)愛好者~)
-
嵌入式
+關(guān)注
關(guān)注
5210文章
20680瀏覽量
337365 -
內(nèi)核
+關(guān)注
關(guān)注
4文章
1476瀏覽量
43098 -
Linux
+關(guān)注
關(guān)注
88文章
11822瀏覽量
219600
發(fā)布評(píng)論請(qǐng)先 登錄
Linux系統(tǒng)內(nèi)核與Linux發(fā)行套件的區(qū)別
老司機(jī)帶路!ARM Linux系統(tǒng)的時(shí)鐘機(jī)制詳解
「正點(diǎn)原子Linux連載」第五十章Linux內(nèi)核定時(shí)器實(shí)驗(yàn)
「正點(diǎn)原子Linux連載」第五十章Linux內(nèi)核定時(shí)器實(shí)驗(yàn)
Linux內(nèi)核輸入子系統(tǒng)的驅(qū)動(dòng)研究
Linux內(nèi)核配置系統(tǒng)詳解
如何為Linux編寫用戶空間設(shè)備驅(qū)動(dòng)程序
Linux時(shí)間子系統(tǒng)之二:表示時(shí)間的單位和結(jié)構(gòu)
Linux 2.6內(nèi)核中的計(jì)時(shí)器和列表
你需要了解Linux設(shè)備驅(qū)動(dòng)之定時(shí)與延時(shí)的區(qū)別
需要了解的linux HZ Tick Jiffies
linux內(nèi)核是什么_linux內(nèi)核學(xué)習(xí)路線
嵌入式LINUX系統(tǒng)內(nèi)核和內(nèi)核模塊調(diào)試
Linux 是操作系統(tǒng)還是內(nèi)核?
Linux系統(tǒng)內(nèi)核概述
Linux內(nèi)核的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?
評(píng)論