比较和交换 - 如果 2 个处理器同时执行锁定会怎样?

Posted

技术标签:

【中文标题】比较和交换 - 如果 2 个处理器同时执行锁定会怎样?【英文标题】:Compare and swap - What if 2 processors execute locking simultaneous? 【发布时间】:2016-08-13 07:39:44 【问题描述】:

我在https://en.wikipedia.org/wiki/Compare-and-swap 中读到了关于 CAS 的内容,但有些疑惑:

    即使单个锁定操作在单个指令中实现,但如果 2 个线程在 2 个不同的处理器上运行,则 2 个指令可能同时发生。这不是比赛条件吗?
    我在<Linux Kernel Development> 3rd第168页看到以下句子

因为一个进程一次只能在一个处理器上执行

我对此表示怀疑,不确定这是否意味着它的字面意思。如果进程有多个线程,它们不能同时在多个处理器上运行吗?

有人帮忙解释一下这些疑惑吗?谢谢。

【问题讨论】:

CAS 指令引用一个内存位置,并且对内存的访问是单线程的(即内存是单端口的)。因此只有一个核心(一个进程)会成功执行“同步”锁定操作。 @sawdust 谢谢,你能告诉更多关于access to memory is single threaded的信息吗?是硬件限制还是内核限制?我没有通过谷歌搜索找到更多信息。 这是硬件限制。例如在 x86 上有 LOCK 指令前缀,它可以断言总线锁定以确保对前缀指令的独占内存访问。 LOCK 可以与 cmpxchg 指令一起使用,例如,在 x86 上实现简单的自旋锁 【参考方案1】:

cpu 有一个内存缓存,通常每个所谓的缓存行大小为 64 字节。它会针对那个大小的块做一些事情。特别是,在执行 lock cmpxchg 或类似操作时,执行此操作的硬件线程将与其他线程协商对 64 字节内存部分的独占访问。这就是它起作用的原因。

一般来说,你想读这本书:https://www.kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html

第 21 页解释了这一特殊位。

关于 LKD 报价,没有提供上下文。可以安全地假设它们是指线程并且正在更新线程本地计数器。

【讨论】:

顺便说一句,这本书看起来很有趣。 如果 Paul McKenney 有一些关于并发的文章,你可以盲目地认为它是高质量的。试试他的 youtube 视频,可惜很少。

以上是关于比较和交换 - 如果 2 个处理器同时执行锁定会怎样?的主要内容,如果未能解决你的问题,请参考以下文章

比较和交换与测试和设置

CAS(比较并交换)

为啥原子操作需要独占缓存访问?

noexcept 交换和移动具有互斥锁的类

局域网内的共享文件夹 同时2个人打开word文档 提示被另一用户锁定 无法编辑

比较结果的原子交换值