关键部分算法的问题

时间:2009-10-25 08:02:25

标签: operating-system critical-section

操作系统概念第6版提出了一个实现政治部分的试验算法。

do{
  while (turn != i);
    critical section
  trun = j;
    remainder section
} while(1);

注意,Pi是带有标识符i的进程,Pj是带有标识符j的进程。为了简化问题,本书将i,j限制为0和1,这两个进程都是整合的环境。

问题1 是,这个算法的剂量消除了进度要求,这是解决方案的三个要求之一?

在我看来,当Pi在其余部分时,它不能参与关于Pj是否可以进入临界区的决定。然后它必然会受到要求的约束。

或者我对进度要求的理解是完全错误的。因为如果Pi从剩余部分退出,它无法立即进入cirtical部分,这个alg违反了规则。

问题2

  

如果转= = 0且P1已准备好进入   其关键部分,P1不能做到   所以,甚至认为P0可能在其中   剩余部分

这个陈述的含义是什么?据我所知,我无法理解为什么转= = 0和p0在其余部分可以同时存在...

这句话是错的吗?

1 个答案:

答案 0 :(得分:2)

最初假设turn = 0。 P0执行其关键部分并设置turn = 1。现在,P1 必须执行其关键部分,然后P0才能再次执行它。但仅仅因为两个线程都有一个关键部分并不意味着他们会想要以这种方式交替使用它 - 事实上,P1可能永远不会轮到它。 (在一般情况下,你can't determine this at compile time。)

所以基本上问题是线程被迫轮流,即使其中一个实际上不想无限期地进入其关键部分。

顺便说一下,你对问题1的回答是正确的。该算法不会使 Progress 条件失败,它会使 Bounded Waiting 条件失败。