【问题标题】:Can Test and Set be implemented in software without hardware support?测试和设置可以在没有硬件支持的情况下在软件中实现吗?
【发布时间】:2014-09-26 20:14:09
【问题描述】:

这是用软件编写的测试和设置:

boolean TestAndSet(boolean *target) {
    boolean rv = *target;
    *target = TRUE;
    return rv;
}

do {
    while(TestAndSetLock(&lock))
        ; // do nothing
        // critical section
    lock = FALSE;
        // remainder section
} while(TRUE);

我们可以在不支持硬件级别测试和设置的 CPU 中使用该机制吗?如果是,如何保证原子性?

【问题讨论】:

  • 有编程的同步算法(不是测试和设置,但您仍然可以设置可靠的互锁),例如 Dekker 算法,它仅依赖于内存读取和写入的原子性。如果没有这样的读写原子性,很难看到如何编写任何类型的自旋循环等待另一个进程完成;您永远无法相信您正在检查的处理器完整标志是可靠的。
  • 关于 Dekker 算法:您需要了解可能破坏算法的硬件机制。例如。 IBM-370 上的读写顺序。

标签: c operating-system synchronization mutual-exclusion


【解决方案1】:

如果没有硬件支持,您建议的方式无法在软件中实现测试和设置。

因为上面的TestAndSet应该是用来保证互斥的机制,但它不是原子的。然而,原子性只是互斥的另一个名称:必须通过确保两个进程不能同时执行其代码来保护TestAndSet 的内部变量。

因此,您通过这种方式定义了一种确保互斥的方法,该方法本身需要某种机制来确保互斥。这个技巧可以玩很多次,但如果没有某种硬件支持,就不会有任何真正的进展。

【讨论】:

    【解决方案2】:

    您可以在没有 TAS/CAS 的机器上使用 Lamport 的“烘焙”互斥算法来控制对“原子”(受保护)值的访问。

    http://www.disi.unige.it/person/DelzannoG/SO1/AA0607/bakery.htm

    只有在没有合理限制的“N”个进程时才会变得复杂。

    【讨论】:

      猜你喜欢
      • 2015-08-18
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多