关于内核中的乘法和除法。

作者:heziq 发布于:2015-5-6 22:02

前几天一直在看wowo的时间子系统,一直在思索mult和shift变量,为什么mult要尽量大,shift尽量小。这是由c语言的整数算术运算决定的。

cyn* mult > shift  在不考虑溢出的情况下,cyn * mult没有误差,右移shift有误差,损失小数。

但是如果cyn > shift * mult 在不考虑溢出的情况下,误差就会被放大。

10* 12 / 8 = 15

10 / 8 * 12 = 12

10 除以 8 = 1, 舍弃0.25 , 0.25 * 12 = 3. 可以看出乘法部分的误差被夸大12倍。

mult / shift 的比值越大越好,计算的值越精确。shift如果是1,就没有误差,如果shift是10,那么就只能精确到十位。

 

表达不好哈,不善于利用数学公式证明。我说的都是整数运算,不考虑浮点数。

 

总结两点:

内核中做运算

1,尽量做加减法,少做乘除法,尽量用移位做乘除法。这样运算速度快。

2,做乘除法的时候,先算乘法,最后做除法,乘法的时候注意溢出。

3,在特殊的情况下,被除数和除数的比值要尽量大,这样计算误差才会小。

评论(1) 浏览(12865)

spin_lock最简单用法。

作者:heziq 发布于:2015-4-17 10:13

最近在思考一个spin_lock的用法,比如在smp系统中,在一个内核控制路径的函数中有一个局部静态变量,对这个局部静态变量有判断,算术运算。那么我们是否要对这个局部静态变量使用spin_lock锁呢?

 

个人意见:需要使用,因为在smp系统中,多个内核控制路径可能同时访问该变量。所谓的共享资源,并不只是多个函数之间共享,在smp系统有可能是自己和自己共享。

 

欢迎大家拍砖。

标签: spin_lock使用

评论(4) 浏览(11472)

Copyright @ 2013-2015 蜗窝科技 All rights reserved. Powered by emlog