能力值:
( LV3,RANK:20 )
2 楼
没人知道么?
能力值:
(RANK:450 )
3 楼
lock前缀只保证对当前指令要访问的内存互斥
能力值:
( LV2,RANK:10 )
4 楼
可以保证互斥。。
摘:
LOCK总线封锁信号,三态输出,低电平有效。LOCK有效时表示CPU不允许其它总线主控者占用总线。这个信号由软件设置,当前指令前加上LOCK前缀时,则在执行这条指令期间LOCK保持有效,阻止其它主控者使用总线。
能力值:
( LV3,RANK:20 )
5 楼
谢谢LS的解答,可以互斥那就没问题了。
不过我听说一种说法,就是多CPU非多核,每个CPU都有自己的一缓和二缓,lock指令执行的时候,会不会仅仅改变自己缓存里面的内容,最后写回的时候就出问题了?现在大多数多核CPU似乎都共享二缓,应该不会有问题。不过目前似乎也没条件测试一下
能力值:
( LV2,RANK:10 )
6 楼
能保证互斥是肯定的,但是这个1,2级缓存怎么实现同步的还真是个问题,以前都没想到过这方面的问题
能力值:
( LV2,RANK:10 )
7 楼
摘
从 P6 处理器开始,如果指令访问的内存区域已经存在于处理器的内部缓存中,则“lock” 前缀并不将引线 LOCK 的电位拉低,而是锁住本处理器的内部缓存,然后依靠缓存一致性协议保证操作的原子性。
4.2) IA32 CPU调用有lock前缀的指令,或者如xchg这样的指令,会导致其它的CPU也触发一定的动作来同步自己的Cache。
CPU的#lock引脚链接到北桥芯片(North Bridge)的#lock引脚,当带lock前缀的执行执行时,北桥芯片会拉起#lock
电平,从而锁住总线,直到该指令执行完毕再放开。 而总线加锁会自动invalidate所有CPU对 _该指令涉及的内存_
的Cache,因此barrier就能保证所有CPU的Cache一致性。
4.3) 接着解释。
lock前缀(或cpuid、xchg等指令)使得本CPU的Cache写入了内存,该写入动作也会引起别的CPU invalidate其Cache。
IA32在每个CPU内部实现了Snoopying(BUS-Watching)技术,监视着总线上是否发生了写内存操作(由某个CPU或DMA控
制器发出的),只要发生了,就invalidate相关的Cache line。 因此,只要lock前缀导致本CPU写内存,就必将导致
所有CPU去invalidate其相关的Cache line。 http://www.unixresources.net/linux/clf/linuxK/archive/00/00/65/37/653778.html
http://www.bitscn.com/linux/kernel/200806/144491_2.html
能力值:
( LV3,RANK:20 )
8 楼
LS厉害,解释得非常详细,现在我可以放心用这两个东西作计数增减了。
太感谢你了!!!
能力值:
( LV2,RANK:10 )
9 楼
cpu A 在执行 add [xxx], eax 中
cpu B 也执行 add [xxx], eax
是不是由于 可能在读取 [xxx]他们可能读取到的是同一个数值, 因此在cpu A 存的是 +1的结果,
cpu B也是 +1的结果,
而事实上add [xxx], eax 被执行了两次应该是+2的结果 为了不出现这中情况, lock前缀能让cpu A cpu B串型化 这个指令的执行, 执行了多少次就加多少次,而不受多处理器的影响
我的理解正确吗
能力值:
( LV2,RANK:10 )
10 楼
spin lock 也是用 lock 前缀的指令实现的,用于同步一组操作,
而单个DWORD 的同步可以用单个lock操作实现,没必要用代价更大的spin lock(至少有2个lock 操作:acquire,release)