操作系统 银行家算法实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《计算机操作系统》

课程设计

题目银行家算法分析

学院计算机与软件学院

专业网络工程

班级2012级1班

学号20121346001

姓名方锡

指导教师岳键

起止时间2014.5.20~2014.6.3

一、实验报告设计背景

1.1. 产生死锁的原因:

我们知道,多个进程在运行的时候因为争夺资源会产生死锁的情况,当进程出浴照这种情况的时候,若无外力作用,他们将处于无法再向前推进的状态,而根据课本知识可知,预知,可以通过预防死锁或者避免死锁的方法来解决这一问题,通过使产生死锁的四个必要条件的第2、3、4个条件之一不能成立来避免死锁的发生。

1.2. 产生的死锁的必要条件:

(1)互斥条件;(2)请求和保持条件;(3)不可剥夺条件;(4)环路等待。

1.3.银行家算法介绍

通过实践可以看出,预防死锁虽然可以预防死锁的发生,但是牺牲了进程的执行效率,同时,在预防死锁的过程中需要考虑到对用户的资料的安全性,所以就需要考虑到利用一些特别的算法来避免死锁,其中最具代表性的算法就是Dijkstra的银行家算法,这是由于该算法能用于银行系统现金贷款的发放而得名的。它通过自己特有的算法,在每次分配进程系统资源时候会先试探性的假设分配资源给进程,然后通过安全性算法检测此次分配是否会导致系统进入不安全状态,如果安全则直接进行资源分配,如果不安全则暂不分配。所以本次试验报告就是要深入了解银行家算法的原理和运行过程。

二.银行家算法的原理

2.1 银行家算法的思路

算法会先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。若请求合法,则进行试分配。最后对试分配后的状态调用安全性检查算法进行安全性检查。若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。

2.2 银行家算法中的数据结构

可利用资源向量int Available[j] j为资源的种类。

最大需求矩阵int Max[i][j] i为进程的数量。

分配矩阵int Allocation[i][j]

需求矩阵int need[i][j]= Max[i][j]- Allocation[i][j]

申请各类资源数量int Request i[j] i进程申请j资源的数量

工作向量int Work[x] int Finish[y]

2.3银行家算法

设Request i是进程P i的请求向量,如果Request i[j]=K,表示进程P i需要k个Rj类型的资源,当P i发出资源请求后,系统按照下述步骤进行检查:

(1)如果Request i[j]≤Need[j],便转向步骤(2);否则认为出错,因为它所需要的资源数已经超过它所宣布的最大值。

(2)如果Request i[j]≤Available[j],便转向步骤(3);否则,表示尚无足够资源,P i须等待。

(3)系统试探着将资源分配给进程P i,并修改下面数据结构中的数值:

Available[j]:=Available[j]-Request i[j];

Allocation[i,j]:=Allocation[i,j]+Request i[j];

Need[i,j]:=Need[i,j]-Request i[j];

(4)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程P i,以完成本次分配;否则本次的试探分配作废,恢复原来的资源分配状态,让进程P i等待。

2.4安全性检查算法(safe()函数)

(1)设置两个向量:

工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work= Available。

Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=0;当有足够的资源分配给进程时,再令Finish[i]=1。

(2)在进程中查找符合以下条件的进程:

条件1:Finish[i]=0;

条件2:need[i][j]<=Work[j]

若找到,则执行步骤(3)否则,执行步骤(4)

(3)当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

Work[j]= Work[j]+ Allocation[i][j];

Finish[i]=1;

goto step 2;

(4)如果所有的Finish[i]=1都满足,则表示系统处于安全状态,否则,处于不安全状态。

三、设计思路

(1)本次实验我用java语言来实现对n个进程采用优先权优先算法以及轮转算法的进程调度。

(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:

1)进程标识ID,其中0为闲逛进程,用户进程的标识数为1,2,3…。

2)进程优先级Priority,闲逛进程(idle)的优先级为0,用户进程的优先级大于0,且随机产生,标识数越大,优先级越高。

3)进程占用的CPU时间CPUtime,进程每运行一次,累计值等于4。

4)进程总共需要运行时间Alltime,利用随机函数产生。

5)进程状态,0-就绪态;1-运行态;2-阻塞态。

6)队列指针next,用来将多个进程控制块PCB链接为队列。

(3)优先数改变的原则

1)进程在就绪队列中每呆一个时间片,优先数增加1。

2)进程每运行一个时间片,优先数减3。

(4)在调度前,系统中拥有的进程数PCB_number由键盘输入,经初始化后,所有的进程控制块PCB链接成就绪队列。

四、实现实验的java代码

package faxi;

import java.util.*;

public class Bank {

public static void main(String[] args) {

int process;//定义进程数量

int resource=3;//定义资源种类是3

int[] available;//可利用的资源

int[][] max,allocation,need;//分别是最大的需求数、已分配的资源、需求资源

Scanner scanner=new Scanner(System.in);

System.out.print("请输入进程数>>");

process=scanner.nextInt();

System.out.print("请输入可利用资源向量(已定义3个资源种类)>>");

available=new int[resource];

for (int i = 0; i < resource; i++) {

available[i]=scanner.nextInt();

}

System.out.println("请输入分配矩阵");

allocation=new int[process][resource];

for (int i = 0; i

System.out.print("请输入进程"+(i+1)+"已分配的资源数>>");

for (int j = 0; j < resource; j++) {

allocation[i][j]=scanner.nextInt();

}

}

相关文档
最新文档