【问题标题】:Test-and-Set in Mutex SolutionMutex 解决方案中的测试和设置
【发布时间】:2013-04-11 14:02:53
【问题描述】:

我正在尝试检查这个互斥体解决方案的正确性,并且需要检查互斥、活性和公平性是否都满足。 L1 和 L2 是任意代码行。有 2 个进程同时运行。下面是进程i的代码,j的代码是对称的。

bool waiting[i] = false;
bool waiting[j] = false;
bool busy = false;

cobegin(process i)

L1: Si(1)
L2: Si(2)
    waiting[i] = true;
L3: while (waiting[i] and TST(busy));
L4: [ Critical Section ]
L5: waiting[i] = false;
L6: busy = false;
L7: while(waiting[j];
L8: Go to L2

我知道所有三个属性都满意,但我只需要确保我没有遗漏任何东西。你能找到不满意的房产吗?

【问题讨论】:

  • 这看起来类似于Peterson's algorithm。你实际上可能simulate things like this
  • 这很聪明,谢谢!
  • 乍一看,即使我认为它与彼得森的算法很接近,但后来注意到它只是一个基于硬件的解决方案,仅依赖于 test_and_set。

标签: concurrency operating-system mutual-exclusion


【解决方案1】:

在第 L3 行,waiting[i] 将始终为 true,因为您刚刚在上一行将其更改为 true。我认为TST 是不可分割的test_and_set 指令的硬件实现。在这种情况下,您可以使用while ( TST ( busy ) ); 并且解决方案是正确的。 waiting 标志似乎没有任何用途。

【讨论】:

  • 您对 TST 的假设是正确的。看来我们的结果是一致的,那么死锁、活锁或违反互斥锁和公平性是不可能的。
  • 你的结论是正确的。我唯一要改变的是摆脱等待简化代码。
  • 其实等待的flags似乎保证了公平性。没有它们,其中一个 ps 可能会继续循环,而另一个 ps 在错误的时间测试锁,当它是真的时。
  • 我看不出等待标志如何确保公平。正如代码所示,等待 i 变为真,检查其他等待在退出部分。你需要有一种使用一些逻辑计数器的切换机制,以防你想确保有界等待条件的满足。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多