关键部分问题

时间:2010-06-16 16:29:08

标签: operating-system critical-section

proces P0:                             proces P1:
while (true)                           while (true)
{                                      {
  flag[0] = true;                          flag[1] = true;
  while (flag[1])                          while (flag[0])
  {                                        {
     flag[0] = false;                        flag[1] = false;
     flag[0] = true;                         flag[1] = true;
  }                                        }
 crit0();                                  crit1();
 flag[0] = false;                          flag[1] = false;
 rem0();                                   rem1();
}                                       }

有人可以给我一个带有上下文切换的场景,以证明上述代码是否符合进度和有限等待的要求。

任何人都可以给我一些提示,告诉我如何检测代码是否符合进度要求或有限等待(可能包括饥饿,死锁以及跟在你之后)

1 个答案:

答案 0 :(得分:2)

这两个过程同时发生。

这里的诀窍是,由于没有真正同步这两个程序的事情,行之间可能会发生。同样,它可能同时发生。

要了解这可能是一个问题,请考虑这种情况......

如果第一个标志[0] =真且第一个标志[1] =真在同一时间发生在P0 / P1上会发生什么?

进程1和进程2都会陷入while循环。他们将如何退出while循环?一个进程必须在其他进程将其标志[me]设置为true的同一时刻检查while(flag [other])。这是一个非常狭窄的时间跨度。它相当于一次又一次地滚动骰子,直到你达到一定数量才会继续。

这就是为什么我们需要更高级别的东西来处理我们的同步 - 真正的锁等。

编辑:哦,还有一件事。您可能想要检查读/写操作是否是线程安全的。如果系统在尝试读取它的同时尝试写入该位,会发生什么?

edit2:仅供参考 - http://msdn.microsoft.com/en-us/library/aa645755(v=VS.71).aspx