现实中当我们有多个进程同时申请进入临界区时,我们需要保证临界区仍遵循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面包店算法已经可以了。