jiffies溢出与时间先后比较-time_after,time_before【转】
转自:http://www.cnblogs.com/hfyinsdu/p/4600052.html
参考地址:
http://blog.csdn.net/jk110333/article/details/8177285
http://blog.chinaunix.net/uid-23629988-id-3477143.html
补码的说明:
http://baike.baidu.com/link?url=qz8yHnVCqqKWguIDLOfcRZDBfLy4h1ekzspS7Rkznu8RdvMYm0QnK_vhBTHP_SSQRzV--lhiGS7lF32fB4xC5q
说明:
计算机位数限制,能表示的数值范围也是有限的;比如129在8位的计算机中,表示为1000 0001,按有符号数读取的话就是-127,无符号读取就是129.
所以在判断结果是否小于0的时候,应该看存储的二进制的最高位是否为1.
比如127-(-3)=130,虽然看起来是个正数,但是在8位计算机中,以有符号数读取的话就是负数,因为130存储为1000 0010.
Linux内核为了解决jiffies的回绕问题,提供了现成的宏,用于判断时间的先后。今天就以time_after为例,看看它为什么可以应对jiffies的回绕问题。
/*
* These inlines deal with timer wrapping correctly. You are
* strongly encouraged to use them
* 1. Because people otherwise forget
* 2. Because if the timer wrap changes in future you won't have to
* alter your driver code.
*
* time_after(a,b) returns true if the time a is after time b.
*
* Do this with "<0" and ">=0" to only test the sign of the result. A
* good compiler would generate better code (and a really good compiler
* wouldn't care). Gcc is currently neither.
*/
#define time_after(a,b) \
(typecheck(unsigned long, a) && \
typecheck(unsigned long, b) && \
((long)(b) - (long)(a) < 0))
这个宏定义很简单,可以忽略typecheck,其就是用于检查参数的类型是否正确。如这里就是用于判断a和b是否为unsigned long类型。
最关键的就是((long)(b) - (long)(a) < 0)。
在理想的情况下,时间是可以不停增长的,后来的时间值一定比前面的值大。所以b-a一定小于0。然后计算机的世界不是一个理想的世界,
所有的值都有其位数限制的。在32位平台上,long的位数为32位。按照二进制补码的表示方式,从0到0x7fffffff的区间,值是逐渐递增的。
从0x80000000到0xFFFFFFFF这个区间,值是逐渐缩小的。
这就有4中情况:
1. a和b都在0到0x7FFFFFFF之间:
a若在b之后发生,则a的值大于b。那么(long)b-(long)a<0。
2. a和b都在0x80000000到0xFFFFFFFF之间:
a若在b之后发生,b为较大的负数,a为较小的负数,那么(long)b-(long)a<0。
3. b在0到0x7FFFFFFF之间,而a在0x80000000到0xFFFFFFFF之间:
a为负数。b-a,相当于b+(-a)。只要a与b之间的绝对差值小于或等于0x80000000,则b+(-a)仍然为负数。
4. b在0x80000000到0xFFFFFFFF之间,而a在0到0x7FFFFFFF之间:
b为负数,b-a等于b+(-a)。同样在a与b之间的绝对差值小于或等于0x80000000,则b+(-a)仍然为负数。
总结这四种情况,在a与b的绝对值相差不到0x80000000时,这个宏是正确的。而在利用jiffies作为时间度量和比较单位时,时间差并不会太大。
所以这个time_after可以有效的避免jiffies回绕问题。
jiffies溢出与时间先后比较-time_after,time_before【转】的更多相关文章
- jiffies溢出与时间先后比较-time_after,time_before
参考地址: http://blog.csdn.net/jk110333/article/details/8177285 http://blog.chinaunix.net/uid-23629988-i ...
- 对 jiffies 溢出、回绕及 time_after 宏的理解
原文如下: 关于jiffies变量: 全局变量jiffies用来记录自启动以来产生的节拍的总数.系统启动时会将该变量初始化为0,此后,每当时钟中断产生时就会增加该变量的值.jiffies和另外 ...
- linux内核计算时间差以及jiffies溢出
jiffies是每一个时钟中断,都会加1.这就导致一个问题.不管jiffies(一般来说是unsigned long类型)多少个字节,总有溢出的时候. 更极端的时候.当期jiffies是0xfffff ...
- 为何time_before 起作用【转】
转自:http://decimal.blog.51cto.com/1484476/410673 Title: jiffies溢出与时间先后比较编制: chinakapok@sina.com日期:200 ...
- Linux时间子系统之三:jiffies
1. jiffies背景介绍 jiffies记录了系统启动以来,经过了多少tick. 一个tick代表多长时间,在内核的CONFIG_HZ中定义.比如CONFIG_HZ=200,则一个jiffies对 ...
- linux时间管理 之 jiffies
1.jiffies 又称时钟滴答,是一个全局变量,它的值在系统引导的时候初始化为0,在时钟中断初始化完成后,每次时钟中断发生,在时钟中断处理例程中都会将jiffies的值 +1. jiffies_64 ...
- linux定时器HZ和Jiffies
1.linux HZ Linux核心几个重要跟时间有关的名词或变数,以下将介绍HZ.tick与jiffies. HZ Linux核心每隔固定周期会发出timer interrupt (IRQ 0),H ...
- Linux内核jiffies简介
在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构struct timeval{time_t tv_sec; ...
- Linux内核中的jiffies及其作用介绍及jiffies等相关函数详解
在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构struct timeval{time_t tv_sec; ...
随机推荐
- C# Excel写入
基本思路,就是using Microsoft.Office.Interop.Excel;然后启动excel来处理 创建excel文件,代码如下: if (File.Exists(path)) { re ...
- sqlserver 2000事务复制问题
2000现在用的估计不多了,把之前收集的一些复制问题整理发布出来.可能都是些很白很二的问题,但人总是由最初的无知不断成长,不对之处欢迎指正. sqlserver 2000事务复制问题服务器A(发布) ...
- nagios监控linux主机监控内存脚本
说明 工作包括两部分监控端(一二三)和被监控端(四) 一.nrpe.cfg中添加脚本 nrpe.cfg中添加命令索引 command[check_used_mem]=/usr/local/nagios ...
- Spring AOP 问与答
AOP的实现有哪些 AOP常见的实现有: Spring AOP Aspectj Guice AOP Jboss AOP 等 AOP Alliance 是什么, 为什么Spring AOP, G UIC ...
- Oracle 11g RAC INS-06006 Passwordless SSH connectivity not set up between the following node(s)
安装11g RAC的grid时,在Test互信的时候报错INS-06006 Passwordless SSH connectivity not set up between the following ...
- Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)
声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutpu ...
- 试用windows Azure
试用windows Azure, 需要国外手机注册,信用卡注册. windows操作系统,只有2008R2,2012,2012R2可以选择,我选择XS最低档,然后选2012R2,欧洲数据中心,那个慢啊 ...
- Lintcode: Singleton && Summary: Synchronization and OOD
Singleton is a most widely used design pattern. If a class has and only has one instance at every mo ...
- html 圆角边框
<input style="border-radius: 10px;" type="submit" value="确认"> bo ...
- jsp eclipse 创建jsp项目
选择File菜单 File->new->Other... 选择Dynamic Web Project项目->Next 写入项目->Finish 在WebContent鼠标右键- ...