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
Assembly 如何同步多个CPU取数执行周期?_Assembly_Concurrency_Operating System_Hardware - Fatal编程技术网

Assembly 如何同步多个CPU取数执行周期?

Assembly 如何同步多个CPU取数执行周期?,assembly,concurrency,operating-system,hardware,Assembly,Concurrency,Operating System,Hardware,TSET是一种不可分割的机器代码指令,它可以执行多种操作。将其逻辑考虑如下: TSET(X) if (x == 0) { x = 1; return true; } else return false; 根据经典操作系统教科书,线程同步依赖于它。信号量实现可能会使用它。因为它是不可分割的,所以即使在同一CPU上发生线程切换不及时的情况下,它也可以用来保护关键部分的入口。它在单个CPU上的使用(我)已经很清楚了 这里是我硬件知识不足的地方:如果不同CPU上的两个相互竞争的

TSET是一种不可分割的机器代码指令,它可以执行多种操作。将其逻辑考虑如下:

TSET(X)
if (x == 0) {
    x = 1;
    return true;
} else
    return false;
根据经典操作系统教科书,线程同步依赖于它。信号量实现可能会使用它。因为它是不可分割的,所以即使在同一CPU上发生线程切换不及时的情况下,它也可以用来保护关键部分的入口。它在单个CPU上的使用(我)已经很清楚了


这里是我硬件知识不足的地方:如果不同CPU上的两个相互竞争的线程“同时”发出相同的TSET(x),该怎么办。这让我想知道,每个CPU的获取执行周期是否(以及如何)同步。是CPU1上的指令在CPU2上的指令之后发生,然后又是CPU1吗?是这样做的吗?我说得通吗?我回答我自己的问题了吗?

这个神奇的指令应该是原子的/不可分割的,在它与0比较的时间和它设置为1的时间之间,没有任何东西能够改变
x

这就是问题的关键所在。如果你仔细阅读你的书,你会看到一些糟糕的竞争条件的例子,类似的代码(读/比较+修改)由于不原子性而惨遭失败(有这样一个词吗?)

你自己想想

如果此指令不是原子指令,并且由于调度错误而按此顺序执行2个并发线程/进程,会发生什么情况

1: if (x==0)
2: if (x==0)
1: x=1, return true
2: x=1, return true

两个线程/进程都会认为它们已经获得了对某个对象的独占访问权,而这个锁变量
x
正在保护对该对象的访问权。不太好。

稍微扩展一下前面的答案:CPU:s将使用缓存同步协议和内存屏障来确保这种情况。有关简要概述,请访问