linux内核之时钟管理

定时器和时间管理

时间管理在内核中占有非常重要的地位。相对于事件驱动而言,内核中有大量的函数都是基于时间事件驱动的,例如周期性执行的函数,或者延时执行的函数。
周期性产生的事件都是由系统定时器驱动的。系统定时器是一种可编程硬件芯片,它能以固定的频率产生中断(即定时器中断),它所对应的中断处理程序(时钟中断)负责更新系统时间,以及负责执行需要周期性运行的任务。系统定时器和时钟中断处理程序是Linux内核管理机制中的中枢。

时间中断周期执行的工作有:
(1)更新系统运行时间和实际的时间
(2)均衡调度程序中各处理器上的运行队列。
(3)检查当前进程时间片是否用尽,如果用尽,重新调度进程
(4)更新资源消耗和处理器时间的统计值

节拍率(系统定时器频率):HZ

内核必须在硬件的帮助下才能计算和管理时间,硬件为内核提供了一个系统定时器来计算时间的流逝。系统定时器以某种频率自行触发,该频率可以通过系统编程预定,称作节拍率(例如,1s内100次,节拍率为100HZ)。因为节拍率是可知的,所有内核知道连续两次时钟中断的间隔时间,这个间隔时间叫做节拍,它等于节拍率分之1秒(节拍率为100HZ的节拍为10ms)。

内核在文件<asm/param.h>文件中定义了节拍率的值。这个值对于系统来说是非常重要的,因为很多内核任务都离不开它,所以选择一个合适的频率至关重要。

高节拍率的优势:意味着系统时间中断更加频繁,依赖于定时任务的系统调用精度更加准确,例如100HZ的节拍率进程调度任务的最大误差有10ms。

高节拍率的劣势:意味着系统的负担增重,因为处理器必须花更多的时间来处理时钟中断处理程序,这样会引起处理器处理其他工作的时间更少,频繁打乱处理器高速缓存以及增加耗电等问题。

jiffies

全局变量jiffies用来记录自系统启动开始所产生节拍次数的总和。系统启动的时候将该值初始化为0(实际上可能复杂点,需要考虑到溢出问题,可以百度查询jiffies回绕),此后,每次时钟中断就将该值增加1。因为1s的中断次数为HZ,系统运行时间以秒为单位,就等于(jiffies/HZ)s。
回绕问题
回绕问题(如上图)。

实时时钟

体系结构提供了两种设备进行计时:一种是前面说到的系统定时器,另一种是实时时钟。

实时时钟(RTC)是用来持久存放系统时间的设备。即便系统关闭了,它也能靠主板上微型电池提供的电力保持系统的计时。系统在启动时,内核会通过读取RTC来初始化实际时间(实际的日期),该时间存放在xtime变量中。并且有些体系结构(例如x86)会周期性的将当前时间存回RTC中。

时钟中断处理程序

处理程序的具体工作依赖于特定的体系结构,但是绝大多数处理程序都会执行以下操作:
(1)周期性设置实时时钟
(2)增加jiffies变量值
(3)统计系统资源消耗统计值(进程消耗的系统时间和用户时间)
(4)执行进程调度相关的sheduler_tick()函数。
(5)计算平均负载等等。

注:关于时钟还有定时器和延时执行两部分,都是比较容易通过字面理解的概念,具体的接口需查询相关资源。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值