首页
社区
课程
招聘
[讨论]多处理器多线程使用_asm lock指令能保证互斥吗?
发表于: 2009-3-23 15:13 9911

[讨论]多处理器多线程使用_asm lock指令能保证互斥吗?

2009-3-23 15:13
9911
我网上下载了一个驱动,他使用了一个计数器,这个计数器用自旋锁实现互斥,注释里面写着“为支持 SMP 使用自旋锁”,而不是直接使用InterlockedIncrement和InterlockedDecrement,而后两者就是用_asm lock指令实现互斥的。

我在用户态下写了一个多线程测试程序测试Interlocked……,一个线程自加1亿次,另一个线程自减1亿次,在多核CPU上跑,结果都是正常的,难道是我的CPU人品比较好?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
没人知道么?
2009-3-23 20:58
0
雪    币: 1746
活跃值: (287)
能力值: (RANK:450 )
在线值:
发帖
回帖
粉丝
3
lock前缀只保证对当前指令要访问的内存互斥
2009-3-24 10:45
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
可以保证互斥。。
摘:
LOCK总线封锁信号,三态输出,低电平有效。LOCK有效时表示CPU不允许其它总线主控者占用总线。这个信号由软件设置,当前指令前加上LOCK前缀时,则在执行这条指令期间LOCK保持有效,阻止其它主控者使用总线。
2009-3-24 23:18
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
谢谢LS的解答,可以互斥那就没问题了。

不过我听说一种说法,就是多CPU非多核,每个CPU都有自己的一缓和二缓,lock指令执行的时候,会不会仅仅改变自己缓存里面的内容,最后写回的时候就出问题了?现在大多数多核CPU似乎都共享二缓,应该不会有问题。不过目前似乎也没条件测试一下
2009-3-25 09:38
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
能保证互斥是肯定的,但是这个1,2级缓存怎么实现同步的还真是个问题,以前都没想到过这方面的问题
2009-3-25 10:23
0
雪    币: 130
活跃值: (10)
能力值: ( 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
2009-3-25 11:02
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
LS厉害,解释得非常详细,现在我可以放心用这两个东西作计数增减了。

太感谢你了!!!
2009-3-25 16:21
0
雪    币: 204
活跃值: (10)
能力值: ( 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串型化 这个指令的执行, 执行了多少次就加多少次,而不受多处理器的影响

我的理解正确吗
2009-8-31 08:54
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
spin lock 也是用 lock 前缀的指令实现的,用于同步一组操作,
而单个DWORD 的同步可以用单个lock操作实现,没必要用代价更大的spin lock(至少有2个lock 操作:acquire,release)
2009-8-31 11:18
0
游客
登录 | 注册 方可回帖
返回
//