admin 管理员组文章数量: 887018
银行家算法步骤:
(1)如果Requesti<or =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:
Available=Available-Request[i];
Allocation=Allocation+Request;
Need=Need-Request;
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
3、安全性算法步骤:
(1)设置两个向量
①工作向量Work。它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;
②布尔向量Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。
(2)从进程集合中找到一个能满足下述条件的进程:
①Finish[i]=false
②Need<or=Work
如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work=Work+Allocation;
Finish[i]=true;
转向步骤(2)。
(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。
上代码
import java.util.Scanner;
public class Banker {
private static int m;
private static int n;
private static int [] available;
private static int [][]max;
private static int [][]allocation;
private static int [][]need;
private static int []request;
static int count = 0;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
getDate();
newRequest();
}
private static void newRequest() {
// TODO Auto-generated method stub
request=new int[m];
Scanner reader=new Scanner(System.in);
int process;
System.out.println("请输入要请求资源的进程:从0开始");
process=reader.nextInt();
System.out.println("请输入请求的各个资源数目:");
for(int i=0;i<m;i++){
request[i]=reader.nextInt();
}
for(int i=0;i<m;i++){
if(request[i]>need[process][i])
newRequest();
}
for(int i=0;i<m;i++){
if(request[i]>available[i])
newRequest();
}
for(int i=0;i<m;i++){
available[i]-=request[i];
allocation[process][i]+=request[i];
need[process][i]-=request[i];
}
//执行安全性算法,判断资源分配后是否处于安全状态
check();
}
private static boolean check() {
// TODO Auto-generated method stub
int []work=new int[m];
int queue[] = new int[n];
int k=0;
work=available;
boolean []finish=new boolean[n];
for(int i=0;i<n;i++){
if(finish[i]==false){//need<=work
boolean is=true;
for(int j=0;j<m;j++){
if(need[i][j]>work[j]){
is=false;
break;
}
}
if(is){
for (int j = 0; j < work.length; j++) {
work[j] = work[j] + allocation[i][j];
}
finish[i]=true;
queue[k]=i;
k++;
i=-1;
}
}
}
for(int i=0;i<n;i++){
if(finish[i]==true){
count=count+1;}
}
if(count==n){
System.out.println("系统安全");
for(int i=0;i<n;i++) {
System.out.print("安全序列为"+queue[i]);
}
}
else if(count!=0){
System.out.println("系统不安全");
}
return false;
}
private static void getDate() {
// TODO Auto-generated method stub
System.out.println("请输入资源种类m:");
Scanner reader=new Scanner(System.in);
m=reader.nextInt();
System.out.println("请输入进程数目n");
n=reader.nextInt();
System.out.println("请输入各个资源的数目");
max=new int[n][m];
allocation=new int[n][m];
available=new int[m];
need=new int[n][m];
for(int i=0;i<m;i++){
available[i]=reader.nextInt();
}
for(int i=0;i<n;i++){
System.out.println("请输入第"+(i+1)+"最大需求资源数目:");
for(int j=0;j<m;j++){
max[i][j]=reader.nextInt();
}
}
for(int i=0;i<n;i++){
System.out.println("请输入第"+(i+1)+"进程已分配资源的数目:");
for(int j=0;j<m;j++){
allocation[i][j]=reader.nextInt();
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
need[i][j]=max[i][j]-allocation[i][j];
}
}
}
}
结果:
版权声明:本文标题:操作系统银行家算法(java实现) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1727376091h1110812.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论