Project4:
Creating a Shell Interface
一、实验环境
Ubuntu 10.04系统
Eclipse开发平台
二、实验过程:
1、新建java project,编写代码
我自己编写了测试软件
程序大体思路:
1.1、Bank.java
银行家算法的接口,声明了必要的方法以提供操作;
1.2、BankIml.java
实现Bank接口,存放基本的数据:
int numOfCustomers = 0;
int numOfResources;
boolean state;
boolean[] finish;// 存放进程是否完成
int[] available;// 存放可获得的资源
int[][] maximum;// 存放每个进程需要的最大资源
int[][] allocation;// 存放每个进程已经分配到的资源
int[][] need;// 存放每个进程还需要得资源
基本函数实现如下:
共有函数:
public void initResourceAvailable(int i, int availablenum)
初始化Available数组,使available[i]=availablenum;
public void initNumOfCustomers(int num)
根据进程(消费者)数量初始化所有数组;
public void addCustomer(int customerNum, int[] maxDemand)
添加消费者,并添加其最大资源使用情况,修改maximum数组对应的值;
public void addCustomerallocation(int customerNum, int[] allocationResource)
添加消费者的已分配资源、需要资源情况,根据int[] allocationResource的值修改allocation[][]、need[][]的customerNum行的值;
public void getState()
根据银行家算法,对现在的状态进行判断。如果进程没有全结束,进行以下操作:找到没有完成的进程,如果分配该进程资源后系统仍处于安全的状态,那么就分配给他资源,并释放它已分配资源,修改它的标志位为已执行,并修改相应资源的数组。如果进程可全部执行完,则系统是安全的,反之不安全。
public boolean requestResources(int customerNum, int[] request)
分配给customerNum进程request的资源;
public void releaseResources(int customerNum, int[] release)
释放customerNum进程release的资源
为方便实现,我添加了以下私有函数。
私有函数:
private boolean allFinnish()
判断是否所有的进程都进行完毕,若存在finish[]=false,则返回false;
private void releaseResources(int customerNum)
释放customerNum的已分配的所有资源;
private boolean requestResources(int customerNum)
判断customerNum对应的进程是否可以释放资源。如果存在avaiable[j]<need[customerNum][j],则返回false;
1.3、TestHarness.java
测试文件,通过读取运行时的参数,初始化一个BankIml的对象。根据用户输出对系统是否安全进行判断。具体如下:
1、分解命令:文件的前两个参数为要读入的两个文件,第一个用以初始化max数组,第二个用于构建allocation数组。命令参数的个数-2(两个文件)即为资源个数,通过循环调用initResourceAailable初始化。
2、根据文件内容初始化max、allocation。
3、然后根据用户输入的申请资源的进程和申请的资源情况分配资源
4、调用getState,返回系统状态(是否安全)
2、运行并测试
运行命令举例:java TestHarness.java max allocation 10 5 7
max
运行结果举例:
Input the number of process which has request (0to4):0
Input the number of resources the request need (3 kinds of resources, input like "1 1 1"):1 1 1
cusrtomer:0 Allocate resource:1 2 3
Release cusrtomer:0
Release cusrtomer:1
Release cusrtomer:4
Release cusrtomer:3
Release cusrtomer:2
The system is in a safe state.
绿色部分为用户输入部分,表示进程0申请资源情况为1 2 3。
黄色部分表示一种进程运行的顺序,并且当前系统处于一个安全的状态。
三、实验总结
通过这个实验,我对银行家算法有了进一步了解,明白了其工作机制和原理,对DeadLock的状态、判断有了深刻的认识。
这次实验,也锻炼了我java编写的能力。尤其是对程序大体框架、输入输出、数组运算、接口和类的编写有了更进一步的认识和提高。
最后,要感谢老师提供材料和课堂上理论的详细讲解,助教的热心帮助和指导。
附:源码(http://jcube.sjtu.edu.cn/f/G51FvGs7z5nN0d8rhttp://)大概有少许BUG,没空调了!!!谁比较闲,调好了记得通知我啊~~