1、操作系统课程设计报告题目:银行家算法 安全性算法院 (系):计算机科学与工程专 业:软件工程班 级:130608 班学 生:姚骏川学 号:130608118指导教师:姜虹2015 年 12 月 28 目录摘 要 21 绪论 11.1 前言 11.2 研究意义 12 需求分析 32.1 题目描述 .32.2 银行家算法 .32.3 基本要求 .32.4 目的 .33 概要设计 53.1 算法思路: .53.2 银行家算法步骤 .53.3 安全性算法步骤 .534 数据结构: .64 详细设计 84.1 主要函数的核心代码: .84.2 系统主要过程流程图 .84.3 银行家算法流程图 .95 测
2、试与分析 105.1 测试数据 105.2 银行家算法的演示 105.3 分配资源由于大于可利用资源则失败。 .115.4 增加一个作业得到不安全序列。 115.5 分配资源由于大于最大资源则失败。 .12附录 源程序清单 15绪论11 绪论1.1 前言Dijkstra (1965)提出了一种能够避免死锁的调度算法,称为银行家算法。它的模型基于一个小城镇的银行家,他向一群客户分别承诺了一定的贷款额度,每个客户都有一个贷款额度,银行家知道不可能所有客户同时都需要最大贷款额,所以他只保留一定单位的资金来为客户服务,而不是满足所有客户贷款需求的最大单位。这里将客户比作进程,贷款比作设备,银行家比作系
3、统。客户们各自做自己的生意,在某些时刻需要贷款。在某一时刻,客户已获得的贷款和可用的最大数额贷款称为与资源分配相关的系统状态。一个状态被称为是安全的,其条件是存在一个状态序列能够使所有的客户均得到其所需的贷款。如果忽然所有的客户都申请,希望得到最大贷款额,而银行家无法满足其中任何一个的要求,则发生死锁。不安全状态并不一定导致死锁,因为客户未必需要其最大贷款额度,但银行家不敢抱这种侥幸心理。银行家算法就是对每一个请求进行检查,检查如果满足它是否会导致不安全状态。若是,则不满足该请求;否则便满足。检查状态是否安全的方法是看他是否有足够的资源满足一个距最大需求最近的客户。如果可以,则这笔投资认为是能
4、够收回的,然后接着检查下一个距最大需求最近的客户,如此反复下去。如果所有投资最终都被收回,则该状态是安全的,最初的请求可以批准。1.2 研究意义在多道程序系统中,多个进程的并发执行来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险死锁。所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局(DeadlyEmbrace) ,当进程处于这种状态时,若无外力作用,他们都无法在向前推进。西安工业大学北方信息工程学院要预防死锁,有摒弃“请求和保持”条件,摒弃“不剥夺”条件,摒弃“环路等待”条件等方法。但是,在预防死锁的几种方法之中,都施加了较强的限制条件;而在避免死锁
5、的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统状态分为安全状态和不安全状态,便可避免死锁的发生。而最具代表性的避免死锁的算法,便是 Dijkstra 的银行家算法。利用银行家算法,我们可以来检测 CPU 为进程分配资源的情况,决定 CPU是否响应某进程的的请求并为其分配资源,从而很好避免了死锁的产生。需求分析32 需求分析2.1 题目描述 银行家算法是一种最具有代表性的避免死锁的算法。要解释银行家算法,必须先解释操作系统的安全状态和不安全状态。所谓安全状态,是指系统能按照某种进程顺序P1,P2,,Pn(称P1,P2,,Pn 序列为安全序列) ,来为每个进程 Pi
6、 分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺利完成。安全状态一定没有死锁发生。如果系统无法找到这样一个安全序列,则称系统处于不安全状态。那么,什么是安全序列呢?如果对每一个进程 Pi(1#include#include#define False 0#define True 1int Max100100=0;/各进程所需各类资源的最大需求int Avaliable100=0;/系统可用资源char name100=0;/资源的名称int Allocation100100=0;/系统已分配资源int Need100100=0;/还需要资源int Request100=0;
7、/请求资源向量int temp100=0;/存放安全序列int Work100=0;/存放系统可提供资源int M=100;/作业的最大数为 100int N=100;/资源的最大数为 100void showdata()/显示资源矩阵 int i,j;cout“;couti;/输入须申请的资源号coutRequestj;/输入需要申请的资源for (j=0;jNeedij)/判断申请是否大于需求,若大于则出错 coutAvaliablej)/判断申请是否大于当前资源,若大于则 /出错coutn;flag=N;N=N+n;for(int i=0;inameflag;coutAvaliablef
8、lag+;showdata();safe();void delresources()/删除资源char ming;int i,flag=1;coutming;for(i=0;iAvaliable0Avaliable1Avaliable2;coutMaxflagi;Needflagi=Maxflagi-Allocationflagi;showdata();safe();int main()/主函数int i,j,number,choice,m,n,flag;char ming;coutn;N=n;for(i=0;iming;namei=ming;coutnumber;Avaliablei=num
9、ber;coutm;M=m; coutMaxij;do flag=0;coutAllocationij;if(AllocationijMaxij)flag=1;Needij=Maxij-Allocationij; if(flag)coutchoice;switch(choice)case 1: addresources();break;case 2: delresources();break;case 3: changeresources();break;case 4: share();break;case 5: addprocess();break;case 0: choice=0;break;default: cout“请正确选择功能号(0-5)!“endl;break; return 1;