修改彼得森的2过程算法

时间:2017-11-13 18:37:33

标签: algorithm

是否有可能更改Peterson的2进程算法,以便其无争用复杂性(当进程独立运行时其复杂性)将只有三次访问? 在原始版本中,它有4次访问。

彼得森的算法:

initialization:
bool flag[0] = {false};
bool flag[1] = {false};
int turn;

P0: 
flag[0] = true;
P0_gate: turn = 1;
         while (flag[1] == true && turn == 1)
         {
             // busy wait
         }
         // critical section
         ...
         // end of critical section
         flag[0] = false;

P1:    
flag[1] = true;
P1_gate: turn = 0;
         while (flag[0] == true && turn == 0)
         {
             // busy wait
         }
         // critical section
         ...
         // end of critical section
         flag[1] = false;

1 个答案:

答案 0 :(得分:0)

我不知道您该怎么做-无法消除flag[i]的升高和降低,因为那是您“对关键部分至关重要的关键部分”,因此您可以只玩测试。

如果您取消了flag[j]测试,则将在无争用的情况下使自己陷入僵局,并且如果您取消了turn测试(和turn寄存器,因为它现在也没有用了)您将在竞争中陷入僵局。

如果您对flag[j]的读取和turn的写入进行重新排序,那么在无争用的情况下,您可能会获得三种访问权限,但是在争用下,如果{{1} }在测试了他们的标志后退​​出了他们的关键部分,或者至少等到j返回要求关键部分为止,这将为您提供完全序列化的处理:锁定和未锁定的代码都将被序列化。

QED

(对不起,但这听起来确实像是CS课程的问题)。

BTW:原始算法假定您可以并行读取jflag[j]以提高性能(假设原子访问很慢,但可以跨寄存器并行化),但是您不能利用它布尔布尔评估的结果,因此在两种情况下您实际上都有5个访问权限。