如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work=Work+Allocation;
Finish[i]=true;
转向步骤
(2)。
(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。
4、流程图:
系统主要过程流程图
银行家算法流程图
安全性算法流程图
5、主要数据结构
假设有M个进程N类资源,则有如下数据结构:
intmax[M*N]M个进程对N类资源的最大需求量
intavailable[N]系统可用资源数
intallocated[M*N]M个进程已经得到N类资源的资源量
intneed[M*N]M个进程还需要N类资源的资源量
intworked[]系统提供给进程继续运行所需的各类资源数目
四、源代码
importjava.awt.*;
importjavax.swing.*;
importjava.util.*;
importjava.awt.event.*;
importjavax.swing.border.*;
publicclassOsBankerextendsJFrame{//界面设计
JLabellabelInfo;
JLabellabelInfo1;
intresourceNum,processNum;
intcount=0;
JButtonbuttonRequest,buttonSetInit,button,button1,buttonsearch,button2;
JTextFieldtf1,tf2;
JTextField[]textAvailable;
JTextField[][]textAllocation;
JTextField[][]textNeed;
JTextFieldtextProcessName;
JTextField[]textRequest;
intavailable[];
intmax[][];
intneed[][];
intallocated[][];
intSafeSequence[];
intrequest[];
booleanFinish[];
intworked[];
booleanflag=false;
JFramef1;
JFramef2;
JFramef3;
JTextAreajt;
voiddisplay(){
Borderborder=BorderFactory.createLoweredBevelBorder();
BorderborderTitled=BorderFactory.createTitledBorder(border,"按钮区");
textAvailable=newJTextField[5];
textAllocation=newJTextField[6][5];
textNeed=newJTextField[6][5];
textProcessName=newJTextField("");
textProcessName.setEnabled(false);
textRequest=newJTextField[5];
tf1=newJTextField(20);
tf2=newJTextField(20);
labelInfo=newJLabel("请先输入资源个数和进程个数(1~6),后单击确定");
JPanelcontentPane;
contentPane=(JPanel)this.getContentPane();
contentPane.setLayout(null);
contentPane.setBackground(Color.pink);
labelInfo.setBounds(50,10,300,40);
labelInfo.setOpaque(true);
labelInfo.setForeground(Color.red);
labelInfo.setBackground(Color.pink);
contentPane.add(labelInfo,null);
JLabelb1=newJLabel("资源个数:
");
b1.setForeground(Color.blue);
JLabelb2=newJLabel("进程个数:
");
b2.setForeground(Color.blue);
b1.setBounds(50,80,80,30);
contentPane.add(b1,null);
tf1.setBounds(180,80,170,30);
contentPane.add(tf1,null);
b2.setBounds(50,150,80,30);
contentPane.add(b2,null);
tf2.setBounds(180,150,170,30);
contentPane.add(tf2,null);
button1=newJButton("确定");
button=newJButton("重置");
button1.setBounds(80,200,80,30);
contentPane.add(button1,null);
button.setBounds(220,200,80,30);
contentPane.add(button,null);
this.setSize(400,300);
this.setResizable(false);
this.setTitle("银行家算法(SXJ)");
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
f1=newJFrame();
labelInfo1=newJLabel("请先输入最大需求和分配矩阵,然后单击初始化");
JPanelcontentPane1;
contentPane1=(JPanel)f1.getContentPane();
contentPane1.setLayout(null);
contentPane1.setBackground(Color.pink);
labelInfo1.setOpaque(true);
labelInfo1.setBounds(75,10,400,40);
labelInfo1.setBackground(Color.pink);
labelInfo1.setForeground(Color.blue);
contentPane1.add(labelInfo1,null);
JLabellabelAvailableLabel=newJLabel("AllResource:
");
JLabellabelNeedLabel=newJLabel("MaxNeed:
");
JLabellabelAllocationLabel=newJLabel("allocated:
");
JLabellabelRequestLabel=newJLabel("requestprocess:
");
labelNeedLabel.setBounds(75,90,100,20);
//x,y,width,height
contentPane1.add(labelNeedLabel,null);
labelAllocationLabel.setBounds(75,240,100,20);
contentPane1.add(labelAllocationLabel,null);
labelAvailableLabel.setBounds(75,70,100,20);
contentPane1.add(labelAvailableLabel,null);
labelRequestLabel.setBounds(75,400,100,20);
contentPane1.add(labelRequestLabel,null);
JLabel[]labelProcessLabel1={newJLabel("进程1"),newJLabel("进程2"),
newJLabel("进程3"),newJLabel("进程4"),newJLabel("进程5"),
newJLabel("进程6")};
JLabel[]labelProcessLabel2={newJLabel("进程1"),newJLabel("进程2"),
newJLabel("进程3"),newJLabel("进程4"),newJLabel("进程5"),
newJLabel("进程6")};
JPanelpPanel1=newJPanel(),pPanel2=newJPanel(),pPanel3=newJPanel(),pPanel4=newJPanel();
pPanel1.setLayout(null);
pPanel2.setLayout(null);
/*
*pPanel4.setLayout(null);pPanel4.setBounds(440,120,90,270);
*pPanel4.setBorder(borderTitled);
*/
buttonSetInit=newJButton("初始化");
buttonsearch=newJButton("检测安全性");
button2=newJButton("重置");
buttonRequest=newJButton("请求资源");
buttonSetInit.setBounds(420,140,100,30);
contentPane1.add(buttonSetInit,null);
buttonsearch.setBounds(420,240,100,30);
contentPane1.add(buttonsearch,null);
button2.setBounds(420,340,100,30);
contentPane1.add(button2,null);
buttonRequest.setBounds(420,425,100,30);
contentPane1.add(buttonRequest,null);
for(intpi=0;pi<6;pi++){
labelProcessLabel1[pi].setBounds(0,0+pi*20,60,20);
labelProcessLabel2[pi].setBounds(0,0+pi*20,60,20);
}
pPanel1.setBounds(75,120,60,120);
pPanel2.setBounds(75,270,60,120);
for(intpi=0;pi<6;pi++){
pPanel1.add(labelProcessLabel1[pi],null);
pPanel2.add(labelProcessLabel2[pi],null);
}
contentPane1.add(pPanel1);
contentPane1.add(pPanel2);
contentPane1.add(pPanel4);
for(intsi=0;si<5;si++)
for(intpi=0;pi<6;pi++){
textNeed[pi][si]=newJTextField();
textNeed[pi][si]
.setBounds(150+si*50,120+pi*20,50,20);
textNeed[pi][si].setEditable(false);
textAllocation[pi][si]=newJTextField();
textAllocation[pi][si].setBounds(150+si*50,270+pi*20,
50,20);
textAllocation[pi][si].setEditable(false);
}
for(intsi=0;si<5;si++){
textAvailable[si]=newJTextField();
textAvailable[si].setEditable(false);
textAvailable[si].setBounds(150+si*50,70,50,20);
textRequest[si]=newJTextField();
textRequest[si].setEditable(false);
textRequest[si].setBounds(150+si*50,430,50,20);
contentPane1.add(textAvailable[si],null);
contentPane1.add(textRequest[si],null);
}
for(intpi=0;pi<6;pi++)
for(intsi=0;si<5;si++){
contentPane1.add(textNeed[pi][si],null);
contentPane1.add(textAllocation[pi][si],null);
}
textProcessName.setBounds(80,430,50,20);
contentPane1.add(textProcessName,null);
f1.setSize(550,500);
f1.setResizable(false);
f1.setTitle("银行家算法(SXJ)");
f1.setLocationRelativeTo(null);
f1.setDefaultCloseOperation(EXIT_ON_CLOSE);
//f1.setVisible(true);
f1.setVisible(false);
f2=newJFrame("安全序列显示框");
jt=newJTextArea(75,40);
jt.setBackground(Color.pink);
jt.setForeground(Color.blue);
JScrollPanescrollPane=newJScrollPane(jt);//加滚动条
scrollPane.setBorder(BorderFactory.createLoweredBevelBorder());//边界
(f2.getContentPane()).add(scrollPane);
f2.setSize(450,400);
f2.setResizable(false);
f2.setDefaultCloseOperation(EXIT_ON_CLOSE);
f2.setVisible(false);
buttonSetInit.setEnabled(false);
buttonRequest.setEnabled(false);
buttonsearch.setEnabled(false);
button1.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
//labelInfo.setText("请先初始化allocated和Maxneed,后单击初始化按钮");
f1.setVisible(true);
buttonSetInit.setEnabled(true);
resourceNum=Integer.parseInt(tf1.getText());
processNum=Integer.parseInt(tf2.getText());
for(inti=0;ifor(intj=0;jtextNeed[i][j].setEditable(true);
textAllocation[i][j].setEditable(true);
textAvailable[j].setEditable(true);
}
}
}
});
buttonSetInit.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
Init();
buttonsearch.setEnabled(true);
}
});
buttonsearch.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
count=0;
SafeSequence=newint[processNum];
worked=newint[resourceNum];
Finish=newboolean[processNum];
copyVector(worked,available);
Safety(0);
jt.append("安全序列数量:
"+count);
if(flag){
labelInfo1.setText("当前系统状态:
安全");
f2.setVisible(true);
buttonRequest.setEnabled(true);
textProcessName.setEnabled(true);
for(inti=0;itextRequest[i].setEditable(true);
}
}else{
labelInfo1.setText("当前系统状态:
不安全");
}
buttonSetInit.setEnabled(false);
}
});
buttonRequest.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
count=0;
for(inti=0;iFinish[i]=false;
}
jt.setText("");
flag=false;
RequestResource();
}
});
button2.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
/*
*tf1.setText("");tf2.setText("");
*/
f2.setVisible(false);
jt.setText("");
for(inti=0;ifor(intj=0;jtextNeed[i][j].setText("");
textAllocation[i][j].setText("");
textAvailable[j].setText("");
textRequest[j].setText("");
//textNeed[i][j].setEditable(false);
//textAllocation[i][j].setEditable(false);
//textAvailable[j].setEditable(false);
textRequest[j].setEditable(false);
textProcessNa