资源分配和管理的银行家算法银行家算法实验报告.docx
- 文档编号:9968731
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:35
- 大小:780.67KB
资源分配和管理的银行家算法银行家算法实验报告.docx
《资源分配和管理的银行家算法银行家算法实验报告.docx》由会员分享,可在线阅读,更多相关《资源分配和管理的银行家算法银行家算法实验报告.docx(35页珍藏版)》请在冰豆网上搜索。
资源分配和管理的银行家算法银行家算法实验报告
《操作系统》实验报告
年级、专业、班级
姓名
实验题目
资源分配和管理的银行家算法
实验时间
2013.05.14
实验地点
主教0416
实验成绩
实验性质
□验证性□设计性□综合性
教师评价:
□算法/实验过程正确;□源程序/实验内容提交□程序结构/实验步骤合理;
□实验结果正确;□语法、语义正确;□报告规范;
其他:
评价教师签名:
一、实验目的
学习分配和管理资源的银行家算法,了解死锁避免方法。
二、实验项目内容
编写程序实现教材6.3.2节的银行家算法
程序功能:
1.程序随机生成进程数量(>10)、资源种类(>3)、每类资源总数量(>3)、进程的申请资源的数量(>0)、已分配资源的数量、可用资源数量等;
2.输出每一个进程的资源分配情况;
3.输出每一步的资源分配情况和进程执行序列(安全序列)。
4.指出每一次资源分配后系统是否处于安全状态。
三、实验过程或算法(源程序)
3.1算法思路:
先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。
若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。
若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
3.2银行家算法步骤
(1)如果Request[i]<=Need,则转向步骤
(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request[i]<=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:
Available=Available-Request[i];
Allocation=Allocation+Request;
Need=Need-Request;
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
3.3安全性算法步骤
(1)设置工作向量
①工作向量Work。
它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Available;
②定义判断一个进程是否执行完毕的方法:
booleanisFinished()。
(2)从进程集合中找到一个能满足下述条件的进程:
①process.isFinished()返回值为true.
②Need<=Work
如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work=Work+Allocation;
Allocation+=Need;
转向步骤
(2)。
(4)如果所有进程的均执行完毕即isAllFinished()返回值为true,则表示系统处于安全状态;否则,系统处于不安全状态。
3.4数据结构:
3.4.1主要用到的数据结构:
(1)保存进程最大资源需求量的矩阵:
int[]_maxNeed
(2)保存进程已分配资源量的矩阵:
int[]_allocated
(3)保存进程标识符的字符串:
String_id
(4)保存系统中各资源总数的矩阵:
int[]_totalResource
(5)表示申请资源的进程队列:
ArrayList
(6)表示系统资源种类数的整数:
int_resourceClassCount
(7)存储执行信息:
StringBuffer_executeInfo
3.4.2程序模块:
代表进程的类:
Process.java
代表银行家算法的类:
BankerAlgorithm.java
算法的主界面:
BankerUI.java
3.4.3各模块间的调用关系:
BankerUI是程序执行的主界面,输入系统资源种类数之后,其通过程序随机生成进程数量(>10)、资源种类(>3)、每类资源总数量(>3)、进程的申请资源的数量(>0)、已分配资源的数量、可用资源数量等。
其中所用针对系统进程和资源的操作均需要调用类BankerAlgorithm的方法。
3.5主要函数的核心代码:
1.进行初始化输入的函数
2.打印输出的函数
3.利用安全性算法进行检测的函数
4.进行资源分配的函数
5.利用行家算法进行判定的函数
注:
具体代码请见附录—源程序清单。
程序流程图:
1、系统主要过程流程图:
2、进程请求资源序列图
3、安全性算法序列图
四、实验结果及分析和(或)源程序调试过程
4.1主界面:
4.2点击“随机生成”按钮,随机生成进程数量(>10)、资源种类(>3)、每类资源总数量(>3)、进程的申请资源的数量(>0)、已分配资源的数量、可用资源数量,并向系统中添加进程,显示进程的资源分配情况。
4.3点击“分配资源”按钮,检查系统是否安全,如果当前系统安全,则输出安全队列,并给第一个安全进程分配资源。
若安全:
若不安全,则“执行结果”提示框会提示:
4.4点击“执行进程”按钮,执行已经分配资源的进程,并将其从队列中移除。
4.5点击“分配资源”按钮,重新检测当前系统的安全,如果当前系统安全,则输出安全队列,并给第一个安全进程分配资源。
4.6此后重复4、5步,直至系统中的进程执行完毕:
4.7系统中此时已没有等待执行的进程,若再点击“分配资源”按钮,则“执行结果”提示框中会提示:
4.8如果需要再进行模拟,则点击“重新生成”按钮,会重新生成进程,再重复前7步即可。
4.9如果模拟结束,可点击“退出”按钮,即可退出系统。
模拟结束。
五、心得体会
通过本次实验,我们对银行家算法有了更深的了解,理解了操作系统关于进程调度的一些方法,并通过编程实现了该算法。
也进一步提高了我们的编程能力,从中学会了很多。
附录:
源程序清单
1.主界面类BankerUI.java
publicclassBankerUIextendsJFrameimplementsActionListener{
privatestaticfinallongserialVersionUID=-8004544916653049326L;
privateJPanelpanel;
privateJButtonmodel;
privateJButtonalloc;
privateJButtonnext;
privateJButtonexit;
privateJTextFieldprocessNum;
//center
privateJEditorPaneresourcesInfo;
privateJEditorPaneprocessesInfo;//用html格式显示进程需要资源个数.
privateJTextArearesult;
privateJSplitPanesplitCenter;
privateJPaneleast;
privateintresourceClassesCount;//表示资源的个数
privateBankerAlgorithmbanker;
//privateProcesspro;
privateintPronum=0;
privateintSournum=0;
staticint[]available=null;//可利用的资源
staticint[][]max=null;//最大的需求矩阵
staticint[][]allocation=null;//分配矩阵
staticint[][]need=null;//需求矩阵
staticint[]totalSour=null;
staticint[]Max=null;
staticint[]Allocation=null;
publicBankerUI(){
super("银行家算法");
try{
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}catch(InstantiationExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}catch(UnsupportedLookAndFeelExceptione){
e.printStackTrace();
}
setBounds(100,100,800,600);
panel=newJPanel(newBorderLayout());
//center
resourcesInfo=newJEditorPane("text/html","");
resourcesInfo.setEditable(false);
processesInfo=newJEditorPane("text/html","");//以html格式显示进程信息.
processesInfo.setEditable(false);
JSplitPanesplitInfo=newJSplitPane(JSplitPane.VERTICAL_SPLIT);
splitInfo.add(newJScrollPane(resourcesInfo),JSplitPane.TOP);
splitInfo.add(newJScrollPane(processesInfo),JSplitPane.BOTTOM);
splitInfo.setBorder(BorderFactory.createTitledBorder("系统信息"));
splitInfo.setOneTouchExpandable(true);
result=newJTextArea(5,30);
result.setEditable(false);
result.setWrapStyleWord(true);//按单词换行,即所有单词都不会打断.
result.setLineWrap(true);//换行.
JScrollPanetextScroll=newJScrollPane(result);
textScroll.setBorder(BorderFactory.createTitledBorder("执行结果"));
splitCenter=newJSplitPane(JSplitPane.VERTICAL_SPLIT);
splitCenter.setResizeWeight(1.0);
splitCenter.add(splitInfo,JSplitPane.TOP);
splitCenter.add(textScroll,JSplitPane.BOTTOM);
splitCenter.setOneTouchExpandable(true);//点击一下就可以扩展分割开来的控件.
panel.add(splitCenter,BorderLayout.CENTER);
panel.setSize(800,700);
//east
east=newJPanel();
//east.setSize(60,100);
model=newJButton("随机生成");
model.setSize(50,20);
model.setLocation(10,10);
model.addActionListener(this);
alloc=newJButton("分配资源");
alloc.addActionListener(this);
next=newJButton("执行进程");
next.addActionListener(this);
exit=newJButton("退出");
exit.addActionListener(this);
JLabellabel=newJLabel("当前进程个数:
");
label.setSize(50,20);
label.setLocation(10,60);
processNum=newJTextField();
processNum.setSize(50,20);
processNum.setLocation(10,90);
processNum.setEditable(false);
processNum.setFont(newFont("宋体",Font.BOLD,20));
processNum.setForeground(Color.RED);
processNum.setHorizontalAlignment(JTextField.CENTER);
east.setLayout(newGridLayout(10,1,10,10));
east.setSize(80,100);
east.add(label);
east.add(processNum);
east.add(model);
east.add(alloc);
east.add(next);
east.add(exit);
panel.add(east,BorderLayout.EAST);
setEastButtonEnabled(false);
//this.getContentPane().add(newJScrollPane(panel));
this.getContentPane().add(panel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
publicvoidsetEastButtonEnabled(booleanb){
//east
alloc.setEnabled(b);
next.setEnabled(b);
}
publicBankerAlgorithmgetBanker(){
returnbanker;
}
//一个数组小于另一个数组,两个数组大小相等.
publicbooleanaLowerB(int[]a,int[]b){
for(inti=0;i if(a[i]>b[i]) returnfalse; } returntrue; } //在resourceInfoz中显示系统资源的信息. privatevoidupdateTotalResourcesInfo(){ StringBufferhtml=newStringBuffer(100); html.append("
html.append("
StringBufferresourceNames=newStringBuffer("
StringBufferresourceCounts=newStringBuffer("
//int[]totalResource=banker.getTotalResource();
for(inti=0;i resourceNames.append(" resourceNames.append("R"+String.valueOf(i)); resourceNames.append(""); ");
resourceCounts.append("
resourceCounts.append(String.valueOf(totalSour[i]));
resourceCounts.append("
}
resourceNames.append("
resourceCounts.append("");
html.append(resourceNames);
html.append(resourceCounts);
html.append("\n\n");
resourcesInfo.setText(html.toString());
}
privatevoidupdateProcessInfo(){
StringBuffercontent=newStringBuffer("\n");
content.append("
\n");content.append("
content.append("
+Sournum
+">Max +Sournum +">Allocated +Sournum +">Need +Sournum+">Avilable
content.append("
content.append("
StringBufferprocessNames=newStringBuffer(40);
for(inti=0;i processNames.append("R"+i+" ");
}
content.append(processNames);//Max
content.append(processNames);//Allocated
content.append(processNames);//Need
content.append(processNames);//Avilable
content.append("
ArrayList
//System.out.println("pppp"+processes.size());
for(inti=0;i Processp=processes.get(i); content.append(" if(i==0){ int[]avilable=banker.getAvilable(); for(intj=0;j content.append(" } if(i==1) content.append(" +String.valueOf(processes.size()-1) +"colspan=\"3\">"); content.append(""+p.makeHtml()); ");"+avilable[j]+" ");
}
content.append("\n");
content.append("\n");
content.append("");
processesInfo.setText(content.toString());
processNum.setText(""+Pronum);
}
@Override
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==model){
RandomMake();
banker=newBankerAlgorithm(totalSour,Sournum,newArrayList
for(inti=0;i Max=newint[Sournum]; Allocation=newint[Sournum]; for(intj=0;j Max[j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 资源 分配 管理 银行家 算法 实验 报告