操作系统课程设计报告
小组成员 指导教师
吉林建筑大学
计算机科学与工程学院 年 月 日
银行家算法
摘 要
本次的课程设计内容是银行家算法,在操作系统当中,由于竞争非剥夺性资源和进程推进的不当,对系统的安全造成威胁,所以,银行家算法就是为了避免对系统产生死锁而存在的。银行家算法包括对请求资源的试分配和对安全性的考量,当系统的安全性不能够满足的时候,则对系统进行保护。
在编写银行家算法的时候需要定义Need(需求矩阵),Allocation(分配矩阵),Max(最大需求矩阵)以及Available(可利用资源量)。在实现一系列的功能的时候使用的数组的结构,便于进行矩阵的加减运算,可以提高程序的运行效率。
通过编写可以基本上实现银行家算法所要达到的基本目的,在输入正确的情况下能够输出正确的安全序列,在不安全的情况下可以做出提醒,并且恢复原有输入数据。
关键字:银行家算法 最大需求矩阵 分配矩阵 需求矩阵 可利用资源量
1
1 绪论
银行家算法是操作系统当中为避免锁死的算法,并且是最具有代表性的避免锁死的算法,能够有效的在资源分配的过程中,对系统的安全性进行检测。整个算法的计算步骤为对输入的数据进行试分配,并对安全性进行检测,当系统为安全的时,依照安全序列执行程序,如果不安全则进入阻塞状态。银行家算法的来源是在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。
在避免死锁的方法中,所施加的简直条件比在预防死锁的方法中限制条件要弱,有可能获得令人满意的系统性能。在该方法中,把系统的状态分为安全状态和不安全状态,只要能使系统都处于安全状态,就可避免死锁的发生。 所谓安全状态与不安全状态是指如果所有过程有可能完成执行(终止),则一个状态被认为是安全的。由于系统无法知道什么时候一个过程将终止,或者之后它需要多少资源,系统假定所有进程将最终试图获取其声明的最大资源并在不久之后终止。
2
2 需求分析
2.1 问题描述:
在多道程序系统中,虽然能够借助于多个进程的并发执行,来改善系统资
源的利用率,提高系统的吞吐量,但是依然有风险存在,那就是——锁死。所谓锁死是指,多个进程在运行中因争夺资源而造成的一种僵局,当进程的这种僵持状态时,若无外力作用,它们将无法再向前推进。一组程序中,每个进程都无限等待被该组进程中的另一进程所占有的资源,因而永远无法得到资源,这种现象就叫做进程死锁。
2.2 产生条件
1﹑进程间竞争非剥夺性资源 2﹑进程保持申请
3﹑资源的独占,一个资源同一时刻只能分配给一个进程 4﹑进程循环等待资源
2.3 运行环境
Visual C++ 6.0
2.4 程序功能
在该程序中应该具有以下功能:
1、 从外界输入进程数,资源数以及完成银行家算法的所需的各类资源数。 2、 当输入越界或者非法输入时能够提示错误。
3、 当进程推进处于不安全状态时要能够进行提示处于不安全状态,并且能
够恢复数据到初始状态。当请求资源量大于可利用资源数时要能够进行提醒,并且重新输入。
4、 当数据完成初始化时,要能够输出数据所对应的矩阵。
3 概要设计
3.1程序模块
本程序包括了四个基本模块: 主函数、试分配、安全性测试、数据的输入与输出。 3.1.1主函数
主函数用于输出系统的主要操作界面,以及调用其他的函数,完成银行家算法。
3
3.1.2试分配:
对输入的进程的Max、Available、Allocation以及Request进行分配,判断是否可以正常分配。 3.1.3 安全性测试:
当试分配完成时,通过安全性测试来对系统的安全性进行检测,安全时输出安全序列,不安全时进行提醒,并且恢复到初始化时输入的数据。
3.2模块之间关系
主函数可以调用系统的所有函数,以及输出功能界面,将试分配函数,安全性测试函数和输入输出函数定义在主函数当中,在需要时通过相应的选项进行调用。而试分配与安全性测试是并列的两个函数,存在执行试分配后需对安全序列进行判断。
输入输出函数,确定数值,并将相对应的数据输入到对应的模块,来进行计算。
3.3 数据结构
程序当中需要四种数据结构。 1、可利用资源矩阵(Available),当Available[]=k时,这表示系统中有该类资源k个。
2、最大需求矩阵(Max),当Max[][]=k时,则表示进程需要的资源为k个。 3、分配矩阵(Allocation),当Allocation[][]=k时,则表示进程当前已被分得k个资源。
4、需求矩阵(Need),当Need[][]=k时,则表示进程还需要k个资源才能够完成。
3.4算法思想
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
4