【问题标题】:How are multiple CPU Fetch Execute cycles synchronised?多个 CPU Fetch Execute 周期如何同步?
【发布时间】:2012-10-04 03:24:18
【问题描述】:

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

TSET(X)
if (x == 0) {
    x = 1;
    return true;
} else
    return false;

根据经典的操作系统教科书,它是线程同步所依赖的。信号量实现可能会使用它。因为它是不可分割的,所以即使在同一个 CPU 上发生不及时的线程切换时,它也可以用来保护临界区的入口。它在单个 CPU 上的使用(我)已经很好理解了。

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

【问题讨论】:

    标签: assembly concurrency operating-system hardware


    【解决方案1】:

    这条神奇的指令应该是原子的/不可分割的,IOW,在它与 0 比较的时间和设置为 1 的时间之间,没有什么可以改变 x

    这就是它的全部意义所在。如果你仔细阅读你的书,你会看到一些糟糕的竞争条件示例,其中类似的代码(读取/比较 + 修改)由于非原子性而惨遭失败(有这样的词吗?)。

    你自己想想吧。

    如果这条指令不是原子的,并且由于调度不当导致 2 个并发线程/进程按此顺序执行,会发生什么情况?:

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

    两个线程/进程都会认为他们已经获得了对该锁定变量x 保护访问的某些对象的独占访问权限。不好。

    【讨论】:

    猜你喜欢
    • 2017-01-31
    • 1970-01-01
    • 2020-11-28
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2016-11-12
    相关资源
    最近更新 更多