C程序模拟实现银行家算法

  上周又做操作系统实验,题目是用程序模拟实现银行家算法,写了半天还真有点晕,主要是因为想尽可能符合课本上的描述,所以写出来的程序就比较恶心了,好了,银行家算法就不多说了,不了解的可以先看一下百度百科上的描述,分段上代码吧。完整代码包下载地址:http://files.cnblogs.com/pianoid/Banker.rar

  首先要定义一些结构体,为了符合课本描述,我只定义了一个结构体:

  

typedef struct {
int A;
int B;
int C;
}RESOURCE;

  结构体里面的三个域分别表示三种资源的数量。

  根据课本例题上的数据初始化三个矩阵和一个向量。

//最大需求矩阵
RESOURCE Max[PROCESSES_NUMBER] =
{
{7,5,3},
{3,2,2},
{9,0,2},
{2,2,2},
{4,3,3}
};

//已分配资源数矩阵
RESOURCE Allocation[PROCESSES_NUMBER] =
{
{0,1,0},
{2,0,0},
{3,0,2},
{2,1,1},
{0,0,2}
};

//需求矩阵
RESOURCE Need[PROCESSES_NUMBER] =
{
{7,4,3},
{1,2,2},
{6,0,0},
{0,1,1},
{4,3,1}
};

//可用资源向量
RESOURCE Available = {3,3,2};

  为了能够输出安全状态时的安全序列,还可以添加一个记录安全序列的数组int SafeSequence[PROCESSED_NUMBER]。

  因为银行家算法使用的是试探分配的策略,如果进程请求分配的资源既不大于自己尚需的资源,又不大于系统现存的资源,那就可以先试探着将资源分配给该进程,然后测试分配后是不是有可能造成死锁,如果不会引起死锁(即安全状态)就可以完成分配,否则(即不安全状态)就将试探分配的资源回收回来让其等待。那么根据上面定义的数据就可以很容易的写出试探分配和回收资源的函数。

//试探分配
void ProbeAlloc(int process,RESOURCE *res)
{
Available.A -= res->A;
Available.B -= res->B;
Available.C -= res->C;

Allocation[process].A += res->A;
Allocation[process].B += res->B;
Allocation[process].C += res->C;

Need[process].A -= res->A;
Need[process].B -= res->B;
Need[process].C -= res->C;
}

//若试探分配后进入不安全状态,将分配回滚
void RollBack(int process,RESOURCE *res)
{
Available.A += res->A;
Available.B += res->B;
Available.C += res->C;

Allocation[process].A -= res->A;
Allocation[process].B -= res->B;
Allocation[process].C -= res->C;

Need[process].A += res->A;
Need[process].B += res->B;
Need[process].C += res->C;
}

  接下来就是安全性检查函数了,在这个函数中还需要设置一个Work向量和一个Finish向量,函数实现主要就是通过一个for循环检查试探分配后系统的可用资源数是否能满足所有进程的需求,若能满足某一个进程的需求,则假设分配其所需资源使之完成运行,然后就可以将资源回收以分配给其它进程,如果依照这种方法所有的进程都可以成功执行,那么现在的状态就是安全状态,否则即为不安全状态,有可能引起死锁。

bool SafeCheck()
{
RESOURCE Work = Available;
bool Finish[PROCESSES_NUMBER] = {false,false,false,false,false};
int i;
int j = 0;

for (i = 0; i < PROCESSES_NUMBER; i++)
{
//该进程是否已执行完毕
if(Finish[i] == false)
{
//是否有足够的资源分配给该进程
if(Need[i].A <= Work.A && Need[i].B <= Work.B && Need[i].C <= Work.C)
{
//有则使其执行完成,并将已分配给该进程的资源全部回收
Work.A += Allocation[i].A;
Work.B += Allocation[i].B;
Work.C += Allocation[i].C;
Finish[i] = true;
safeSeq[j++] = i; //顺便记录下来安全序列
i = -1; //需要从开始重新进行遍历
}
}
}

//如果所有进程的Finish向量都为true则处于安全状态,否则为不安全状态
for (i = 0; i < PROCESSES_NUMBER; i++)
{
if (Finish[i] == false)
{
return false;
}
}
return true;
}

有了以上三个函数就可以写出请求分配资源的函数了。

//资源分配请求
bool request(int process,RESOURCE *res)
{
//request向量需小于Need矩阵中对应的向量
if(res->A <= Need[process].A && res->B <= Need[process].B && res->C <= Need[process].C)
{
//request向量需小于Available向量
if(res->A <= Available.A && res->B <= Available.B && res->C <= Available.C)
{
//试探分配
ProbeAlloc(process,res);

//如果安全检查成立,则请求成功,否则将分配回滚并返回失败
if(SafeCheck())
{
return true;
}
else
{
printf("安全性检查失败。原因:系统将进入不安全状态,有可能引起死锁。\n");
printf("正在回滚...\n");
RollBack(process,res);
}
}
else
{
printf("安全性检查失败。原因:请求向量大于可利用资源向量。\n");
}
}
else
{
printf("安全性检查失败。原因:请求向量大于需求向量。\n");
}
return false;
}

  好了,基本上所有必须的函数都已经写完了,为了输出更直观的信息,也可以再加一个PrintTable函数将当前资源非配表显示出来,我就不贴了,如果你想看的话请下载完整代码吧。

  给出一个运行截图。

  上面啰嗦了一大堆,大概你也已经烦了,呵呵,代码实在写的丑,都不大好意思放了,不过有交流才有进步,如果有哪儿说不不正确,欢迎指正。

  完整代码下载地址:http://files.cnblogs.com/pianoid/Banker.rar

时间: 2024-08-28 16:41:10

C程序模拟实现银行家算法的相关文章

避免死锁的银行家算法C++程序实现

 本篇博文为追忆曾经写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家算法的计算机程序化,使其更实用.同时也加深了有关自愿申请.避免死锁等概念,体会避免死锁的实际实现过程与方法. 要求: 1.设定进程p对各类资源r合理的最大需求max及初值确定:2.设定系统提供资源初始状况allocation:3.设定每次某个进程对各类资源的申请表示need:4.编制C++程序,基于

银行家算法:解决多线程死锁问题

死锁: 死锁产生的现场:当A进程P S2信号量而B进程P S1信号量时就会产生死锁,因为S2信号量需要B进程释放,而S1信号量需要A进程释放,因此两个进程都在等相互的资源,造成死锁. 死锁产生的条件: 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用.(信号量s1 s2为互斥的信号量,只能被一个进程占用) 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放.(A进程在获取s2阻塞时,一直占用s1) 不可剥夺条件:进程已获得的资源在未使用完之前,不

银行家算法学习笔记

     上周操作系统的实验,就是模拟实现银行家算法,首先我们还是应该对银行家算法熟悉一下. 银行家算法是最具代表性的避免死锁的算法.因为该算法原本是为银行系统设计的,以确保银行在发放现金贷款时,不会发生不满足所有客户需求的情况.在OS中也可它来实现避免死锁. 算法概述: 为实现银行家算法,每一个进程在进入系统时,它必须申明在运行过程中,可能需要每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量,当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程.若有,再进一步计算在

编程序模拟银行家算法

一.编程序模拟银行家算法 1)对用银行家算法来避免死锁的方法有较深入的了解,给出系统的初始状态,模拟避免死锁的动态过程. 2)银行家算法中的数据结构 (1)可利用资源向量Available.这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变.Available[j]=K,则表示系统中现有Rj类资源K个. (2)最大需求矩阵Max.这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对

操作系统:银行家算法(避免死锁)

算法介绍: 程序实现: /***************************************************** 程序:银行家算法实现 作者:小单 时间: 2013年11月5日 ******************************************************/ #include <iostream> #include <string> using namespace std; #define MAXPROCESS 50 //所能执行的

c++银行家算法

1 #include <iostream> 2 #include<string> 3 #define False 0 4 #define True 1 5 6 using namespace std; 7 8 9 int Avaliable[100] = { 0 }; //系统->拥有资源 10 int Max[100][100] = { 0 }; //进程->共需要 11 int Allocation[100][100] = { 0 }; //进程->已得到 1

操作系统: 银行家算法的分析和代码实现(c++语言)

银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法.它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行. 在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待.为实现银行家算法,系统必须设置若干数据结构. 1)各种资源总数向量resource 是一个含有m个元素的数组,其中

操作系统之银行家算法避免死锁

银行家算法避免死锁 要求: 完成程序数据结构的设计,数据的录入. 完成进程需求矩阵的输出,包括最大需求矩阵,尚需资源矩阵,可获得资源显示. 完成某进程请求资源试分配. 完成安全性检查. 1.         试探分配 当进程pi提出资源申请时,系统执行下列步骤: (1)若Request[i][j]≤Need[i][j],转(2): 否则错误返回 (2)若Request[i][j]≤Available[j], 转(3):否则进程等待 (3)试探着把资源分配给进程Pi,则有: Available[j

N体运动的程序模拟

这依然是与<三体>有关的一篇文章.空间中三个星体在万有引力作用下的运动被称之为三体问题,参见我的上一篇文章:三体运动的程序模拟.而这一节,对三体问题进行了扩展,实现了空间中N个星体在万有引力下的运动模拟. 程序中使用了两个物理定律: (1)万有引力定律 这是牛顿发现的:任意两个质点有通过连心线方向上的力相互吸引.该引力的大小与它们的质量乘积成正比,与它们距离的平方成反比,与两物体的化学本质或物理状态以及中介物质无关. 以数学表示为: 其中: : 两个物体之间的引力 : 万有引力常数 : 物体1