坏小仔

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

参考:http://zh.wikipedia.org/wiki/Peterson%E7%AE%97%E6%B3%95

注释:

 

  1.   P0每次执行完turn = 0后,若P1也希望进入临界区,P0在while循环时都会忙等,然后进程切换到P1。
    1. 若P1还没有执行到turn=0,则P1执行turn=0即表示P0先于P1请求进入临界区,所以P0先进入临界区,P1在while循环时忙等。
    2. 若P1已经执行过turn = 0,此时turn = 1说明P1先于P0请求进入临界区,所以P1先进入临界区,P0在while循环时忙等。

  结论:

  若两个进程都想要进入临界区即都已经执行过flag[0/1] = true,那么哪个进程后执行(turn = 1 或turn = 0)这条语句,就相当于告诉对方你先到(turn 等于那个进程ID号那个进程就可进入临界区),所以你先进入临界区;

  当先进入临界区的进程(假设为P0)离开临界区后,下次循环中若仍想进入临界区,则必然要等到第一次竞争中后来的那个进程(假设为P1)执行完才有可能再次进入临界区。因为当P0执行到while (flag[1] == true && turn == 1)时必然会忙等,即使切换到P1因为P1当前已经执行完了turn=0,所以turn == 1必然成立而且flag[1] == true。第二次竞争P1一定可以进入临界区,因为P0会把turn变为1

 

算法使用两个控制变量flagturn. 其中flag[n]的值为真,表示ID号为n的进程希望进入该临界区. 标量turn保存有权访问共享资源的进程的ID号.

//flag[] is boolean array; and turn is an integer
flag[0]   = false;
flag[1]   = false;
turn;
P0: flag[0] = true;
    turn = 1;
/*重要*/
while (flag[1] == true && turn == 1) { // busy wait } // critical section flag[0] = false; // end of critical section
P1: flag[1] = true;
    turn = 0;
   /*重要*/
while (flag[0] == true && turn == 0) { // busy wait } // critical section flag[1] = false; // end of critical section

该算法满足解决临界区问题的三个必须标准:互斥访问, 进入, 有限等待.

互斥访问

P0与P1显然不会同时在临界区: 如果进程P0在临界区内,那么或者flag[1]为假(意味着P1已经离开了它的临界区),或者turn为0(意味着P1只能在临界区外面等待,不能进入临界区).

进入

进入(Progress)定义为:如果没有进程处于临界区内且有进程希望进入临界区, 则只有那些不处于剩余区(remainder section)的进程可以决定哪个进程获得进入临界区的权限,且这个决定不能无限推迟。剩余区是指进程已经访问了临界区,并已经执行完成退出临界区的代码,即该进程当前的状态与临界区关系不大。

有限等待

有限等待(Bounded waiting)意味着一个进程在提出进入临界区请求后,只需要等待临界区被使用有上限的次数后,该进程就可以进入临界区。即进程不论其优先级多低,不应该饿死(starvation)在该临界区入口处。Peterson算法显然让进程等待不超过1次的临界区使用,即可获得权限进入临界区。

posted on 2013-04-01 19:26  坏小仔  阅读(497)  评论(0编辑  收藏  举报