实现进程互斥的软件的结构框架是:
Framework
Repeat
entry section
critical section
exit section
remainder section
Until false
进程互斥的软件实现算法有:Lamport面包店算法和Eisenberg算法。这两种算法均假定系统中进程的个数有限,如n个。
1)Lamport面包店算法
面包店算法的基本思想来源于顾客在面包店购买面包时的排队原理。顾客进入面包店前,首先抓取一个号码,然后按号码从小到大的次序依次进入面包店购买面包,这里假定:
(1)—面包店按由小到大的次序发放号码,且两个或两个以上的顾客有可能得到相同号码(要使顾客的号码不同,需互斥机制);
(2)—若多个顾客抓到相同号码,则按顾客名字的字典次序排序(假定顾客没有重名)。
计算机系统中,顾客相当于进程,每个进程有一个唯一的标识,用Pi表示,对于Pi和Pj,若有i<j,即Pi先进入临界区,则先为Pi服务。
面包店算法的基本思想:首先设置一个发号器,按由小到大的次序发放号码。进程进入临界区前先抓取一个号码,然后按号码从小到大的次序依次进入临界区。若多个进程抓到相同的号码则按进程编号依次进入。
实现面包店算法所需的数据结构:
int choosing[n]; //表示进程是否正在抓号,初值为0。若进程i正在抓号,则choosing[i]=1.
int number[n]; //记录进程抓到的号码,初值为0。若number[i]=0,则进程i没有抓号
伪代码如下:
// declaration & initial values of global variables
Choosing, Number: array [1..N] of integer = {0};
// logic used by each process...
// where "(a, b)<(c, d)"
// means "(a<c) or ((a == c) and (b<d))"
Process(i) { //注意:此处测试的是进程Pi
while (true) {
Choosing[i] = 1;
Number[i] = 1 + max(Number[1],...,Number[N]);
Choosing [i] = 0;
for (j=1; j<=N; ++j) {
while (Choosing[j] != 0) {//保证编号较小的进程先进入临界区
// wait until process j receives its number
}
while ((Number[j]!=0) && ((Number[j],j) <(Number[i],i))) { //进程Pj是其他线程
// wait until processes with smaller numbers
// or with the same number, but with higher
// priority, finish their work
}
}
// critical section...
Number[i] = 0;
// non-critical section...
}
}
当进程Pi计算完max(…)+1但尚未将值赋给number[i]时,进程Pj中途插入,计算max(…)+1,得到相同的值。在这种情况下,Choosing[j]保证编号较小的进程先进入临界区。
忙式等待:上述Lamport面包店算法中,若while循环的循环条件成立,则进程将重复测试,直到条件为假。实际上,当while循环条件成立时,进程Pi不能向前推进,而在原地踏步,这种原地踏步被称为忙式等待。忙式等待空耗CPU资源,因而是低效的。
2)Eisenberg算法采用的数据结构是:
enum states {IDLE, WAITING, ACTIVE} flags[n];
int turn; //范围是(0, n-1)
int index;//范围是(0, n-1)
其中,flags[i]=IDLE:进程Pi不想进入临界区;
flags[i]=WAITING:进程Pi想进入临界区;
flags[i]=ACTIVE:进程想进或已进临界区。
flags的所有元素初值都是IDLE;
turn的初值为0到n-1之间的任一正整数,它表示允许进入临界区的进程编号;
index为每个进程拥有的一个局部变量,其初值为0到n-1之间的任一正整数。
Eisenberg算法伪代码如下:
INITIALIZATION:
shared enum states {IDLE, WAITING, ACTIVE} flags[n];
shared int turn;
int index; /* not shared! */
...
turn = 0;
...
for (index=0; index<n; index++) { //初始化为IDLE
flags[index] = IDLE;
}
ENTRY PROTOCOL (for Process i ): //注意下面代码都是针对进程Pi
repeat {
/* announce that we need the resource */
flags = WAITING;
/* scan processes from the one with the turn up to ourselves. */
/* repeat if necessary until the scan finds all processes idle */
index = turn;
while (index != i) {
if (flag[index] != IDLE) index = turn;
else index = index+1 mod n;
}
/* now tentatively claim the resource */
flags = ACTIVE;
/* find the first active process besides ourselves, if any */
index = 0;
while ((index < n) && ((index == i) || (flags[index] != ACTIVE))) {
index = index+1;
}
/* if there were no other active processes, AND if we have the turn
or else whoever has it is idle, then proceed. Otherwise, repeat
the whole sequence. */
} until ((index >= n) && ((turn == i) || (flags[turn] == IDLE)));
/* claim the turn and proceed */
turn = i;
EXIT PROTOCOL (for Process i ):
/* find a process which is not IDLE */
/* (if there are no others, we will find ourselves) */
index = turn+1 mod n;
while (flags[index] = IDLE) {
index = index+1 mod n;
}
/* give the turn to someone that needs it, or keep it */
turn = index;
/* we're finished now */
flag = IDLE;
注意:Eisenberg算法同样存在忙式等待问题。
分享到:
相关推荐
93-教学课件-Lamport面包房算法(N进程)1
Distributed Snapshots: Determining Global States of Distributed Systems 分布式一致性算法论文(Chandy-Lamport算法)
操作系统的实验课设,实现Dekker,Lamport,Peterson,Eisenberg进程互斥访问临界区算法,使用java语言完成,可以动态显示进程访问临界区时各个进程的状态
Lamport 向量时钟算法的 C++ 实现 矢量时钟是一种算法,用于在分布式系统中生成事件的部分排序并检测因果关系违规。就像在 Lamport 时间戳中一样,进程间消息包含发送进程的逻辑时钟的状态。N个进程系统的向量时钟...
在Linux下,模拟实现四种软件互斥算法:Dekker,Peterson,Lamport,Eisenburg-Mcguire.
精品专题课件(2021-2022年收藏)
vs-钱包快照 Leslie Lamport和K.Mani Chandy的快照算法实现
Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人在微软研究院)1990年提出的一种基于消息传递的一致性算法。[1] 这个算法被认为是类似算法中最有效的。 背景介绍编辑 播报 Paxos 算法解决的...
每个进程都在唯一的地址和端口上侦听消息。 每个进程都知道其 Quorum 中所有其他进程的地址。 这些地址在程序中是硬编码的。 没有实施名称服务器来执行此操作。 在程序中实现了CS的概念。 没有使用同步原语来定义 ...
Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人在微软研究院)1990年提出的一种基于消息传递的一致性算法。[1] 这个算法被认为是类似算法中最有效的。 背景介绍编辑 播报 Paxos 算法解决的...
Paxos算法是分布式技术大师Lamport提出的,主要目的是通过这个算法,让参与分布式处理的每个参与者逐步达成一致意见。用好理解的方式来说,就是在一个选举过程中,让不同的选民最终做出一致的决定。 Lamport为了...
同步算法在分布式系统中的实现与应用用lamport算法解决停车场问题研究报告
lamport论文翻译,详细讲解了paxos。 作者在第 4 节中确实简短讨论了 Paxos 议会和分布式计算的关系。计算机科学家可能会想要首先阅读 这一节。甚至在这之前,他们或许想要阅读 Lampson[1996]对这个算法向计算机...
1是实现此顺序的一种方法,可用于为分布式互斥提供时间戳,该算法的工作原理如下:当一个进程要访问共享资源时,它会生成一条包含资源名称的消息。 ,它的进程号和当前(逻辑)时间,然后将消息发送到所有其他过程...
Distributed Computing EEL6935, Spring 2014 作业 4 题目:货币兑换价值的分布式控制 学生姓名:Divya Ramachandran此代码旨在说明 Lamport 的算法,以保持数据副本之间的一致性 - 由不同进程维护的卖出率、买入率...
Lamport的分布式锁 Lamport在提出的分布式互斥锁的基本实现 设置 安装ZeroMQ: ://zeromq.org/download/ 运行: make 运行测试 ./runtest.sh
此文不长,主要以提出算法和数学证明为主。在这里我主要记录算法的主要思想,具体证明过程请参考原文深入了解。 二. 分布式的时钟同步问题 在单台机器上,我们很容易的就可以对所有的进程、事务进行排序,...
分布式系统算法的实现实现时钟同步,一致性,分布式互斥,组长选举的算法时钟同步:在交易系统的4台服务器网络中实现矢量时间戳,其中交易,核对余额,存款或取款等每个过程都是一项工作,并根据网络中请求的到达...
MAP protocol和Chandy and Lamport’s protocol的java实现
第4章 互斥和选举算法 4.1 互斥 4.2 非基于令牌的解决方案 4.2.1 Lamport算法的简单扩展 4.2.2 Ricart和Agrawala的第一个算法 4.2.3 Maekawa的算法 4.3 基于令牌的解决方案 4.3.1 Ricart和Agrawala的第二个...