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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值