Operating system 具有2个过程的临界截面示例

Operating system 具有2个过程的临界截面示例,operating-system,synchronization,critical-section,Operating System,Synchronization,Critical Section,我想检查上述代码是否满足互斥、进度、死锁和有界等待 互斥:满足互斥。因为如果它们同时启动,它们将被困在“While”循环中。所以它们的顺序必须是,一个接一个 进度>强:按照我的理解进度,在检查临界截面的条件时,特定的过程应该考虑那些对临界截面感兴趣的过程,不应考虑其他流程。换句话说,如果有5个流程和2个流程不想再次获得临界截面,则在进入临界截面时,只应考虑其余3个流程(有兴趣)。现在,在退出之后,P0,从它的余数部分,如果P0不想再次执行。P1在进入临界区时不应考虑P0,但这里P1检查P0的标

我想检查上述代码是否满足互斥、进度、死锁和有界等待

互斥:满足互斥。因为如果它们同时启动,它们将被困在“While”循环中。所以它们的顺序必须是,一个接一个

<强>进度>强:按照我的理解进度,在检查临界截面的条件时,特定的过程应该考虑那些对临界截面感兴趣的过程,不应考虑其他流程。换句话说,如果有5个流程和2个流程不想再次获得临界截面,则在进入临界截面时,只应考虑其余3个流程(有兴趣)。现在,在退出之后,P0,从它的余数部分,如果P0不想再次执行。P1在进入临界区时不应考虑P0,但这里P1检查P0的标志进入临界区。所以违反了规则所以没有进展。(这是正确的想法吗?)

死锁:如果P0和P1在开始时同时执行,则两者都将卡在While循环中,因此死锁

有界等待


以上三种想法与答案不符。请纠正我

关键是按原样阅读代码,而不是按原意(由编写代码的人)阅读代码。以下是我的解释:

它们不会相互排斥。任何编译器都可能在首次读取访问之前的任何时候初始化变量。因此,在程序开始运行时,标志[0]和标志[1]可能都是1

此外,标志[0]或标志[1]的设置不需要是原子的——而且它肯定不能确保通知更改的进程不会超过刚刚将标志设置为0的进程如果剩余部分和关键部分不应同时运行,可能会出现争用情况。


我希望这是一种课堂作业——忙于等待循环通常是有害的,应该避免;有一些成熟的方案,比如信号量、可以等待()和被通知()的线程等等,所以这是一段“在一个比我们更糟糕的世界里”的代码。

@Marcus Muller:我对相互排斥也有同样的怀疑。但我没有注意,因为我想学习概念而不是答案。所以我试着去读人类写的东西:P(是的,它很难但是仍然尝试),你能认为它是互斥的,集中于剩下的3个想法吗?对不起,我不太理解“进步”一段。这个问题似乎离题了,因为它是关于计算理论的,而不是一个不起作用的实际程序。
 P0                                         P1
 ------                                    -------   
 do {                                      do {
      flag[0] = 1;                                flag[1] = 1;

      while(flag[1])                                while(flag[0])
      {                                               {

      }                                               }

      ( Critical Section )                           ( Critical Section )                          

      flag[0] = 0;                                   flag[1] = 0;

      ( Remainder Section)                           ( Remainder Section)

     }                                            }
        while(1);                                     while(1);