设置标志数组flag[]表示进程是否在临界区中执行,初值均为false。在每个进程访问该临界资源之前,先检查另一个进程是否在临界区中,若不在则修改本进程的临界区标志为true并进入临界区,在退出区修改本进程临界区标志为false。请写出两进程的程序结构。该算法存在什么问题。
时间: 2023-09-21 13:06:17 浏览: 234
### 回答1:
以下是两进程的程序结构:
进程1:
```
do {
while (flag[1]); // 等待进程2退出临界区
flag[0] = true; // 进入临界区前设置标志
// 进入临界区
flag[0] = false; // 退出临界区后清除标志
// 进程1继续执行
} while (true);
```
进程2:
```
do {
while (flag[0]); // 等待进程1退出临界区
flag[1] = true; // 进入临界区前设置标志
// 进入临界区
flag[1] = false; // 退出临界区后清除标志
// 进程2继续执行
} while (true);
```
该算法存在一个问题,即可能会发生死锁。如果进程1和进程2同时执行到第1行,它们都会等待对方退出临界区,导致两个进程都陷入等待状态,无法继续执行。因此,需要使用其他的同步方法来避免死锁的发生,如 Peterson算法或者 Dekker算法等。
### 回答2:
两进程的程序结构如下:
进程A:
do {
while (flag[B] == true);
flag[A] = true;
// 进入临界区
// 访问临界资源
// 退出临界区
flag[A] = false;
} while (true);
进程B:
do {
while (flag[A] == true);
flag[B] = true;
// 进入临界区
// 访问临界资源
// 退出临界区
flag[B] = false;
} while (true);
该算法存在以下问题:
1. 死锁问题:若进程A和进程B同时执行到while循环里的判断语句,且两个进程的flag值同时为false,那么它们都会进入临界区,造成死锁;
2. 饥饿问题:若进程A一直在while循环里等待进程B退出临界区,而进程B一直持续访问临界资源,那么进程A将一直无法进入临界区,导致饥饿;
3. 不公平问题:若进程A和进程B同时在临界区外等待,而进程A先检测到进程B不在临界区,那么进程A会先进入临界区,而进程B则需要等待进程A退出临界区后才能进入,导致进程B不公平。
### 回答3:
两个进程的程序结构如下:
进程1:
```c
while (true) {
while (flag[1]) ; // 检查进程2是否在临界区中执行
flag[0] = true; // 将当前进程的临界区标志设置为true
// 进入临界区执行操作
...
// 退出临界区前修改临界区标志为false
flag[0] = false;
// 执行剩余操作
...
}
```
进程2:
```c
while (true) {
while (flag[0]) ; // 检查进程1是否在临界区中执行
flag[1] = true; // 将当前进程的临界区标志设置为true
// 进入临界区执行操作
...
// 退出临界区前修改临界区标志为false
flag[1] = false;
// 执行剩余操作
...
}
```
该算法存在的问题是进程间的竞争条件。当两个进程同时进入循环时,可能会出现进程1正在判断进程2是否在临界区中执行的语句时,进程2已经没有在临界区中执行的情况,此时进程1会将自己的临界区标志设置为true并进入临界区,但实际上进程2并没有进入临界区,从而导致进程1可能会与进程2同时执行临界区操作,破坏了临界区互斥的要求。
阅读全文