第一个软件互斥算法并不是1981年发表的Peterson算法,而是1968年发表的Dekker算法。(1)查找资料,仿照课件中对Peterson算法的描述写出该算法,(2)解释这个算法为什么正确,并(3)说说Peterson算法为什么比它好。
时间: 2023-11-10 15:29:46 浏览: 45
Dekker算法是用软件的方法来解决2个进程间的同步互斥问题的
4星 · 用户满意度95%
好的,我来回答你的问题。
1)Dekker算法的伪代码如下:
```
#define false 0
#define true 1
int turn;
int interested[2];
void enter_region(int process) {
int other;
other = 1 - process;
interested[process] = true;
turn = process;
while (turn == process && interested[other] == true) {}
}
void leave_region(int process) {
interested[process] = false;
}
```
2)这个算法正确的原因在于它满足了互斥性、有限等待和死锁避免等条件。进程在进入临界区之前,会先设置自己的interested标志为true,并把turn赋值为自己的编号。如果此时另一个进程的interested标志也为true,并且turn也为对方进程编号,那么此时进程就需要等待对方离开临界区才能进入。当进程离开临界区时,会把自己的interested标志设为false,从而让另一个进程可以进入临界区。
3)相比于Dekker算法,Peterson算法的主要优点是它使用了硬件支持(比如Test-and-Set指令或者Load-Linked/Store-Conditional指令等),可以更高效地实现互斥访问。此外,Peterson算法也更容易推广到多个进程之间的情况中。但是,Dekker算法也有其优点,它不需要硬件支持,只需要使用一些基本的原子操作,因此在某些特定的环境下(比如一些嵌入式系统)可能更加适用。
阅读全文