当前位置: 技术问答>linux和unix
内存屏障与抢占
来源: 互联网 发布时间:2017-01-31
本文导语: 假设有两段程序 第一段 Y = 0; X = 2; Y = 3 第二段 if(X == 2){ temp = Y; } 在SMP情况下,假如两段代码同时在各自的cpu上运行。因为cpu的乱序执行的特性,第一段代码的三个赋值语句...
假设有两段程序
第一段
Y = 0;
X = 2;
Y = 3
第二段
if(X == 2){
temp = Y;
}
在SMP情况下,假如两段代码同时在各自的cpu上运行。因为cpu的乱序执行的特性,第一段代码的三个赋值语句顺序可能是不定的。那么第二段代码执行后temp的值可能是0,也可能是3。
所以在这种情况下,需要对第一段代码要加内存屏障
第一段
Y = 0;
X = 2;
smp_wmb();
Y = 3;
这样就可以确保第二段代码执行后temp的值是3。
但是我不明白的是,在单核情况下,smp_wmb()对cpu是没用的。如果发生这种情况,比如说,第一段代码乱序执行完后,这时
cpu切换到第二段代码运行。 岂不是第二段代码执行后temp的值可能是0,也可能是3,也是不确定的?????
不知道我把我想问的问题说明白没用,希望知道的人能指定一二,先谢过了。
第一段
Y = 0;
X = 2;
Y = 3
第二段
if(X == 2){
temp = Y;
}
在SMP情况下,假如两段代码同时在各自的cpu上运行。因为cpu的乱序执行的特性,第一段代码的三个赋值语句顺序可能是不定的。那么第二段代码执行后temp的值可能是0,也可能是3。
所以在这种情况下,需要对第一段代码要加内存屏障
第一段
Y = 0;
X = 2;
smp_wmb();
Y = 3;
这样就可以确保第二段代码执行后temp的值是3。
但是我不明白的是,在单核情况下,smp_wmb()对cpu是没用的。如果发生这种情况,比如说,第一段代码乱序执行完后,这时
cpu切换到第二段代码运行。 岂不是第二段代码执行后temp的值可能是0,也可能是3,也是不确定的?????
不知道我把我想问的问题说明白没用,希望知道的人能指定一二,先谢过了。
|
wmb( ) 就是用于单cpu的,
像书上所说的一样,现有的intel的cpu是不会对写内存指令进行重新排序的,其实wmb宏是什么也不用做。
所以你可以保证任何时候 y=0 都会在y=3的前面运行的。
你看一下intel的手册吧,我记得有一章是专门讲这个的。
像书上所说的一样,现有的intel的cpu是不会对写内存指令进行重新排序的,其实wmb宏是什么也不用做。
所以你可以保证任何时候 y=0 都会在y=3的前面运行的。
你看一下intel的手册吧,我记得有一章是专门讲这个的。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。