银行家算法的模拟实现

上传人:第*** 文档编号:30611994 上传时间:2018-01-31 格式:DOC 页数:14 大小:80KB
返回 下载 相关 举报
银行家算法的模拟实现_第1页
第1页 / 共14页
银行家算法的模拟实现_第2页
第2页 / 共14页
银行家算法的模拟实现_第3页
第3页 / 共14页
银行家算法的模拟实现_第4页
第4页 / 共14页
银行家算法的模拟实现_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《银行家算法的模拟实现》由会员分享,可在线阅读,更多相关《银行家算法的模拟实现(14页珍藏版)》请在金锄头文库上搜索。

1、 银行家算法的模拟实现 一、设计目的 1、了解多道程序系统中,多个进程并发执行的资源分配。 2、掌握死锁的产生的原因、产生死锁的必要条件和处理死锁的基本方法。 3、掌握预防死锁的方法,系统安全状态的基本概念。 4、掌握银行家算法,了解资源在进程并发执行中的资源分配策略。 5、理解死锁避免在当前计算机系统不常使用的原因。 二、设计任务 在 Window98/2000 系统的 TC2.0 环境下运行程序; 通过最有代表性的避免死锁的算法(Dijkstra)的银行家算法程序实现来理解进程并发中的资源分配,死锁避免在死锁解决中的可行性; 设计程序在自动、手动方式下运行,理解银行家算法的实质。 三、设计

2、内容与步骤 A、银行家算法设计的知识准备。 1、死锁概念。在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险死锁。所谓死锁(Deadlock),是指多个进程在运行中因争夺资源而造成的一种僵局(Deadly_Embrace),当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程。2、关于死锁的一些结论: 参与死锁的进程最少是两个 (两个以上进程才会出现死锁) 参与死锁的进程至少有两个已经占有资源

3、 参与死锁的所有进程都在等待资源 参与死锁的进程是当前系统中所有进程的子集 注:如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。 3、资源分类。 永久性资源: 可以被多个进程多次使用(可再用资源) 可抢占资源 不可抢占资源 临时性资源:只可使用一次的资源;如信号量,中断信号,同步信号等(可消耗性资源) “申请-分配- 使用-释放”模式 4、产生死锁的四个必要条件:互斥使用(资源独占)、不可强占(不可剥夺)、请求和保持(部分分配,占有申请)、循环等待。 1) 互斥使用(资源独占) 一个资源每次只能给一个进程使用 2) 不可强占(不可剥夺) 资源申请者不能强行的从资源占有者手中夺取资源,资源只

4、能由占有者自愿释放 3) 请求和保持(部分分配,占有申请) 一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配) 4) 循环等待 存在一个进程等待队列 P1 , P2 , , Pn, 其中 P1 等待 P2 占有的资源,P2 等待 P3 占有的资源,Pn 等待 P1 占有的资源,形成一个进程等待环路 5、 死锁的解决方案 5.1 产生死锁的例子 申请不同类型资源产生死锁 P1: 申请打印机 申请扫描仪 使用 释放打印机 释放扫描仪 P2: 申请扫描仪 申请打印机 使用 释放打印机 释放扫描仪 申请同类资源产生死锁(如内存) 设有资源 R,R 有 m 个分配单位,由

5、 n 个进程 P1,P2,Pn(n m)共享。假设每个进程对 R 的申请和释放符合下列原则: * 一次只能申请一个单位 * 满足总申请后才能使用 * 使用完后一次性释放 m=2,n=3 资源分配不当导致死锁产生 5.2 死锁预防: 定义:在系统设计时确定资源分配算法,保证不发生死锁。具体的做法是破坏产生死锁的四个必要条件之一 破坏“不可剥夺”条件 在允许进程动态申请资源前提下规定,一个进程在申请新的资源不能立即得到满足而变为等待状态之前,必须释放已占有的全部资源,若需要再重新申请 破坏“请求和保持”条件 要求每个进程在运行前必须一次性申请它所要求的所有资源,且仅当该进程所要资源均可满足时才给予

6、一次性分配 破坏“循环等待”条件 采用资源有序分配法: 把系统中所有资源编号,进程在申请资源时必须严格按资源编号的递增次序进行,否则操作系统不予分配 6安全状态与不安全状态 安全状态: 如果存在一个由系统中所有进程构成的安全序列 P1,Pn ,则系统处于安全状态。一个进程序列P1 ,Pn 是安全的,如果对于每一个进程 Pi(1i n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程 Pj (j #include #ifndef MY_MAX #define MY_MAX 5 #endif int max153= 7,5,3, 3,2,2, 9,0,2, 2,2,2, 4,3,3 ;/*

7、最大分配需求矩阵*/ int allocation153= 0,1,0, 2,0,0, 3,0,2, 2,1,1, 0,0,2 ;/*已分配矩阵*/ int need153= 7,4,3, 1,2,2, 6,0,0, 0,1,1, 4,3,1 ;/*现在需求矩阵*/ int available13=3,3,2;/*现可利用矩阵*/ int max1010,allocation1010,need1010,available10; int n_proc;/*进程数*/ int type_src;/*资源种类数*/ int request1010;/*进程请求资源*/ int work10;/*可供

8、进程继续运行所需资源的向量*/ int finish10;/*标识是否有足够的资源分配给进程*/ int index10;/*用于记录进程顺序*/ int t=0;/*记录当前的进程数 */ int serial_proc=0;/*当前请求进程*/ /*-*/ /*生成确定范围 min,max内的随机数*/ int random_num(int min,int max) int i,range; double j; range=max-min; i=rand(); j=(double)i/(double)RAND_MAX); i=(int)(j*(double)range); i+=min;

9、return i; /*手动输入时的初始化数据*/ void init0_data(void) int i,j; n_proc=5; type_src=3; for(i=0;iavailablej) k1+; break; while(k1=n_proc); for(i=0;i=n_proc) printf(进程号非法( 越界)n); goto require0; tmp=0; for(j=0;jneedserial_procj) printf(t 请求资源超过需求资源n); return 1; return 0; /*请求资源超过可利用资源*/ int over_avail() int j;

10、 for(j=0;javailablej) printf(t%d请求资源超过可利用资源n,serial_proc); return 1; return 0; /*资源申请成功*/ int apply_success(int be_need,int be_avail) if (be_need=0 & be_avail=0) return 1; return 0; /*安全性检查*/ int check_security() int i,j,tmp; for(j=0;jworkj) tmp=0; break; if(!tmp) continue; else for(j=0;jtype_src;j+

11、) workj+=allocationij; finishi=1; tmp=0; for(j=0;jtype_src;j+) tmp+=needij; if(tmp) indext+=i; goto L2; for(j=0;jn_proc;j+) if(finishj=0) return 0; return 1; /*银行家算法主体*/ void banker() int allocation_t10,available_t10,need_t10;/*临时变量*/ int tmp; int j; /*保留当前的资源分配*/ for(j=0;jtype_src;j+) available_tj=

12、availablej; allocation_tj=allocationserial_procj; need_tj=needserial_procj; /*修改 available,allocation,need 矩阵*/ for(j=0;jtype_src;j+) availablej-=requestserial_procj; needserial_procj-=requestserial_procj; allocationserial_procj+=requestserial_procj; if(check_security(type_src,n_proc) tmp=0; for(j=0

13、;jtype_src;j+) tmp+=needserial_procj; if(!tmp) for(j=0;jtype_src;j+) availablej+=allocationserial_procj; else for(j=0;jtype_src;j+) allocationserial_procj=allocation_tj; needserial_procj=need_tj; availablej=available_tj; int finish_all(void) int i,j; for(i=0;in_proc;i+) for(j=0;jtype_src;j+) if(need

14、ij!=0) return 1; return 0; /*结果输出*/ void output() int i,j; printf(n 安全序列输出格式: 进程号,进程数n); for(i=0;it;i+) printf(%d,%d ,indexi,t); printf(n); printf(依次为:最大需求矩阵,已分配矩阵, 需求矩阵,可利用矩阵n); for(i=0;in_proc;i+) printf(+); for(j=0;jtype_src;j+) printf(%2d,maxij); printf(+); for(j=0;jtype_src;j+) printf(%2d,allocationij); printf(+); for(j=0;jtype_src;j+) printf(%2d,needij); printf(+); if (i=serial_proc) for(j=0;jtype_src;j+) printf(%3d,availablej); printf(

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 外语文库 > 英语学习

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号