金庸老爷子在《神雕侠侣》中说独孤求败的玄铁重剑时,说道“重剑无锋,大巧不工”。他说的是如果个人修养达到一定的阶段,“花石草木皆可为剑”,而不需要更多技巧。在Linux内核中从来不缺少简洁、优美、高效的实现代码,缺少的是发现这些美的眼睛和毅力。在Linux内核中,代码的简洁高效并不意味采用了失传很久的武林绝技,恰恰相反,它们往往通过最基本的知识和数据结构来实现完美的代码,而kfifo可以说就是其中的一个典范。
这里用“大巧不工”来形容Linux中的无锁环形队列显然不合适,原因在于:无锁环形队列属于精雕细琢,大道至简、匠心独运,简洁而不简单。它使用最基本的技术知识实现了重要的功能。下面我们便一睹其芳容。
“数据结构,它采用了前面提到的环形缓冲区来实现,提供一个无边界的字节流服务。采用环形缓冲区的好处为,当一个数据元素被用掉后,其余数据元素不需要移动其存储位置,从而减少拷贝提高效率。更重要的是,kfifo采用了并行无锁技术,kfifo实现的单生产/单消费模式的共享队列是不需要加锁同步的。
当前高性能的服务器软件(例如HTTP加速器)大多都运行在多核服务器上,当前的硬件可以支持32、 64甚至更多的CPU,在这种高并发的环境下,锁竞争机制有时候比数据拷贝、上下文切换等更伤害系统的性能,因此在多核环境下,需要把重要的数据结构从锁的保护下移到无锁环境中,以此来提高软件的性能。
所以,现在无锁机制越来越流行,在不同的环境中使用不同的无锁队列可以节省开销,提高程序效率。
[1] 摘自《深入浅出DPDK》第四章同步互斥机制:4.4.1 Linux内核无锁环形缓冲
下面我们说一下kfifo的结构
kfifo结构中个字段的含义:
缓冲区空间的大小,要求为2的幂次方 |
用来同步多个生产者、多个消费者的情形 |
Kfifo无锁队列的应用注意事项:
以上三种条件都满足的情况下可以使用kfifo无锁队列。相反,如果存在多个生产者或者多个消费者,则可以通过锁来进行同步:
Kfifo的初始化是指为kfifo分配空间、初始化kfifo中的各项参数等操作。
在这个kfifo_alloc()
函数中,要求size需要为2的幂次方,如何实现高效的判断呢?
在二进制中,2的幂次方很容易表示:一个数只有一个bit上是1,其余全为0,例如:
也就是说,如果我们可以判断:一个数的二进制上只有一个bit位为1,那么这个数肯定为2的幂次方。问题发生了等价转换,那么我们如何判断 一个数的二进制中包含几个1呢???。【这是面试中的一个常见问题和技巧】。方法就是:x & (x -1)==0, 则这个数二进制中只有一个1,否则包含多个1。通常使用这个方法来计算一个数中包含几个1。
/*求一个数的二进制中1的个数*/
简单的说:x & (n -1)会将x二进制中最低位上的1置为0(最后一个1置为0)。因此如果n&(n-1)==0,那个说明这个数二进制中只有一个bit位为1,因此肯定是2的幂次方。
我看还是直接看内核实现吧:
这个效率嘛? 由于全是位运算,肯定为求模、取余等四则运算效率要高, 不能放过任何一点可以优化的地方。至于这样做的原理,自己品品吧,也是相当经典的存在。
为了使用位运算,快, 快,不择手段的快
需要说明的是Linux 2.6.12版本的内核实现中并没有使用内存屏障,而在后续版本中添加了内存屏障,它是实现无锁队列的核心和关键。这里我们就按照Linux2.6.12版本实现来说明简单原理,关于内存屏障,可以参考我的另一篇博文《什么是内存屏障? Why Memory Barriers ?》
in & (size - 1)表示in落在size空间指针的位置,作用相当于in%size, 但位运算效率更高。通过min获取fifo右侧剩余空间大小,防止越界 |
将数据拷贝到fifo右侧剩余空间 |
len-l表示右侧空间不足时,左侧需要填充的数据长度 |
连个if都不想用,真是太抠门了,哎。你多少if-else判断下in,out,len的关系,能让我舒服点呀!!!
其次,它的原理是:size为2的幂次方,size -1则表示【0,size-1】每一个bit位都是1,可以得到该范围的所有值,这也是要求size为2的幂次方的原因。
最后,两者在本质上是等价的,但是in & (size -1)
只进行位操作,效率高很多。
当右侧长度不够入队长度时,需要在kfifo左侧入队,此时kfifo左右的范围为【0,len-l】,左侧的范围为【in,in+l】。
因此,无论何时,即使发生整数回绕,kfifo中的变量都有如下关系:
可惜我体会还是没有那么深刻。
看完kfifo的实现,最大的感觉就是? 不不,文明人说文明话,妙,是真的妙不可言。如果说这代码是我或者同事写的,我会觉得里面会不会有很多bug,但是如果为内核大佬写的,我觉得没有,就是没有,真的没有呀!!!
第1篇:分式方程练习题
3、分式的基本*质:;
(其中)。(注意分式基本*质的应用,如改变分子、分母、分式本身的符号,化分子、分母的系数为整数等等)。
4、分式的约分:。(思考:公因式的确定方法)。
8、分式加减法法则:_____。(加减法的结果应化成)
10、分式混合运算的顺序:。
11、分式方程的定义:。
12、解分式方程的基本思想:____;如何实现:。
14、解分式方程的步骤:
15、用分式方程解决实际问题的步骤:
1、当x时,分式有意义;当x时,分式无意义。
2、分式:当x______时分式的值为零。
7、一件工作,*单独做小时完成,乙单独做小时完成,则*、乙合作小时完成。
8、若分式方程的一个解是,则。
10、若分式13-x的值为整数,则整数x=。
11、不改变分式的值,把下列各式的分子、分母中的各项系数都化为整数:
13、若分式的值为负数,则x的取值范围是__。
15、一项工程,*单独做x小时完成,乙单独做y小时完成,则两人一起完成这项工程需要______________小时。
16、若关于x的分式方程无解,则m的值为__________。
20、在等号成立时,右边填上适当的符号:=____________。
22、某工厂库存原材料x吨,原计划每天用a吨,若现在每天少用b吨,则可以多用天。
23、某商场降价销售一批服装,打8折后售价为120元,则原销售价是元。
25、*、乙两人从两地同时出发,若相向而行,则a小时相遇;若同向而行,则b小时*追上乙,那么*的速度是乙的速度的________倍.
1、下列各式中,分式有()个
2、如果把分式中的和都扩大3倍,那么分式的值()
a、扩大3倍b、缩小3倍c、缩小6倍d、不变
3、下列约分结果正确的是()
4、计算:,结果为()
5、某农场开挖一条480米的渠道,开工后,每天比原计划多挖20米,结果提前4天完成任务,若设原计划每天挖米,那么求时所列方程正确的是()
6、下列说法正确的是()
(a)形如ab的式子叫分式(b)分母不等于零,分式有意义
(c)分式的值等于零,分式无意义(d)分子等于零,分式的值就等于零
8、下列分式一定有意义的是()
9、下列各分式中,最简分式是()
10、在一段坡路,小明骑自行车上坡的速度为每小时v1千米,下坡时的速度为每小时v2千米,则他在这段路上、下坡的平均速度是每小时()。
a、千米b、千米c、千米d无法确定
11、若把分式中的x和y都扩大3倍,那么分式的值()
a、扩大3倍b、不变c、缩小3倍d、缩小6倍
13、若已知分式的值为0,则x-2的值为()
五、先化简,再请你用喜爱的数代入求值:(-)÷.
六、列分式方程解应用题”
1、*、乙两地相距19千米,某人从*地出发出乙地,先步行7千米,然后改骑自行车,共用2小时到达乙地。已知这个人骑自行车的速度是步行速度的4倍。求步行速度和骑自行车的速度。
2、*、乙两组学生去距学校4.5千米的敬老院打扫卫生,*组学生步行出发半小时后,乙组学生骑自行车开始出发,结果两组学生同时到达敬老院,如果步行的速度是骑自行车的速度的,求步行和骑自行车的速度各是多少?
3、为加快西部大开发,某自治区决定新修一条公路,*、乙两工程队承包此项工程。如果*工程队单独施工,则刚好如期完成;如果乙工程队单独施工就要超过6个月才能完成,现在*、乙两队先共同施工4个月,剩下的由乙队单独施工,则刚好如期完成。问原来规定修好这条公路需多长时间?
4、*、乙两班学生植树,原计划6天完成任务,他们共同劳动了4天后,乙班另有任务调走,*班又用6天才种完,求若*、乙两班单独完成任务后各需多少天?
5、一条船往返于*乙两港之间,由*至乙是顺水行驶,由乙至*是逆流水行驶,已知船在静水中的速度为8km/h,平时逆水航行与顺水航行所用的时间比为2:1,某天恰逢暴雨,水流速度是原来的2倍,这条船往返共用了9h.问*乙两港相距多远?
2、已知.试说明不论x在许可范围内取何值,y的值都不变.
3、(1)将*种漆3g与乙种漆4g倒入一容器内搅匀,则*种漆占混合漆的;如从这容器内又倒出5g漆,那么这5?漆中有*种漆有g.
(2)小明到姑姑家吃早点时,表妹小红很淘气,她先从一杯豆浆中,取出一勺豆浆,倒入盛牛奶的杯子中搅匀,再从盛牛奶的杯子中取出一勺混合的牛奶和豆浆,倒入盛豆浆的杯子中.小明想:现在两个杯子中都有了牛奶和豆浆,究竟是豆浆杯子中的牛奶多,还是牛奶杯子中的豆浆多呢?(两个杯子原来的牛奶和豆浆一样多).现在来看小明的分析:
设混合前两个杯子中盛的牛奶和豆浆的体积相等,均为a,勺的容积为b.为便于理解,将混合前后的体积关系制成下表:
混合前的体积第一次混合后第二次混合后
豆浆牛奶豆浆牛奶豆浆牛奶
①将上面表格填完(表格中只需列出算式,无需化简).
②请通过计算判断:最后两个杯子中都有牛奶和豆浆,究竟是豆浆杯子中的牛奶多,还是牛奶杯子中的豆浆多呢?
第2篇:分式方程的解法练习题
分式方程是方程中的一种,是指分母里含有未知数或含有未知数整式的有理方程,该部分知识属于初等数学知识。以下是小编整理的分式方程的解法练习题,欢迎阅读。
方程两边同时乘以最简公分母,将分式方程化为整式方程;若遇到互为相反数时。不要忘了改变符号。
(最简公分母:①系数取最小公倍数②未知数取最高次幂③出现的因式取最高次幂)
移项,若有括号应先去括号,注意变号,合并同类项,把系数化为1求出未知数的值;
求出未知数的值后必须验根,因为在把分式方程化为整式方程的过程中,扩大了未知数的取值范围,可能产生增根。
验根时把整式方程的根代入最简公分母,如果最简公分母等于0,这个根就是增根。否则这个根就是原分式方程的根。若解出的根都是增根,则原方程无解。
如果分式本身约分了,也要代入进去检验。
在列分式方程解应用题时,不仅要检验所得解的是否满足方程式,还要检验是否符合题意。
一般的,解分式方程时,去分母后所得整式方程的解有可能使原方程中分母为零,因此要将整式方程的解代入最简公分母,如果最简公分母的值不为零,则是方程的解.
(1)注意去分母时,不要漏乘整式项。
(2)??根是分式方程去分母后化成的整式方程的根,但不是原分式方程的根。
(3)??根使最简公分母等于0。
(4)分式方程中,如果x为分母,则x应不等于0。
第3篇:分式方程练习题及*
分式方程是数学中基础数学一个很重要的知识点,学好分式方程,更极大的提高运算能力,下面是分式方程练习题及*,欢迎参考阅读。
1.下面是分式方程的是()
2.若得值为-1,则x等于()
3.一列客车已晚点6分钟,如果将速度每小时加快10千米,那么继续行驶20千米便可正点运行,如果设客车原来行驶的速度是x千米/小时,可列出分式方程为()
4.分式方程的解为()
5.若分式方程的解为2,则a的值为()
6.分式方程的解是()
7.如果关于x的方程无解,则m等于()
8.解方程时,去分母得()
9.已知关于的分式方程的根大于零,那么a的取值范围是.
10.关于的分式方程有增根=-2,那么k=.
11.若关于的方程产生增根,那么m的值是.
12.当m=时,方程的解与方程的解互为相反数.
13.为改善生态环境,防止水土流失,某村拟定在荒坡地上种植960棵树,由于青年团员的支援,每日比原计划多种20课,结果提前4天完成任务,原计划每天种植多少棵树?设原计划每天种植x棵树,根据题意列方程为.
16.已知关于的方程无解,求a的值?
17.已知与的解相同,求m的值?
18.近年来,由于受*石油市场的影响,汽油价格不断上涨.下面是小明与爸爸的对话:
小明:“爸爸,听说今年5月份的汽油价格上涨了不少啊!”
爸爸:“是啊,今年5月份每升汽油的价格是去年5月份的倍,用元给汽车加的油量比去年少升.”
小明:“今年5月份每升汽油的价格是多少呢?”
聪明的你,根据上面的对话帮小明计算一下今年5月份每升汽油的价格?
19.武汉一桥维修工程中,拟由*、乙两各工程队共同完成某项目,从两个工程队的资料可以知道,若两个工程队合作24天恰好完成,若两个工程队合作18天后,*工程队再单独做10天,也恰好完成,请问:
⑴*、乙两工程队完成此项目各需多少天?
⑵又已知*工程队每天的施工费用是0.6万元,乙工程队每天的施工费用是0.35万元,要使该项目总的施工费用不超过22万元,则乙工程队至少施工多少天?
15.⑴解:方程变形为
(3)解:方程两边同时乘以想x(x2-1)得,5x-2=3x,x=1,经检验x=1是原方程的增根,故原方程无解.
17.解:,x=2,经检验x=2是原方程的解,由题意可知两个方程的解相同,所以把x=2代入第二个方程得,故m=10.
18.解:设去年5月份汽油的价格为x元/升,则今年5月份的价格为1.6x元/升,依题意可列方程为,解得x=3,经检验x=3是原方程的解也符合题意,所以1.6x=4.8,故今年5月份汽油的价格是4.8元/升.
19.解:⑴设*工程队单独完成该项目需要天,乙单独完成该项目需要天,依题意可列方程组为
解得,经检验是原方程组的解,也符合题意.
⑵设*、乙两工程队分别施工a天、b天,由于总施工费用不超过22万元,可得,解得,b取最小值为40.
故⑴*、乙两工程队单独完成此项目分别需40天、60天.⑵乙工程度至少要施工40天.