全局变量jiffies用来记录自系统启动以来产生的节拍的总数。启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量的值。一秒内时钟中断的次数等于Hz,所以jiffies一秒内增加的值也就是Hz。系统运行时间以秒为单位,等于jiffies/Hz。
将以秒为单位的时间转化为jiffies:
seconds * Hz
将jiffies转化为以秒为单位的时间:
jiffies / Hz
相比之下,内核中将秒转换为jiffies用的多些。
硬件给内核提供一个系统定时器用以计算和管理时间,内核通过编程预设系统定时器的频率,即节拍率(tick rate),每一个周期称作一个tick(节拍)。Linux内核从2.5版内核开始把频率从100调高到1000(当然带来了很多优点,也有一些缺点).
jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数。譬如,如果计算系统运行了多长时间,可以用 jiffies/tick rate 来计算。jiffies定义在文件<linux/jiffies.h>中:
extern unsigned long volatile jiffies;
可以利用jiffies设置超时等,譬如:
unsigned long timeout = jiffies + tick_rate * 2; // 2秒钟后超时
if(time_before(jiffies, timeout){
// 还没有超时
}
else{
// 已经超时
}
• jiffies的回绕wrap around
当jiffies的值超过它的最大存放范围后就会发生溢出。对于32位无符号长整型,最大取值为(2^32)-1,即429496795。如果节拍计数达到了最大值后还要继续增加,它的值就会回绕到0。
内核提供了四个宏来比较节拍计数,这些宏定义在文件<linux/jiffies.h>中:
time_before(unknown, known)
time_after(unknown, known)
time_before_eq(unknown, known)
time_after_eq(unknown, known)
比较的时候用这些宏可以避免jiffies由于过大造成的回绕问题。
• 用户空间和HZ
问题提出:
在2.6以前的内核中,如果改变内核中的HZ值会给用户空间中某些程序造成异常结果。因为内核是以节拍数/秒的形式给用户空间导出这个值的,应用程序便依赖这个特定的HZ值。如果在内核中改变了HZ的定义值,就打破了用户空间的常量关系---用户空间并不知道新的HZ值。
解决方法:
内核更改所有导出的jiffies值。内核定义了USER_HZ来代表用户空间看到的HZ值。在x86体系结构上,由于HZ值原来一直是100,所以USER_HZ值就定义为100。内核可以使用宏jiffies_to_clock_t()将一个有HZ表示的节拍计数转换为一个由USER_HZ表示的节拍计数。

参考:
http://www.cnblogs.com/leaven/archive/2010/08/30/1812338.html
http://www.cnblogs.com/simonshi/archive/2010/12/13/1694819.html

最新文章

  1. 编译器开发系列--Ocelot语言7.中间代码
  2. 编写可编辑的List控件
  3. EntLib Unity父类的依赖注入问题
  4. aspx文件、aspx.cs文件、aspx.designer.cs文件之讲解
  5. call()和apply()方法
  6. [DevExpress]ChartControl之饼状图百分比示例
  7. HTML特殊字符大全
  8. 数据交互 ajax代码整理
  9. 文档整体解决方案(readthedocs、github 、sphinx)使用
  10. Python 迭代器之列表解析
  11. mongodb集群性能优化
  12. driftnet 抓取图片总结
  13. .Net开发八年,坐标杭州,上个月换工作感觉现在.Net岗位很少,希望和同在杭州的同行们交流一下
  14. Java初学者笔记二:关于类的常见知识点汇总
  15. java多态-优化上个实例
  16. HDU 3790(两种权值的迪杰斯特拉算法)
  17. Flexbox布局模式的理解
  18. UVA 11827 水
  19. iOS:UICollectionView纯自定义的布局:堆叠式布局、圆式布局 (一般用来制作相册)
  20. Winform下极简后台异步工作教程

热门文章

  1. 将request.getParameterMap()转换成可操作的普通Map
  2. 反汇编一个dos软盘的启动扇区
  3. windows下的mongodb分片配置
  4. [IT新应用]如何部署CITRIX 虚拟桌面
  5. JavaScript 页面跳转的几种方式 转
  6. php isset() empty() 区别, 判断 变量存在与否神器
  7. MVC两个必懂核心
  8. Centos下使用Heartbeat实现集群[转]
  9. 【运维工具】logrotate 日志管理神器
  10. 用GitLab搭建自己的私有GitHub