logo资料库

模拟银行家算法程序课程设计.doc

第1页 / 共24页
第2页 / 共24页
第3页 / 共24页
第4页 / 共24页
第5页 / 共24页
第6页 / 共24页
第7页 / 共24页
第8页 / 共24页
资料共24页,剩余部分请下载后查看
模拟银行家算法 一.课程设计目的 经过一个学习《操作系统》课程的学习,掌握了许多书本上的知识,但是对书上的概 念并没有真正意义的了解。这次课程设计的目的,掌握银行家算法的数据结构,了解算法的 执行过程,加深对银行家算法的理解。通过编写和调试一个系统动态分配资源的简单模拟程 序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。 二.实验内容 (1) 模拟一个银行家算法; (2) 算法所需要的数据结构; (3) 初始化时让系统拥有一定的资源; (4) 用键盘输入的方式申请资源; (5) 如果预分配后,系统处于安全状态,则修改系统的资源分配情况; (6) 如果预分配后,系统处于不安全状态,则提示不能满足请求, 此次课程设计的主要内容时模拟实现动态资源分配。同时要求编写和调试一个系统 动态资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避 免死锁的发生。 银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加 深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程占用;第二个为等 待条件,即一个进程请求资源不能满足时,它必须等待,单它仍继续宝石已得到的所有其 他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四 个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前 一个进程所持有的资源。防止死锁的机构只能确保上述四个条件之一不出现,则系统就不 会发生死锁。通过这个算法可以用来解决生活中的实际问题,如银行贷款等。 三.实验原理分析 1. 银行家算法中的数据结构 (1)可利用资源向量 Available,这是一个含有 m 各元素的数组,其中的每个元素代表一 类可利用资源的数目,其初始值是系统中所配置的该类全部可利用资源的数目,其数值随该 类资源的分配和回收而动态改变。如果 Available[j] = K,则表示系统中现有 Rj 类资源 K 个。 (2)最大需求矩阵 Max,这是一个 n×m 的矩阵,它定义了系统中 n 个进程中的每一个进程 对 m 类资源的最大需求。如果 Max[i, j] = K, 则表示进程 i 需要 Rj 类资源的最大数目为 K。 (3)分配矩阵 Allocation。这也是一个 n×m 的矩阵,它定义了系统中每一类资源当前已 分配给每一进程的资源数。如果 Allocation[i, j] = K, 则表示进程 i 当前已经分得 Rj 类资源的数目为 K。 (4)需求矩阵 Need。这也是一个 n×m 的矩阵,用以表示每个进程尚需要的各类资源数。 如果 Need[i, j]=K,则表示进程 i 还需要 Rj 类资源 K 个,方能完成其任务。 上述三个矩阵间存在一下关系: Need[i, j]= Max[i - j] - Allocation[i, j]
2. 银行家算法 设 Requesti 是进程 Pi 的请求向量,如果 Requesti[j] = K,表示进程 Pi 需要 K 个 Ri 类型的资源。当 Pi 发出资源请求后,系统按下述步骤进行检查: (1)如果 Requesti[j] <= Need[i, j],便转向步骤 2;否则认为出错,因为它所需的资源 数已经超过了它所宣布的最大值。 (2)如果 Requesti[j] <= Available[j],便转向步骤 3;否则表示尚无足够资源,Pi 需 等待。 (3)系统试探着把资源分配给进程 Pi,并修改下面数据结构中的数值。 Available[j] = Available-Requesti[j]; Allocation[i, j] = Allocation[i, j] + Requesti[j]; Need[i, j] = Need[i, j] - Request[j]; (4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正 式将资源分配给进程 Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来资源 的分配状态,让进程 Pi 等待。 3. 安全性算法 系统所执行的安全性算法可描述如下: (1)设置两个向量;1. 工作向量 Work;它表示系统可提供给进程继续运行所需要的各类 资源的数目,它含有 m 个元素,在执行安全性算法开始时,work = Availalbe;2. Finish: 它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做 Finish[i] = false; 当有足够资源分配给进程时,再令 Finish[i] = true; (2)从进程集合中找到一个能满足下述条件的进程: 1. Finish[i] == false;2. Need[i, j] <= Work[j];若找到,执行步骤 (3),否则,执行步骤(4) (3)当进程 Pi 获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work[j] = Work[j] + Allocation[i, j]; Finish[i] = true; go to step (2); (4)如果所有进程的 Finish[i] 处于不安全状态。 == true 都满足,则表示系统处于安全状态,否则系统 //各种资源可利用的数量 数据结构分析 本程序所使用的主体数据结构如下: 定义全局变量 const int x=50,y=100; //定义常量,便于修改 int Available[x]; int Allocation[y][y]; //各进程当前已分配的资源数量 int Max[y][y]; //各进程对各类资源的最大需求数 int Need[y][y]; //还需求矩阵 int Request[x]; //申请各类资源的数量 int Work[x]; //工作向量,表系统可提供给进程运行所需各类资源数量 int Finish[y]; //表系统是否有足够的资源分配给进程,0 为否,1 为是 int p[y]; //存储安全序列 int i,j; //全局变量,主要用于循环语句中
int n,m; //n 为进程的数量,m 为资源种类数 int l=0,counter=0; 函数声明 int shuzi(int sz); //数字判断函数,还可使用 void shuzi(int& sz); 方式 void chushihua(); //系统初始化函数 void safe(); void bank(); void showdata(); void sign(); 主函数结构 int main(){ system("color 06f"); //设置当前窗口的背景色和前景色 //安全性算法函数 //银行家算法函数 //函数 showdata,输出当前资源分配情况 //签名函数 cout<<…… //显示程序开始提示信息 chushihua(); //初始化函数调用 cout<>"<<"进程"<<"("<
//各进程对各类资源的最大需求数 //存储安全序列 //定义常量,便于修改 //各种资源可利用的数量 //各进程当前已分配的资源数量 实验过程: 方法一 #include #include #include #include #include //===定义全局变量=== const int x=50,y=100; int Available[x]; int Allocation[y][y]; int Max[y][y]; int Need[y][y]; //还需求矩阵 int Request[x]; //申请各类资源的数量 int Work[x]; //工作向量,表示系统可提供给进程继续运行所需的各类资源数量 int Finish[y]; //表示系统是否有足够的资源分配给进程,0 为否,非 0 为是 int p[y]; int i,j; int n,m; //n 为进程的数量,m 为资源种类数 int l=0,counter=0; //函数声明 int shuzi(int sz); void chushihua(); void safe(); void bank(); void showdata(); void sign(); //===数字判断函数=== int shuzi(int sz){ //系统初始化函数 //安全性算法函数 //银行家算法函数 //函数 showdata,输出当前资源分配情况 //签名函数 //数字判断函数 或者使用 void shuzi(int& sz); 方式 //输入数据并判断是否为数字 //临时指针,存放输入字符 char *temp; temp=new char; int len; //存储取字符的长度 sz=0 ; //清零 char s; // do{ //输入赌注,只能输入数字 // gets(temp); //getline(cin,temp) cin>>temp; len=strlen(temp); for(int i=0;i'9'){ cout<<"输错了! 你输入的是数字吗?! \n\n"; cout<<"请重新输入:"; break;
} } }while(s<'0' || s>'9'); for(int i=0;i
for (j=0; j=Allocation[i][j]) // Need[i][j] = Max[i][j]-Allocation[i][j]; //计算还需求量 else Need[i][j]=0;//最大需求量小于已分配量时还需求量为 0,即此类资源已足够不需再 申请 } cout<=Array[j].value){ int t; t=Array[j].value; Array[i].value=t; t=Array[j].num; } Array[j].value=Array[i].value; Array[j].num=Array[i].num; Array[i].num=t;
else continue; } DWORD m_delay=3000; Sleep(m_delay); /*for(i=0;i
cout<<'\n'<<"找到一个安全序列:"<<"P"<"; for(i=0;i"; } cout<<'\n'<<"已通过安全性测试!"<
分享到:
收藏