[linux内核][linux]linux内核时间管理基础

一,linux时间管理基础
http://blog.csdn.net/droidphone/article/details/7975694
http://blog.csdn.net/smilingjames/article/details/6205540
linux所有时间基础都是以低层硬件为基础的,低层硬件有GPT和cpu local timer,比如GPT的时钟源为13M HZlinux低层时间的架构分为clock source,clock event device,clock source上层分为Xtimer和Hrtimer,Xtimer主要是指墙上时间(开机的时候从RTC寄存器读取墙上时间),Hrtimer主要是高精度的计时器,精度可以到ns级别,Clock event Device向上层提供jiffies以及时间轮的概念,比如进程切换的最小精度是10ms。

struct clocksource,定义了一个clock device的基本属性及行为, 这些clock device一般都有计数,定时, 产生中断能力, 比如GPT
struct clock_event_device  Clock event的主要作用是分发clock事件及设置下一次触发条件. 在没有clock event之前,时钟中断都是周期性地产生, 也就是熟知的jiffies和HZ

二:jiffies和HZ的概念
在ARM系统上HZ的大小一般为100,表示1s内有100个节拍,jiffies表示的是系统自从启动以来的节拍总数,jiffies一般为unsigned long类型,所以可能会溢出。比如:unsigned long jiffies; unsigned long timeout=jiffies+HZ/2;表示的是未来的0.5s
jiffies回绕的问题:

[cpp] view plaincopy
 
  1. 01.unsigned long jiffies;  
  2. 02.unsigned long timeout = jiffies + HZ/2;  
  3. 03.//......  
  4. 04.if (timeout > jiffies) {  
  5. 05.        //没有超时,很好  
  6. 06.}  
  7. 07.else {  
  8. 08.        //超时了,发生错误  
  9. 09.}  

其中jiffies是个不断在增大的unsigned long,timeout可以看作比jiffies“大不了多少”的unsigned long。当jiffies变得比2^32-1还要大的时候会发生溢出,“回绕”(wrap around)到0附近。
此时,判断语句为真,虽然实际上超时了,但是判断为没有超时。
Linux内核提供了一组宏解决这个问题。其中宏time_after(a, b)是考虑可能的溢出情况后判断时间a是否在时间b之后(即“b < a”)。

[cpp] view plaincopy
 
    1. 01.#define time_after(a, b) ((long)(b) - (long)(a) < 0)  
原文地址:https://www.cnblogs.com/zhiliao112/p/4232153.html