实验一 进程管理与进程同步
实验目的:
了解进程管理的实现方法,理解和掌握处理进程同步问题的方法。
实验内容:
实现银行家算法、进程调度过程的模拟、读者-写者问题的写者优先算法。
实验步骤:
1.银行家算法流程图
(1)初始化函数init()
(2)银行家算法Banker()
(3)安全性算法safe()
2.银行家算法代码和运行效果图
(1)银行家算法完整代码
//自己设置package
import java.util.Scanner;
//银行家算法
public class Banker {
Scanner sc=null;
int resNum=0;
int proNum=0;
int res[]=null;
int[][]max=null;
int[][]allocation=null;
int[][]need=null;
int []available=null;
void init() {
sc=new Scanner(System.in);
System.out.println("输入资源的种类数");
resNum=sc.nextInt();
System.out.println("输入进程的数量");
proNum=sc.nextInt();
res=new int[resNum];{
System.out.println("请分别输入系统"+resNum+"类资源数量:");
for(int i=0;i<resNum;i++) {
res[i]=sc.nextInt();
}
}
max=new int[proNum][resNum];{
System.out.println("请分别输入"+proNum+"个进程所需的"+resNum+"类资源的最大需求数量:");
for(int j=0;j<proNum;j++) {
for(int k=0;k<resNum;k++) {
max[j][k]=sc.nextInt();
}
}
}
allocation=new int[proNum][resNum];{//已分配
System.out.println("请分别输入"+proNum+"个进程,"+resNum+"类资源的已分配情况:");
for(int l=0;l<5;l++) {
for(int m=0;m<resNum;m++) {
allocation[l][m]=sc.nextInt();
}
}
}
need=new int[proNum][resNum];{
for(int o=0;o<proNum;o++) {
for(int p=0;p<resNum;p++) {
need[o][p]=max[o][p]-allocation[o][p];
}
}
}
available=new int[resNum];{
for(int i=0;i<resNum;i++) {
for(int j=0;j<proNum;j++) {
res[i]=res[i]-allocation[j][i];
}
available[i]=res[i];
}
}
}
void showData() {
String s="";
for(int i=0;i<resNum;i++)
s=s+"\t";
System.out.print("进程号"+"\t"+"Max"+s+"All"+s+" Need"+s+"Avai");
System.out.println();
System.out.print("\t");
for(int j=0;j<4;j++) {
for(int i=0;i<resNum;i++) {
System.out.print((char)('A'+i)+"\t");
}
}
System.out.println();
for(int i = 0;i<proNum;i++){
System.out.print("P"+i+"\t");
for(int m = 0;m<resNum;m++) System.out.print(max[i][m]+"\t");
for(int m = 0;m<resNum;m++) System.out.print(allocation[i][m]+"\t");
for(int m = 0;m<resNum;m++) System.out.print(need[i][m]+"\t");
if(i==0) for(int m = 0;m<resNum;m++) System.out.print(available[m]+"\t");
System.out.println();
}
}
boolean change(int inRequestNum,int inRequest[])
{
int requestNum = inRequestNum;
int request[] = inRequest;
System.out.println();
boolean f1=true;
for(int i=0;i<resNum;i++) {
f1=f1&request[i]<=need[requestNum][i];
if(!f1) {
System.out.print("<===P"+inRequestNum+"进程不满足,Request(");
for(int j=0;j<resNum;j++) {
System.out.print(inRequest[j]);
if(j<resNum-1)
System.out.print(",");
}
System.out.print(")<=Need(");
for(int j=0;j<resNum;j++) {
System.out.print(need[requestNum][j]);
if(j<resNum-1)
System.out.print(",");
}
System.out.println("),分配错误!===>");
return false;
}
}
boolean f2=true;
for(int i=0;i<resNum;i++) {
f2=f2&request[i]<=available[i];
if(!f2) {
System.out.print("<===P"+inRequestNum+"进程不满足,Request(");
for(int j=0;j<resNum;j++) {
System.out.print(inRequest[i]);
if(j<resNum-1)
System.out.print(",");
}
System.out.print(")<=Available(");
for(int j=0;j<resNum;j++) {
System.out.print(available[i]);
if(j<resNum-1)
System.out.print(",");
}
System.out.println("),分配错误!===>");
return false;
}
}
for(int i = 0;i<resNum;i++)
{
available[i] = available[i]-request[i];
allocation[requestNum][i] = allocation[requestNum][i] + request[i];
need[requestNum][i] = need[requestNum][i] - request[i];
}
System.out.println("<===安全性检查前的资源分配表===>");
showData();
boolean flag = checkSafe(available);
if(flag==true)
{
System.out.println("<===通过安全性算法,能够安全分配!===>");
System.out.println("<===通过安全性算法的资源分配表!===>");
showData();
return true;
}
else
{
for(int i = 0;i<3;i++)
{
available[i] = available[i]+request[i];
allocation[requestNum][i] = allocation[requestNum][i] - request[i];
need[requestNum][i] = need[requestNum][i] + request[i];
}
System.out.println("<===未通过安全性算法,不能够安全分配!===>");
System.out.println("<===未通过安全性算法的资源分配表!===>");
showData();
return false;
}
}
boolean checkSafe(int res[])
{
int work[] = new int[resNum] ;
for(int i=0 ;i<resNum;i++) {
work[i]=res[i];
}
int i=0;
String [] str=new String[proNum];
int x=0;
boolean finish[] = new boolean[proNum] ;
for(int j=0;j<proNum;j++)
finish[j]=false;
System.out.println("<======进行安全性算法======>");
while(i<proNum)
{
boolean f3=true;
f3=f3&(finish[i]==false);
for(int j=0;j<resNum;j++) {
f3=f3&(need[i][j]<=work[j]);
}
if(f3)
{
System.out.println("---P"+i+"进程成功分配---");
if(x<proNum-1) {
str[x]="P"+i+"->";
}
else {
str[x]="P"+i;
}
x++;
for(int m = 0;m<resNum;m++)
work[m] =work[m] + allocation[i][m];
finish[i] = true;
i=0;
}
else
i++;
}
for(i=0;i<proNum;i++)
{
if(finish[i]==false)
return false;
}
System.out.println("安全序列为:");
for(int j=0;j<str.length;j++) {
System.out.print(str[j]);
}
System.out.println();
return true;
}
public static void main(String[] args)
{
Banker bank = new Banker();
bank.init();
System.out.println("===资源分配表===");
bank.showData();
int request[] =new int[bank.resNum];
int requestNum;
String source[] = new String[bank.resNum];
for(int i=0;i<bank.resNum;i++) {
source[i]=((char)('A'+i))+"";
}
Scanner s = new Scanner(System.in);
String choice = new String();
while(true)
{
System.out.println("请输入要请求的进程号(P0--P"+(bank.proNum-1)+"):");
requestNum = s.nextInt();
System.out.println("请输入请求的资源数目");
for(int i = 0;i<bank.resNum;i++)
{
System.out.print("请求"+source[i]+"资源的数目:");
request[i] = s.nextInt();
}
bank.change(requestNum, request);
System.out.println("提示:是否再请求分配(y/n)");
choice = s.next();
if(choice.equals("n")) {
System.out.println("提示:谢谢使用,再见!");
break;
}
}
s.close();
bank.sc.close();
}
}
(2)init()初始化信息效果图
图1 init初始化信息
(3)P1进程申请(1,0,1)资源,进行银行家算法和安全性检查。成功分配。
图2 P1进程申请资源
(4)P3进程申请(2,1,1)资源,进行银行家算法和安全性检查。未通过分配,不满足request小于need。
图3 P3进程申请资源
(4)P0进程申请(2,3,1)资源,进行银行家算法和安全性检查。未通过安全性算法 。
图4 P0进程申请资源
(5)输入n,退出系统。
图5 退出系统