Linux内核中许多工作都高度依赖时间信息。因此了解Linux内核时间机制很有必要。
在Linux内核中,有一些重要的内核定时器变量,jiffies、HZ、以及xtime。
一:HZ和jiffies
- HZ的值取决与体系架构,在x86系统上,在2.4内核中,该值默认设置为100;在2.6内核中,该值变为了1000,在基于ARM的平台上,2.6内核将HZ设置为100,在3.4内核版本中,可以在编译内核时通过配置菜单选项设置一个HZ值,该选项的默认值取决与体系架构的版本。
-
drivers/ide/ide.c jiffies变量记录了系统启动以来,系统定时器已经触发的次数。内核每秒将jiffies变量增加HZ次。可以这样理解,HZ=100时,1个jiffy等于10ms,当HZ=1000时,一个jiffy相当1ms。上图代码是一个很好的例子,如果忙条件在3s内被清除,则代码将返回SUCCESS,否则返回-EBUSY。其中3HZ表示3s内jiffies的数量。jiffies为Volatile类型,使得编译器不对jiffies变量进行优化,确保每次发生定时器中断时序都能更新jiffies值,并且循环中的每一步都会重新读取jiffies值。
2、长延时
在内核中,以jiffies为单位进行的延时通常被认为是长延时。
实现长延时最好的方法是睡眠等待而不是忙等待。
unsigned long timeout = HZ;
schedule_timeout(timeout);
3、短延时
在linux内核中,小于jiffy的延时被认为是短延时,此时睡眠等待将不能用于短的超时,唯一的解决途径就是忙等待。