第一个软件互斥算法并不是1981年发表的Peterson算法,而是1968年发表的Dekker算法。(1)查找资料,仿照对Peterson算法的描述写出该算法,(2)解释这个算法为什么正确,并(3)说说Peterson算法为什么比它好。
时间: 2023-07-10 13:29:39 浏览: 91
(1)Dekker算法的伪代码如下:
```
flag[2] = {false, false}
turn = 0 // 0 表示 P0,1 表示 P1
P0:
flag[0] = true
while flag[1] do
if turn == 1 then
flag[0] = false
while turn == 1 do end
flag[0] = true
end
critical section
turn = 1
flag[0] = false
P1:
flag[1] = true
while flag[0] do
if turn == 0 then
flag[1] = false
while turn == 0 do end
flag[1] = true
end
critical section
turn = 0
flag[1] = false
```
(2)Dekker算法正确的原因在于,它使用了两个标志来表示两个进程的意愿,而且当两个进程都想访问共享资源时,只有一个进程会进入忙等待状态。当一个进程想要访问共享资源时,它首先会设置自己的意愿标志,然后检查对方的意愿标志是否已经设置。如果对方的意愿标志已经设置,则进入忙等待状态,直到对方释放了共享资源并清除了它的意愿标志。当一个进程释放共享资源时,它会清除自己的意愿标志,这样另一个进程就可以获得共享资源并设置自己的意愿标志。
(3)相比之下,Peterson算法的优点在于它使用了更少的代码,而且不需要使用硬件原子操作或者其他特殊的指令。Peterson算法只需要使用两个标志和一个变量就可以实现互斥。此外,Peterson算法不会出现死锁和饥饿问题,因为它保证了在两个进程都想访问共享资源时,只有一个进程会进入忙等待状态。
阅读全文