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,沒空調了!!!誰比較閒,調好了記得通知我啊~~