Linux内核的“心跳”:jiffies如何为系统计时?

电子说

1.4w人已加入

描述

 

 

 Linux 内核的世界里,有一个默默工作的 "计时器"——jiffies。它不像我们手机上的时钟那样显示年月日,却掌控着内核中绝大多数时间相关的操作:从进程调度到设备驱动的定时检查,都离不开它的身影。

 

 

今天我们就来揭开jiffies的神秘面纱,再通过一段真实的网卡驱动代码,看看它在实际场景中如何大显身手。

内核

一、什么是 jiffies?内核的 "心跳计数器"

 

jiffies本质上是一个全局变量,更形象地说,它是内核的 "心跳计数器"

 

 

 Linux 系统启动时,jiffies会被初始化为 0,之后每过一个 "时钟节拍"Clock Tick),它的值就会加 1。这个 "时钟节拍由内核常量HZ决定,比如HZ=1000时,每 1 毫秒就会产生一个节拍,jiffies也就每秒增加 1000

 

 

不同系统的HZ值可能不同(常见的有 1002501000),但核心作用不变:用简单的整数递增,记录系统从启动到现在的 "时间长度"

 

 

二、jiffies 为什么重要?内核时间管理的基石

 

你可能会问:为什么内核不用我们熟悉的 "年 月 日 时 分 来计时?

 

 

因为内核需要的是高效、轻量、可移植的计时方式。jiffies用一个整数递增实现计时,不需要复杂的日期计算,在任何硬件上都能稳定工作。它主要用于:

 

 

进程调度:决定进程何时被唤醒

 

 

延时操作:让程序等待指定时间

 

 

超时判断:检测操作是否超时(比如网络请求)

 

 

频率控制:限制某些操作的执行频率

 

 

三、从代码看 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 jiffiesHZ=1000时约 49 天溢出)。time_before是内核提供的安全比较宏,即使溢出也能正确判断 "现在是否早于某个时间点"

 

 

3.频率控制的逻辑

 

 

代码通过记录上次检查的jiffiestp->last_check),计算与当前jiffies的差值,确保每 100 毫秒内最多执行一次链路检查。这种 "节流操作在驱动中很常见,能减少不必要的硬件交互,提升性能。

 

 

四、jiffies 的小缺点与内核的解决方案

 

jiffies虽然简单高效,但也有缺点:精度受HZ限制(比如HZ=100时,精度只有 10 毫秒)。

 

 

为此,内核还提供了更高精度的计时方式(如ktimehrtimer),但jiffies凭借轻量、兼容性好的特点,依然是内核中最基础的计时工具。

 

 

总结:不起眼却不可或缺的 "心跳"

 

jiffies就像 Linux 内核的脉搏,每一次跳动都记录着系统的运行轨迹。从进程调度到设备驱动,它用最简单的计数方式,支撑着内核复杂的时间管理。

 

 

看懂了jiffies,你就理解了 Linux 内核时间管理的基石。下次看到内核代码中的jiffiestime_before等关键字,相信你会有更清晰的认识~

 

 

(如果觉得有用,欢迎点赞分享给更多技术爱好者~)

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分