1

想象一个场景:2 个核心在同一时间做什么 CaS。处理器需要读取一个旧值,然后放置一个新值,旧值相同。如果他们同时阅读呢?或者那里的变量上是否有任何类型的锁定,以防止其他内核读取?

4

1 回答 1

3

是的,在大多数架构上,每个内核都会尝试 Read-For-Ownership 流程,这意味着它专门为了更改它而请求该行。其中一个会获胜,将数据发送回请求核心并以某种方式使另一个请求阻塞或回收。确切的细节取决于设计,但一般情况下,您可以期望获胜的核心使用数据并以原子方式将其更改为新值(通过内部锁定,因此不会在过程中受到干扰),然后完成新数据的操作要么写回要么在内部缓存(处于修改状态)。

此时,另一个请求可能会继续并尝试获得该线路的所有权 - 如果该线路仍保留在第一个核心中,则将导致窥探读取修改后的数据。然后第二个核心可以重复与第一个核心相同的过程。

在更简单的系统上,可以通过在此过程中停止所有内存事务来实现相同的目的(“总线锁”,如 Egor 提到的),但现在这种情况非常罕见,因为性能很糟糕,所以它保留在非常复杂的情况下,比如当变量未对齐,数据在两行之间拆分。

请注意,关键部分(CaS)理想情况下应该在核心内部完成,本地缓存行锁定可以保持原子性(当他锁定该行时,没有其他人可以读取或获取该行的所有权),而其他核心可以在不损失一致性或原子性的情况下访问其他内存地址。

于 2014-03-19T22:20:58.910 回答