0

操作系统概念第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 从剩余部分退出,它不能立即进入关键部分,这个 alg 违反了规则。

问题2

如果 turn == 0 并且 P1 准备进入其临界区,P1 不能这样做,即使 P0 可能在其剩余部分

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

那么这个说法有错吗?

4

1 回答 1

2

假设turn = 0最初。P0 执行其临界区并设置turn = 1. 现在,P1必须在 P0 再次执行其临界区之前执行其临界区。但仅仅因为两个线程都有一个临界区并不意味着它们会以这种方式交替使用它——事实上,P1 可能永远不会轮到它。(在一般情况下,您无法在编译时确定这一点。)

所以基本上问题是线程被迫交替轮流,即使其中一个实际上不想无限期地进入其临界区。

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

于 2009-10-25T12:07:37.090 回答