面包店算法带有代码的详细讲解

现实中当我们有多个进程同时申请进入临界区时,我们需要保证临界区仍遵循1.互斥进入;2.有空让进;3.有限等待;

这也就是Lamport面包店算法解决的问题。下面是对Lamport面包店算法的细节讲解

这里补充几点:

1.( a , b ) < ( c , d ) 成立等价于 (a < c ) || ( a == c && b < d ) 成立,放在本题也就是序号越小的越先执行,如果序号一样,PID越小的越先执行。

2.choosing是一个数组,i表示进程,含义是进程是否在选取排队号码
    number也是各一个数组,i表示进程,含义是进程的排队号码

do{
//进程i正要选取进入临界区的排队号码
    choosing[i]=true;

//进程i正在选取序号,进入排队序列中
    number[i]=max(number[0],number[1]...number[n-1])+1;

//进程i选取序号完毕
    choosing[i]=false;

//这个for循环有尽头,也是有空让进的一种粗浅体现
    for(j=0;j<n;j++){

//判断此时这个进程是否在选取信号
        while(choosing[j]);

/*判断进程j是否在队列中,这个条件等价于只有当j进程在排队且j进程的
优先级高于i进程,i进程自旋等待,等待j进程申请完临界区后退出临界区。*/
        while((number[j]!=0)&&(number[j],j)<(number[i],i));

    }
    ...//临界区代码

//进程i执行完毕退出临界区了,再申请,就重新排队
    number[i]=0;

}while(true);

整个情况就类似于你排队去面包房买面包,首先排队,当轮到你了,买面包(也就是执行代码),买完后。如果想要再买就重新排队。

总体来说如果不考虑硬件层面对临界区的实现,Lamport面包店算法已经可以了。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值