N个进程的临界区问题(面包房算法)

上面PPT来自浙江大学李善平老师的操作系统课程。

产生的number[i]会重复是因为cpu调度引起的(number[i]的赋值操作不是原子操作)。

choosing[]数组的意义在于防止i进程的number[i]数值不稳定,出现错误。如果没有choosing[]数组的话,反例如下,比如只考虑进程i和j:

假设进程i<j,当i进程的number[i]赋值时,由于cpu的调度,停在了赋值操作,即此时访问number[i]为0,但给number[i]赋值的寄存器中的数为1,赋值完成后number[i]=1.由于cpu的调度,时间片给了进程j,j完成了number[j]的赋值操作,判断number[i]!=0为false,跳过while循环等待,进入临界区;此时cpu调度给进程i,i完成number[i]的赋值操作,此时number[i]的值为1,但判断while中的后半部分时,由于number[i]==number[j],i<j,导致i进程也跳过while循环的等待,进入临界区,这样算法不满足互斥条件。

分析上面过程,错误主要是由于cpu调度导致number[i]的值不稳定,并且cpu先调度给了进程号比较大的进程j去执行while等待引起的。当加入choosing[]数组后,仍然是上面的情况,当j进程进入while判断时,由于number[i]还没有赋值完成,导致choosing[i]为true,所以j进程在while(choosing[i])中等待,直到i进程赋值完毕,number[i]=1;j进程在进入后面的while判断,此时number[i]!=0为true,(number[i],i)<(number[j],j)也为true。导致j进程无法进入临界区,而i进程可以进入临界区。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答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同时执行临界区操作,破坏了临界区互斥的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值