Linux内核设计基础(三)之定时器和时间管理

版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/BlueCloudMatrix/article/details/29294529

内核知道连续两次时钟中断的间隔时间。而这个间隔时间就是所谓的节拍,它是从节拍率计算而来。


节拍率:

节拍率也叫系统定时器(硬件)频率或时钟中断频率,用HZ来度量。

在x86体系结构下。节拍率默认100HZ。事实上怎样确定HZ值是一门非常大的学问。提高HZ等同于提高中断解析度。比方HZ=100的时钟的运行粒度为10ms,即系统中的周期事件最快为每10ms运行一次。但当HZ=1000时,解析度为1ms——精细了10倍。这对于触发定时器超时,能够提高精确度。事实上高的HZ会加重系统负担,由于每一次时钟中断就要去运行对应的中断处理程序,这样占用处理器的时间会增多。

Linux支持无节拍操作,会动态调整时钟中断周期,使得空暇时不会被不必要的时钟中断打断,能够省电。


jiffies:

全局变量jiffies(unsigned long)用来记录自系统启动以来产生的节拍的总数。每次时钟中断就会添加该值,所以jiffies一秒内添加的值就为HZ。所以系统运行时间等于jiffies/HZ。


实时时钟RTC:

RTC是用来持久存放系统时间的设备。即便系统关闭后,它也能够靠主板上的微型电池提供的电力继续为系统计时。RTC最基本的作用是在启动时初始化xtime变量。以便得到墙上时间。

与RTC对应的是系统定时器。系统定时器的根本思想是——提供一种周期性触发中断机制。


时钟中断处理程序:

与体系结构相关的例程作为系统定时器的中断处理程序而注冊到内核中。以便在产生时钟中断时。它能够对应地运行。

  • 获得xtime_lock锁,以便对訪问jiffies_64和墙上时间xtime进行保护。
  • 须要时应答或又一次设置系统时钟。
  • 周期性地使用墙上时间更新实时时钟。

  • 调用体系结构无关的时钟例程,tick_periodic()。

tick_periodic()用来进行与体系结构无关的操作。
  • 给jiffies_64变量添加1。

  • 更新资源消耗的统计值。如当前进程消耗的系统时间和用户时间。
  • 运行已经到期的动态定时器。
  • 运行scheduler_tick()。

  • 更新墙上时间,该时间存放在xtime变量中。

  • 计算平均负载值。

定时器:
我们之前提到的下半部推后运行。就须要定时器来告诉我们究竟推后到何时。定时器的使用非常easy。你仅仅须要运行一些初始化工作,设置一个超时时间,指定超时发生后运行的函数,然后激活定时器就OK了。指定的函数将在定时器到期时自己主动运行。定时器并不周期运行,超时后自行撤销。须要又一次创建。



posted on 2019-04-24 19:34  xfgnongmin  阅读(333)  评论(0编辑  收藏  举报

导航