linux内核之时钟管理

时钟管理

      • 定时器和时间管理
          • 节拍率:HZ
          • jiffies
          • 实时时钟
          • 时钟中断处理程序

定时器和时间管理

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

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

节拍率:HZ

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

内核在文件文件中定义了节拍率的值。这个值对于系统来说是非常重要的,因为很多内核任务都离不开它,所以选择一个合适的频率至关重要。
提高节拍率,意味着系统时间中断更加频繁,依赖于定时任务的系统调用精度更加准确,进程调度也会更加准确。但是高节拍率也意味着系统的负担增重,因为处理器必须花更多的时间来处理时钟中断处理程序,这样会引起处理器处理其他工作的时间更少,频繁打乱处理器高速缓存以及增加耗电等问题。

jiffies

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

实时时钟

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

实时时钟(RTC)是用来持久存放系统时间的设备。即便系统关闭了,它也能靠主板上微型电池提供的电力保持系统的计时。系统在启动时,内核会通过读取RTC来初始化实际时间(实际的日期),该时间存放在xtime变量中。

时钟中断处理程序

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

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

你可能感兴趣的:(#,Linux历程,linux,单片机,运维)