Linux内核的“心跳”:jiffies如何为系统计时? 电子说
在 Linux 内核的世界里,有一个默默工作的 "计时器"——jiffies。它不像我们手机上的时钟那样显示年月日,却掌控着内核中绝大多数时间相关的操作:从进程调度到设备驱动的定时检查,都离不开它的身影。
今天我们就来揭开jiffies的神秘面纱,再通过一段真实的网卡驱动代码,看看它在实际场景中如何大显身手。

jiffies本质上是一个全局变量,更形象地说,它是内核的 "心跳计数器"。
当 Linux 系统启动时,jiffies会被初始化为 0,之后每过一个 "时钟节拍"(Clock Tick),它的值就会加 1。这个 "时钟节拍" 由内核常量HZ决定,比如HZ=1000时,每 1 毫秒就会产生一个节拍,jiffies也就每秒增加 1000。
不同系统的HZ值可能不同(常见的有 100、250、1000),但核心作用不变:用简单的整数递增,记录系统从启动到现在的 "时间长度"。
你可能会问:为什么内核不用我们熟悉的 "年 / 月 / 日 / 时 / 分 / 秒" 来计时?
因为内核需要的是高效、轻量、可移植的计时方式。jiffies用一个整数递增实现计时,不需要复杂的日期计算,在任何硬件上都能稳定工作。它主要用于:
•进程调度:决定进程何时被唤醒
•延时操作:让程序等待指定时间
•超时判断:检测操作是否超时(比如网络请求)
•频率控制:限制某些操作的执行频率
下面我们通过一段 Realtek 8125 网卡驱动的代码(rtl8125_fiber_link_ok函数),看看jiffies如何控制光纤链路的检查频率。
这段代码的核心功能是:判断网卡的光纤链路是否正常,但为了避免频繁检查消耗资源,需要控制检查频率(每 100 毫秒最多检查一次)。

// 获取当前jiffies值(当前"心跳数")unsigned long now = jiffies;// 核心逻辑:如果距离上次检查还不到100毫秒,直接返回上次结果if (time_before(now, tp->last_check + msecs_to_jiffies(100)))return tp->last_link_status;// ...省略链路检查逻辑...// 记录本次检查的jiffies,用于下次判断时间间隔tp->last_check = now;
1.msecs_to_jiffies(100):毫秒转 jiffies
它的作用是把 "100 毫秒" 转换成对应的jiffies数。比如HZ=1000时,100 毫秒 = 100 个 jiffies,这个函数会自动帮我们计算。
2.time_before(now, ...):安全的时间比较
由于jiffies是整数,总有溢出的一天(比如 32 位jiffies在HZ=1000时约 49 天溢出)。time_before是内核提供的安全比较宏,即使溢出也能正确判断 "现在是否早于某个时间点"。
3.频率控制的逻辑
代码通过记录上次检查的jiffies(tp->last_check),计算与当前jiffies的差值,确保每 100 毫秒内最多执行一次链路检查。这种 "节流" 操作在驱动中很常见,能减少不必要的硬件交互,提升性能。
jiffies虽然简单高效,但也有缺点:精度受HZ限制(比如HZ=100时,精度只有 10 毫秒)。
为此,内核还提供了更高精度的计时方式(如ktime、hrtimer),但jiffies凭借轻量、兼容性好的特点,依然是内核中最基础的计时工具。
jiffies就像 Linux 内核的脉搏,每一次跳动都记录着系统的运行轨迹。从进程调度到设备驱动,它用最简单的计数方式,支撑着内核复杂的时间管理。
看懂了jiffies,你就理解了 Linux 内核时间管理的基石。下次看到内核代码中的jiffies、time_before等关键字,相信你会有更清晰的认识~
(如果觉得有用,欢迎点赞分享给更多技术爱好者~)
全部0条评论
快来发表一下你的评论吧 !