Linux定时器和时间管理
时间驱动的函数,周期执行的函数都需要定时器。
有两种硬件实现计时:系统计时器和实时时钟。
定时器中断
系统定时器是一个可编程芯片,它能以固定频率(可以修改)产生中断,它产生的中断就是定时器中断。
定时器中断负责更新系统时间,也负责执行周期性运行的任务。
系统定时器和时钟中断处理程序是Linux系统内核管理机制的中枢。
时间是根据,中断数间隔*系统已知的中断间隔时间 来计算的。
系统计时:系统计时器
内核必须在系统定时器的帮助下才能计算和管理时间,内核通过计算时间中断来维护时间。
定时器中断的频率:HZ
系统的定时器频率(节拍率)是通过静态预处理定义的,也就是HZ,在系统启动时按照HZ值对硬件进行配置。
周期性函数的执行
就是经过固定的定时器中断后执行。
jiffies
全局变量jiffies用来记录自系统启动以来产生的节拍(定时器中断)总数。
每次定时器中断触发的时钟处理程序都会增加这个值。
系统计时:实时时钟
实时时钟是用来存放系统时间的设备,系统关闭后,它仍然能够依靠主板上的微型电池提供的电力保持系统计时。
当系统启动时,内核通过读取实时时钟来初始化系统的墙上时间,该时间放在xtime变量中。
时钟中断处理程序:每一个时钟中断执行
工作内容:
- 获得xtime_lock锁,访问jiffies_64和墙上时间xtiem。
- 更新系统时钟。
- 给jiffies_64变量增加1。
- 更新资源消耗的统计值,比如进程消耗的系统时间。
- 执行到期的动态计时器。
- 更新墙上时间。
所以内核对进程计时,就是依据时钟中断处理程序的,所以HZ越高,那么就越准。
定时器:可以指定函数在3:30执行
定时器不是周期执行,而是一次性的。
内核会在时钟中断后检查是否有定时器需要执行。