第一个软件互斥算法并不是1981年发表的Peterson算法,而是1968年发表的Dekker算法。(1)查找资料,仿照课件中对Peterson算法的描述写出该算法,(2)解释这个算法为什么正确,并(3)说说Peterson算法为什么比它好。
时间: 2023-07-10 07:37:42 浏览: 87
好的,以下是您的回答:
1. Dekker算法的伪代码如下:
```
int turn; // 全局变量,表示轮到哪个进程执行
bool flag[2]; // 分别表示两个进程是否在等待进入临界区
// 进程0
flag[0] = true;
while (flag[1]) {
if (turn == 1) {
flag[0] = false;
while (turn == 1); // 自旋等待
flag[0] = true;
}
}
// 进入临界区
// ...
turn = 1;
flag[0] = false;
// 进程1
flag[1] = true;
while (flag[0]) {
if (turn == 0) {
flag[1] = false;
while (turn == 0); // 自旋等待
flag[1] = true;
}
}
// 进入临界区
// ...
turn = 0;
flag[1] = false;
```
2. 这个算法正确的原因在于:
- 如果两个进程都不在等待进入临界区,它们都可以直接进入(不需要竞争)。
- 如果两个进程都想进入临界区,那么只有一个进程能够获取到 `flag` 数组中对应的位置的锁,进入临界区。
- 如果两个进程一个想进入,一个不想进入,那么不想进入的进程会通过 while 循环自旋等待,直到轮到它进入为止。
3. Peterson算法相比Dekker算法的优点在于:
- Peterson算法只需要两个变量,而Dekker算法需要三个变量;
- Peterson算法的自旋等待次数比Dekker算法少,因为Dekker算法中一个进程需要等待两个条件:另一个进程不在等待临界区且轮到自己执行。
但是,Dekker算法也有一些优点,例如它不需要硬件支持,而Peterson算法需要硬件支持才能保证正确性。此外,还有其他一些算法(如TSL算法、MCS算法等)也可以实现互斥锁。
阅读全文