面包店算法理解

本文介绍了一种基于取号机制的进程同步算法,通过boolean数组choosing和int数组number实现进程间的互斥访问临界资源。详细解释了算法流程,并确保满足有空即进、互斥及有限等待的原则。

boolean  choosing[n];表示进程是否在取号

int  number[n];记录每个进程取到的号码

这些数据结构分别初始化为false和0,为了方便,定义如下符号:

若a<c或a==c和b<d同时成立,(a,b)<(c,d)

do
{
             
  choosing[i] = true;
  number[i] = max{number[0],number[1],…,number[n-1]}+1;//选号码
  choosing[i] = false;
  for(j = 0; j<n; j++)
    {
    while (choosing[j]);
    while ((number[j] != 0) && (number[j],j)<(number[i],i));
  };

  //临界区
  number[i] = 0;
  //其余部分
}while(1);
理解:

第一个试图进入临界区的进程Pi在没有其它进程竞争时顺利进入其临界区。满足了有空就进的要求。

 

当有竞争者Pk(i<k),且选的号码相同时,比较进程的名称,通过语句while ((number[j] != 0) && (number[j],j)<(number[i],i));来选择进入的进程。

在Pi进程中j==i时,number[j]==number[i],且j==i所以(number[j],j)<(number[i],i)不成立,退出while语句。j==k时,number[k]==number[i],且k>i所以(number[j],j)<(number[i],i))不成立,退出while语句。对与其它非i和k的j值,number[j]!=0不成立,退出while语句。

在pk进程中j==i时,number[j]<number[k],且j<k,所以(number[j],j)<(number[i],i))成立,故进程Pk陷在该语句中,直到Pi退出临界区执行语句number[i]==0时才允许Pk进程进入其临界区。所以满足了互斥和有限等待的要求。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值