Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CPMXCG(比较和交换)在多处理器机器上究竟是如何工作的?_Java_Assembly_Lockless - Fatal编程技术网

Java CPMXCG(比较和交换)在多处理器机器上究竟是如何工作的?

Java CPMXCG(比较和交换)在多处理器机器上究竟是如何工作的?,java,assembly,lockless,Java,Assembly,Lockless,想象一个场景: 2个核心在同一时间做什么。处理器需要读取一个旧值,然后放置一个新值,旧值相同。如果他们同时阅读呢?或者是否有任何类型的锁放在变量上,阻止其他内核读取?是的,在大多数体系结构上,每个内核都会尝试读取所有权流,这意味着它专门请求行以更改它。其中一个会赢,将数据发送回请求核心,并使另一个请求以某种方式阻塞或循环。具体细节取决于设计,但通常情况下,您可以期望获胜的core使用数据并将其原子化地更改为新值(通过内部锁定,因此它不会在过程中受到干扰),然后使用写回或内部缓存的新数据(处于修改

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

是的,在大多数体系结构上,每个内核都会尝试读取所有权流,这意味着它专门请求行以更改它。其中一个会赢,将数据发送回请求核心,并使另一个请求以某种方式阻塞或循环。具体细节取决于设计,但通常情况下,您可以期望获胜的core使用数据并将其原子化地更改为新值(通过内部锁定,因此它不会在过程中受到干扰),然后使用写回或内部缓存的新数据(处于修改状态)完成操作

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

在更简单的系统上,通过在这个过程中停止所有内存事务(如Egor所提到的“总线锁”)也可以实现同样的效果,但现在这种情况非常罕见,因为性能非常糟糕,所以在非常复杂的情况下,如变量未对齐和数据在两行之间拆分时,这种情况会保持不变


请注意,关键部分(CaS)理想情况下应该在内核内部完成,本地缓存线锁可以保持原子性(在锁定该缓存线时,其他任何人都不能读取或拥有该缓存线),而其他内核可以访问其他内存地址,而不会丢失一致性或原子性。

在操作期间,总线被一个CPU锁定。@EgorSkriptunoff,在任何操作读写操作、任何写操作或任何cas操作期间,内存总线是否被锁定?它在
锁定cmpxchg r/m期间被锁定,x86上的r
指令。实际上,在任何带有
lock
前缀的命令期间。您还可以执行原子的
添加
。@EgorSkriptunoff,总线锁比常规的x86锁操作更具全局性(并且慢几个数量级)