有人可以告诉我,彼得森的关键部分解决方案是怎么回事?

时间:2015-10-04 12:38:15

标签: multithreading operating-system semaphore critical-section

我试着寻找这个概念,但到处都是我得到的伪代码并没有提供好的解释。请帮助我理解这一点。

1 个答案:

答案 0 :(得分:1)

彼得森是过程同步的利他解决方案。我会保持简单并坚持只有2个进程(让他们称之为A和B)的情况。

在这种情况下会发生的情况是,当进程A想要进入临界区时,它会将自己的标志设置为true(这表示A想要进入临界区)但是尝试让B先进入通过将转弯设置为B.

然后,如果B将其标志设置为while ( flag[B] && turn == B);,则通过true将其置于保持状态。所以你看到当A想要进入关键部分时,它首先测试B是否也想进入,如果B想要进入,A就把它自己搁置。

这也可能发生在B方面。

所以,如果A和B都决定同时进入关键部分,那么最后设置转弯的人将会等待。这意味着如果B在最后设置turn = A,那么B将在其while循环中等待 - while ( flag[A] && turn == A);,A将完成处理临界区,然后取消设置flag[A],打破B&#39 ; s while循环然后B将进入临界区本身。

我想您现在可以使用下面的代码了解每个流程的同步步骤。以下是Process-i的代码:

while (true) {
    flag[i] = TRUE; // indicating that process-i wants to enter the critical section
    turn = j;
    // Following WHILE starts and ends in one line. It's called busy-waiting.
    while ( flag[j] && turn == j); 

        FINISH THE CRITICAL SECTION

    flag[i] = FALSE; // process-i indicating that it is done now

        FINISH THE REMAINDER SECTION
}