JAVA语言的银行家算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湖北中医学院信息技术系
操作系统课程设计
操作系统课程设计(一号黑体加粗)
银行家算法模拟
(小二黑体加粗)
院 班 学 姓 时
系: 级: 号: 名: 间:
小二黑体加粗
同 组 者:
第 1 页
湖北中医学院信息技术系
操作系统课程设计
目录(小二黑体加粗)
一、题目............................................................................................... 3 二、设计目的....................................................................................... 3 三、总体设计思想概述....................................................................... 3 四、设计要求....................................................................................... 3 五、设计方案....................................................................................... 3 六、说明............................................................................................... 4 七、流程图........................................................................................... 5 八、运行结果....................................................................................... 5 九、源程序........................................................................................... 7 十、总结............................................................................................. 12 十一、参考文献................................................................................. 12
第 7 页
湖北中医学院信息技术系
操作系统课程设计
private int Allocation[][] = new int[N][M]; // 各进程当前已分配的资源数 量 private int Need[][] = new int[N][M]; // 各进程尚需多少资源 private int Work[] = new int[M]; // 工作向量,表示系统可提供给进程继续运 行所需的各类资源数量 private boolean Finish[] = new boolean[N]; // 工作向量,表示系统是否有 足够的资源分配给进程 private int Request[] = new int[M]; // 申请多少资源 private int p[] = new int[N]; // 存储安全序列 public Banker(int _Resource[], int _Available[], int _Max[][], int _Allocation[][]) { // 构造方法初始化各成员变量 System.arraycopy(_Resource, 0, Resource, 0, Resource.length); System.arraycopy(_Available, 0, Available, 0, Available.length); System.arraycopy(_Max, 0, Max, 0, Max.length); System.arraycopy(_Allocation, 0, Allocation, 0, Allocation.length); for (int i = 0; i < Need.length; i++) { // 根据所给信息计算Need的初 始值 for (int j = 0; j < Need[i].length; j++) Need[i][j] = Max[i][j] - Allocation[i][j]; } for (int i = 0; i < Finish.length; i++) // 初试化Finish和Request数组 Finish[i] = false; for (int i = 0; i < Request.length; i++) Request[i] = 0; System.arraycopy(Request, 0, Work, 0, Work.length); // 将 Request 数组赋值给Work for (int i = 0; i < p.length; i++) // 初始化存储安全序列的数组 p[i] = 0; show(); // 显示当前资源分配情况 if (safe()) { // 在进程申请资源之前判断当前状态是否是安全的 System.out.println("\n当前的状态是安全的!"); System.out.println("安全序列为:"); for (int j = 0; j < N; j++) { if (j == N - 1) System.out.print("进程" + p[j]); else System.out.print("进程" + p[j] + "——>"); } System.out.println("\n"); }
第 8 页
湖北中医学院信息技术系
操作系统课程设计
} public void bank(int k, int _Request[]) throws ArrayIndexOutOfBoundsException { // 银行家算法 System.arraycopy(_Request, 0, Request, 0, Request.length); int i; for (i = 0; i < Request.length; i++) { if (Request[i] > Need[k][i]) { // 进程 k申请的各类资源数量大于其 本身的需求量时提示错误 System.out.println("申请大于需求量!"); System.out.println("进程" + k + "申请的资源" + i + "的数量为 " + Request[i] + ",大于该进程" + "对该资源的需求量" + Need[k][i]); break; } if (Request[i] > Available[i]) { // 进程k申请的各类资源数量大于 可用资源量时提示错误 System.out.println(" 没有那么多资源,目前可利用资源 " + i + " 的数量为:" + Available[i]); break; } } if (i == Request.length) { System.out.println("进程" + k + "申请各类资源的数量:"); for (int j = 0; j < M; j++) // 输出进程k申请各类资源的数量 System.out.print(" 进程 " + k + "申请资源 " + j + "的数量 :" + Request[j] + "\n"); for (int j = 0; j < Request.length; j++) { // 试分配 Available[j] = Available[j] - Request[j]; Allocation[k][j] = Allocation[k][j] + Request[j]; Need[k][j] = Need[k][j] - Request[j]; } if (!safe()) { // 试分配后判断当前状态的安全性 System.out.println("\n试分配后,状态不安全,所以不予分配!恢复 原状态\n"); recover(k); // 资源申请不成功恢复原状态 show(); // 显示当前资源分配情况 } else { // 资源申请成功输出安全序列 System.out.println("\n申请资源成功! ! !"); System.out.println("安全序列为:"); for (int j = 0; j < N; j++) {
六、说明
通过程序实现定义的进程,为各进程分配资源,具体过程是:首先在程序中定义了 3
第 4 页
湖北中医学院信息技术系
操作系统课程设计
类资源,数量分别为 10,5,7。然后定义进程 p0,p1,p2,p3,p4,接着为各进程申请各 资源, 然后在程序执行并比较申请的资源数量与各资源所剩数量, 若前者大于后者则申请失 败,反之则成功。同时该程序可以撤消新建进程,也可以查看资源分配情况。
七、流程图: 八、运行结果
第 5 页
湖北中医学院信息技术系
Fra Baidu bibliotek
操作系统课程设计
第 6 页
湖北中医学院信息技术系
操作系统课程设计
九、源程序
public class Banker { public final static int N = 5; // 进程个数 public final static int M = 3; // 资源种类数 private int Resource[] = new int[M]; // 每类资源的数量 private int Available[] = new int[M]; // 各类资源可利用的数量 private int Max[][] = new int[N][M]; // 各进程对各类资源的最大需求量
第 3 页
湖北中医学院信息技术系
操作系统课程设计
目为 K。 需求矩阵 Need。这也是一个 n*m 的矩阵,用以表示每一个进程尚需的各类资源数。如 果 Need[i,j]=K,则表示进程 i 还需要 Rj 类资源 K 个,方能完成其任务。 上述三个矩阵存在如下关系: Need[i,j]= Max[i,j]- Allocation[i,j] 2)银行家算法 设进程 I 提出请求 Request[N],则银行家算法按如下规则进行判断。 (1)如果 Request[N]<=NEED[I,N],则转(2);否则,出错。 (2)如果 Request[N]<=AVAILABLE,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: AVAILABLE=AVAILABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复 原状,进程等待。 3)安全性检查 (1)设置两个工作向量 WORK=AVAILABLE;FINISH[M]=FALSE (2)从进程集合中找到一个满足下述条件的进程, FINISH[i]=FALSE NEED<=WORK 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 WORK=WORK+ALLOCATION FINISH=TRUE GO TO 2 (4)如所有的进程 Finish[M]=true,则表示安全;否则系统不安全。
四、设计要求:
银行家算法是避免死锁的一种重要方法, 本实验要求用高级语言编写和调试一个简单的 银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁 的具体实施方法。设计完成后,要求写出一份详细的设计报告。
五、设计方案:
编制银行家算法通用程序,并检测所给状态的系统安全性。 1)银行家算法中的数据结构 假设有 n 个进程 m 类资源,则有如下数据结构: 可利用资源向量 Available。这是一个含有 m 个 元素的数组,其中的每一个元素代表一 类可利用的资源数目, 其初始值是系统中所配置的该类全部可用资源的数目, 其数值随该类 资源的分配和回收而动态地改变。Available[j]=K,则表示系统中现有 Rj 类资源 K 个。 最大需求矩阵 Max。这是一个 n*m 的矩阵,它定义了系统中 n 个进程中的每一个进程 对 m 类资源的最大需求。如果 Max[i,j]=K,则表示进程 i 需要 Rj 类资源的最大数目为 K。 分配矩阵 Allocation。这也是一个 n*m 的矩阵,它定义了系统中每一类资源 当前已分 配给每一进程的资源数。如果 Allocation[i,j]=K,则表示 进程 i 当前已分得 Rj 类资源的数
第 2 页
湖北中医学院信息技术系
操作系统课程设计
一、题目: (标题 2,即三号黑体加粗)
银行家算法模拟。
二、设计目的:
通过此课程设计, 进行的一次全面的综合训练, 使之更好地掌握操作系统的原理及实现 方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
三、总体设计思想概述:
安全状态下系统不会进入死锁,不安全状态可能进入死锁。在进行资源分配之前,先计 算分配的安全性,判断是否为安全状态。
相关文档
最新文档