免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 1814 | 回复: 10
打印 上一主题 下一主题

something about jiffies overflow [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-04 16:18 |只看该作者 |倒序浏览
Hello,

we use the following to solve the problem of jiffies wraparound.
#define time_after(a,b)         \
        (typecheck(unsigned long, a) && \
         typecheck(unsigned long, b) && \
         ((long)(b) - (long)(a) < 0))
#define time_before(a,b)        time_after(b,a)

#define time_after_eq(a,b)      \
        (typecheck(unsigned long, a) && \
         typecheck(unsigned long, b) && \
         ((long)(a) - (long)(b) >= 0))
#define time_before_eq(a,b)     time_after_eq(b,a)

But I cannot understand it has some differences comparing with the
following code.

/* code 2*/

unsigned long timeout = jiffies + HZ/2;

if(timeout < jiffies)
{
        /* not timeout...*/
}
else
{
        /* timeout processing...*/
}

questions:
  1.why the macros of time_after can solve the jiffies wraparound problem?
  2.Is there any other possibilities for the "code 2" to overflow
except the jiffies overflow?

Any help will be preferred .
Thank you,

论坛徽章:
0
2 [报告]
发表于 2006-01-04 17:11 |只看该作者
第一个问题,就是检查jiffies增1前后的数值,是否增1后的数值大于未增1时的数值。如果是,说明尚未溢出。(我没找到具体代码在哪里检查的,猜测)  unsigned long 溢出时应该是变为0,小于未溢出时的值,这样就检查出来了。

第二个问题,你指的是timeout本身溢出了吗?从代码上看,这是可能的。如果jiffies本身就已经接近溢出,HZ又是一个很大的值,timeout一赋值就溢出了,下面的程序分支就会出现错误。

论坛徽章:
0
3 [报告]
发表于 2006-01-04 17:16 |只看该作者
lkd一书中有关于这些宏的描述
代码在jiffies.h中。
溢出这个事情我很明白的
我的意思是为什么那些宏能解决溢出带来的问题。

论坛徽章:
0
4 [报告]
发表于 2006-01-04 17:25 |只看该作者
原帖由 jeffshia 于 2006-1-4 17:16 发表
lkd一书中有关于这些宏的描述
代码在jiffies.h中。
溢出这个事情我很明白的
我的意思是为什么那些宏能解决溢出带来的问题。


lkd曾经很熟,都忘个差不多了
调用time_after这些宏来检查溢出的代码在哪里?

论坛徽章:
0
5 [报告]
发表于 2006-01-04 17:29 |只看该作者
不是使用这个来检查溢出,而是用这个来防止溢出带来的错误。
由于unsigned long 是32位的有符号数,所以jiffies的最大值到了4294967295的时候就会溢出。
溢出就会造成诸如

jiffies-timeout<0之类的判断发生错误。
这些宏就是用来解决这些问题的。
但是我就是想不明白,
这些宏就使作了一些类型的强制转换阿,
就是把unsigned long型的数据转换成了long型的数据而已。
想不明白。

论坛徽章:
5
6 [报告]
发表于 2006-01-05 11:52 |只看该作者
unsigned long timeout = jiffies + HZ/2;

if(timeout < jiffies)
{
        /* not timeout...*/
}
else
{
        /* timeout processing...*/
}


你这段代码是不是应该这样?
if(timeout > jiffies)
{
        /* not timeout...*/
}
else
{
        /* timeout processing...*/
}
估计你的OS是Redhat,在Redhat下jiffies会被初始化成很大的值,大概四五分钟后,它会重新回到0。

如果jiffies非常大,快溢出。jiffies+HZ/2已经溢出,成非常小的值。这时你对timeout的判断就不正确。
你把代码改成如下,试一下:
if(timeout -jiffies < = jiffies - timeout)
{
        /* not timeout...*/
}
else
{
        /* timeout processing...*/
}

论坛徽章:
0
7 [报告]
发表于 2006-01-05 12:42 |只看该作者
估计你的OS是Redhat,在Redhat下jiffies会被初始化成很大的值 ...


这个结论从什么地方出来的呢?

论坛徽章:
0
8 [报告]
发表于 2006-01-05 12:45 |只看该作者
无符号数转变成了有符号数,的确可以解决溢出wraparound的问题,不信可以写一个简单程序试试。

unsigned long time1, time2;
long time;

time = (long)time1-(long)time2;

大家可以对time1和time2赋值试一下。能解决unsigned long 溢出的问题。
就是那些宏:
#define time_after(a,b)         \
        (typecheck(unsigned long, a) && \
         typecheck(unsigned long, b) && \
         ((long)(b) - (long)(a) < 0))
#define time_before(a,b)        time_after(b,a)

#define time_after_eq(a,b)      \
        (typecheck(unsigned long, a) && \
         typecheck(unsigned long, b) && \
         ((long)(a) - (long)(b) >= 0))
#define time_before_eq(a,b)     time_after_eq(b,a)

论坛徽章:
0
9 [报告]
发表于 2006-01-05 12:46 |只看该作者
应该是没有这个问题。忘了FC4原来的HZ是多少了, 我自己都是设为1000, jiffies从引导时设置为0, 然后每隔1/HZ秒就增1,  几个月之内是不可能溢出的。
而且现在的内核代码, jiffies = jiffies_64,永远都不会溢出吧?

论坛徽章:
5
10 [报告]
发表于 2006-01-05 14:20 |只看该作者
这个结论从什么地方出来的呢?

因为之前我在Redhat AS4 - Redhat AS4 update 5下,都遇到过jiffies溢出的问题。其它OS下还没遇到过

应该是没有这个问题。忘了FC4原来的HZ是多少了, 我自己都是设为1000, jiffies从引导时设置为0, 然后每隔1/HZ秒就增1,  几个月之内是不可能溢出的。

不是所有OS的jiffies都初始化为0

[ 本帖最后由 yidou 于 2006-1-5 14:24 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP