+ -
当前位置:首页 → 问答吧 → preempt_disable的问题

preempt_disable的问题

时间:2010-12-09

来源:互联网

各位,我对preempt_disable加barrier()的方式不理解,preempt_disable需要控制指令的执行顺序,这个容易理解。比如
preempt_disable();
a++;
preempt_enable();
如果不控制的话,a++可能在抢占被禁用之前就执行,使preempt_disable失去意义。但是内核的实现怎么只用一个barrier(),这个只能控制编译器不乱序吧,如果cpu乱序执行怎么办? 望大侠指点。

附上preempt_disable的代码:
30 #define preempt_disable() \
31 do { \
32     inc_preempt_count(); \
33     barrier(); \
34 } while (0)

作者: biger410   发布时间: 2010-12-09



QUOTE:
这个只能控制编译器不乱序吧,如果cpu乱序执行怎么办?

回复 biger410


    你说的cpu乱序执行是什么意思?barrier应该就可以保证之前和之后的在时间序上是有先后的吧。cpu体系结构上不懂,但是就算是pipeline乱序发射,也是在微指令层面上,EIP取指令的时候会遇到这个barrier的内存栅吧。

作者: kgn28   发布时间: 2010-12-10

barrier的作用保证写入内存的操作结束之前不会执行下面的代码。inc_preempt_count();会修改内存

作者: liying_gg   发布时间: 2010-12-10

barrier() 保证的是 cpu 不乱序执行。而不是编译器吧。

作者: linyunxian   发布时间: 2010-12-10