?? table.java
字號:
package algo;
/*
*record the processes and resources information
*Table with a Method:
*setData() it can set all value for the Table object
*securityExam() if Table object suit for the "Algorithms of Banker"
*
**/
public class Table implements Resource{
int m=kinds;//kind of resource
int n ;//prcocess numbel
public int[] stack;//用于存放安全序列
process pro[];
int[] Avaliable=new int[kinds];
int[][][] matrix;
boolean value=false;
/*構(gòu)造方法
**/
public Table(process[] proce){
this.pro=proce;
n=proce.length;
matrix=new int[n][3][m];
setAvaliable();
}
/*Method
*setdata()
*為表賦值
**/
public void setdata(){
for(int i=0;i<n;i++){
for(int j=0;j<3;j++){
matrix[i][0][j]=pro[i].Max[j];
matrix[i][1][j]=pro[i].Allocation[j];
matrix[i][2][j]=pro[i].Need[j];
}
}
}
public boolean securityExam(){
int mark=n;
Exam(mark);
return value;
}
/*Method
*Exam(int mark)
*mark:標志遞歸次數(shù)(n--->0)
*value:如果表沒有安全序列,設value為false
*none:在一次檢查中如果有進程可以運行,none為false否則為true
**/
public void Exam(int mark){
if(mark<=0){ ///如果檢查完畢
value=true; //存在安全序列;
sort();
return; ///停止檢查
}
boolean none=true; ///初始本次無進程可運行
for(int i=0;i<n;i++){
if(pro[i].prime<mark){ //如果這個進程沒有檢查過
if(isEnough(pro[i])){ //如果可以分配給這個進程
System.out.print(pro[i].name+"可執(zhí)行");
Test.ava();
pro[i].prime=mark; //設這個進程的優(yōu)先級為mark
mark=mark-1; //mark遞減一
release(pro[i]);
Test.chart();//顯示結(jié)果
none=false; //在本輪檢查中找到一個可執(zhí)行進程
// System.out.println("找到一個可執(zhí)行進程");
}
}
}
/*
*如果在本輪檢查中沒有可執(zhí)行進程
*退出檢查,不存在安全序列
*否則進入下輪檢查
**/
if(none==true){
value=false;
return;
}
else{
//System.out.println("找下一個可執(zhí)行進程");
Exam(mark);
}
}//end of Exam()
/*Method
*isEnough(process p)
*如果進程p能夠在當前執(zhí)行返回true
*Avaliable[];所有資源的可用值
**/
public boolean isEnough(process p){
int n=Avaliable.length;
boolean value=true;
// setAvaliable();
//Test.ava();
for(int i=0;i<n;i++){
value=value&&(p.Need[i]<=Avaliable[i]);
}
return value;
}
/*Method
*release(process p)
*釋放進程P所占有的資源
**/
public void release(process p){
for(int i=0;i<kinds;i++){
Avaliable[i]+=p.Allocation[i];
p.Allocation[i]=0;
p.Max[i]=0;
p.Need[i]=0;
}
// setAvaliable();
}//end of release
/*Method
*sort()
*為pro[]安優(yōu)先級排序
*采用了插入排序
**/
public void sort(){
int in,out;
for(out=1;out<n;out++){
process temp=pro[out];
in=out;
while(in>0&&pro[in-1].prime>=temp.prime){
pro[in]=pro[in-1];
in--;
}
pro[in]=temp;
}//end for
}//end sort()
public void setAvaliable(){
int[] temp=new int[kinds];
for(int i=0;i<kinds;i++){
for(int j=0;j<n;j++){
temp[i]+=pro[j].Allocation[i];
}
}
for(int i=0;i<kinds;i++){
Avaliable[i]=Total[i]-temp[i];
}
}
}//end of class Table
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -