peterson算法p0流程图,难道Peterson算法满足饥饿?

I've been searching information on Peterson's algorithm but have come across references stating it does not satisfy starvation but only deadlock. Is this true? and if so can someone elaborate on why it does not?

Peterson's algorithm:

flag[0] = 0;

flag[1] = 0;

turn;

P0: flag[0] = 1;

turn = 1;

while (flag[1] == 1 && turn == 1)

{

// busy wait

}

// critical section

...

// end of critical section

flag[0] = 0;

P1: flag[1] = 1;

turn = 0;

while (flag[0] == 1 && turn == 0)

{

// busy wait

}

// critical section

...

// end of critical section

flag[1] = 0;

The algorithm uses two variables, flag and turn. A flag value of 1 indicates that the process wants to enter the critical section. The variable turn holds the ID of the process whose turn it is. Entrance to the critical section is granted for process P0 if P1 does not want to enter its critical section or if P1 has given priority to P0 by setting turn to 0.

解决方案

As Ben Jackson suspects, the problem is with a generalized algorithm. The standard 2-process Peterson's algorithm satisfies the no-starvation property.

Apparently, Peterson's original paper actually had an algorithm for N processors. Here is a sketch that I just wrote up, in a C++-like language, that is supposedly this algorithm:

// Shared resources

int pos[N], step[N];

// Individual process code

void process(int i) {

int j;

for( j = 0; j < N-1; j++ ) {

pos[i] = j;

step[j] = i;

while( step[j] == i and some_pos_is_big(i, j) )

; // busy wait

}

// insert critical section here!

pos[i] = 0;

}

bool some_pos_is_big(int i, int j) {

int k;

for( k = 0; k < N-1; k++ )

if( k != i and pos[k] >= j )

return true;

}

return false;

}

Here's a deadlock scenario with N = 3:

Process 0 starts first, sets pos[0] = 0 and step[0] = 0 and then waits.

Process 2 starts next, sets pos[2] = 0 and step[0] = 2 and then waits.

Process 1 starts last, sets pos[1] = 0 and step[0] = 1 and then waits.

Process 2 is the first to notice the change in step[0] and so sets j = 1, pos[2] = 1, and step[1] = 2.

Processes 0 and 1 are blocked because pos[2] is big.

Process 2 is not blocked, so it sets j = 2. It this escapes the for loop and enters the critical section. After completion, it sets pos[2] = 0 but immediately starts competing for the critical section again, thus setting step[0] = 2 and waiting.

Process 1 is the first to notice the change in step[0] and proceeds as process 2 before.

...

Process 1 and 2 take turns out-competing process 0.

References. All details obtained from the paper "Some myths about famous mutual exclusion algorithms" by Alagarsamy. Apparently Block and Woo proposed a modified algorithm in "A more efficient generalization of Peterson's mutual exclusion algorithm" that does satisfy no-starvation, which Alagarsamy later improved in "A mutual exclusion algorithm with optimally bounded bypasses" (by obtaining the optimal starvation bound N-1).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值