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

本文详细介绍了Lamport面包店算法的工作原理及其解决进程并发访问临界区的问题。通过模拟排队买面包的过程,解释了如何确保进程互斥进入临界区、有空让进及有限等待的原则。

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

### Lamport面包店算法的原理 Lamport面包店算法是一种分布式系统中的互斥算法,旨在解决多个进程在访问共享资源时的竞争问题。该算法通过引入逻辑时钟和编号机制来确保进程能够以正确的顺序访问共享资源[^1]。 具体来说,每个进程在进入临界区之前需要获取一个唯一的编号。这个编号是基于当前时间戳或递增计数器生成的。一旦进程获得编号,它会检查其他进程的状态以及它们的编号。只有当所有其他进程要么没有编号,要么编号比当前进程大时,当前进程才能进入临界区[^2]。 ### Lamport面包店算法的实现 以下是Lamport面包店算法的一个简单Python实现示例: ```python import threading class BakeryAlgorithm: def __init__(self, num_processes): self.num_processes = num_processes selftickets = [0] * num_processes self.turn = [0] * num_processes self.locks = [threading.Lock() for _ in range(num_processes)] def enter_critical_section(self, process_id): # Step 1: Choose a ticket number max_ticket = max(self.tickets) if self.tickets else 0 self.tickets[process_id] = max_ticket + 1 # Step 2: Wait until all processes with smaller tickets or equal tickets but lower IDs have finished for other in range(self.num_processes): while self.tickets[other] != 0 and (self.tickets[other], other) < (self.tickets[process_id], process_id): pass def leave_critical_section(self, process_id): # Step 3: Release the ticket self.tickets[process_id] = 0 # Example usage if __name__ == "__main__": bakery = BakeryAlgorithm(3) def worker(process_id): bakery.enter_critical_section(process_id) print(f"Process {process_id} is in critical section") bakery.leave_critical_section(process_id) threads = [threading.Thread(target=worker, args=(i,)) for i in range(3)] for t in threads: t.start() for t in threads: t.join() ``` 在这个实现中,`BakeryAlgorithm` 类管理了多个线程之间的互斥访问。每个线程在进入临界区前调用 `enter_critical_section` 方法,并在完成工作后调用 `leave_critical_section` 方法释放资源[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值