1.算法目的
2. 什么是死锁
3. 算法思想
4. 代码示例
目的:避免死锁:
什么是死锁:
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
如:买东西,卖方要求先付钱再发货,买方要求先发货再付钱。构成死循环。
算法思想:
设你是一位银行家,手里有100亿资金。有三个企业打算贷款分别为A、B、C。
A最多贷款70亿
B最多贷款40亿
C最多贷款50亿
要保证贷款给企业的总数不少于企业需要的最多贷款数,否则无法收回欠款。
刚开始A、B、C分别借了20、10、30亿。如图
第一次放贷结束后还剩40亿。
然后B需要再贷款30亿。如果放贷,则如下图
此时手里还剩10亿。无法满足ABC任何一个公司的贷款需求。
但是前面提过要保证贷款给企业的总数不少于企业需要的最多贷款数,否则无法收回欠款。于是这就成为了死锁。所以这是一个不安全的状态。
所以不能借给A30亿。
接着来看,第一次放贷后,还剩40亿。此时B想贷款20亿。同上面一样分析。
如果贷款给B20亿,如图所示。
此时手里剩下20亿。可以满足B或者C的最大贷款需求。
于是可以选择把剩下的20以全部借给C,满足了C最大贷款需求,则C会还回全部50亿。
这样就还剩50亿,接下来再把钱全部借给A,A还回后还剩70亿。
最后借给B10亿。
然后全部贷款都可以收回来了。这就是一个安全状态。
按照C、A、B这个顺序,就可以满足A、B、C三个公司的贷款需求。
而C、A、B这个顺序就被称为一个安全序列。
所以,当我们能够找到一个安全序列的时候,这个系统就是安全状态的。而且可以存在多个安全序列。
而进入不安全状态的时候不一定会发生死锁。如借给A30亿后进入了一个不安全状态,但是只要三个公司不继续提出贷款请求的话,也不会进入死锁。
而且如果某些公司提前归还欠款也可以重新回到安全状态。
银行家算法的核心思想:在资源分配前预先估计这次分配后系统是否会进入不安全状态。
代码实现
下面是只有一种资源的银行家算法实现:
要求:设计3个并发进程,共享系统的12个同类不可抢占的资源。各个进程动态进行资源的申请和释放。把各个进程对资源的使用情况记录在进程控制块中。
#include <stdio.h>
#include <stdlib.h>
typedef struct k{
char name[3];//进程名
char appstate;//进程状态
int max;//资源最大需求数
int source;//已占用资源数
char state;//能否执行完标志
struct k*next;//指针,用于创建进程链表
}PCB;
PCB*creat(){
//创建一个进程链表
int i;
PCB *h,*tail,*p;
h=(PCB*)malloc(