Assembly 如何同步多个CPU取数执行周期?
TSET是一种不可分割的机器代码指令,它可以执行多种操作。将其逻辑考虑如下: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(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将使用缓存同步协议和内存屏障来确保这种情况。有关简要概述,请访问