下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 计算机操作系统实验报告题 目 利用银行家算法避免死锁一、 实验目的: 1、加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 2、要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。2、 实验容:用银行家算法实现资源分配: 设计五个进程p0,p1,p2,p3,p4共享三类资源A,B,C的系统,例如,A,B,C的资源数量分别为10,5,7。进程可动态地申请资源和释放资源,系统按进程的申请动态地分配资源,要求程序具有显示和打印各进程的某一个时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号
2、以及为某进程分配资源后的有关资源数据。3、 问题分析与设计:1、算法思路:先对用户提出的请求进行合法性检查,即检查请否大于需要的,是否大于可利用的。若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。2、银行家算法步骤:(1)如果Requestior =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。 (2)如果Requestor=Available,则转向步骤(3);否则,表示系统无足够的资源,进程必须等待。 (3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数
3、值: Available=Available-Requesti; Allocation=Allocation+Request; Need=Need-Request; (4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。3、安全性算法步骤:(1)设置两个向量工作向量Work。它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;布尔向量Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finishi=false,
4、当有足够资源分配给进程时,令Finishi=true。(2)从进程集合中找到一个能满足下述条件的进程:Finishi=falseNeed<or=Work 如找到,执行步骤(3);否则,执行步骤(4)。(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work=Work+Allocation; Finishi=true; 转向步骤(2)。(4)如果所有进程的Finishi=true,则表示系统处于安全状态;否则,系统处于不安全状态。4、流程图:系统主要过程流程图银行家算法流程图安全性算法流程图5、主要数据结构 假设有M个进程N类资源,则有如下数据结构:in
5、t maxM*N M个进程对N类资源的最大需求量int availableN 系统可用资源数int allocatedM*N M个进程已经得到N类资源的资源量int needM*N M个进程还需要N类资源的资源量int worked 系统提供给进程继续运行所需的各类资源数目4、 源代码import java.awt.*;import javax.swing.*;import java.util.*;import java.awt.event.*;import javax.swing.border.*;public class OsBanker extends JFrame / 界面设计JLab
6、el labelInfo;JLabel labelInfo1;int resourceNum, processNum;int count = 0;utton buttonRequest, buttonSetInit, button, button1, buttonsearch,button2;JTextField tf1, tf2;JTextField textAvailable;JTextField textAllocation;JTextField textNeed;JTextField textProcessName;JTextField textRequest;int availabl
7、e;int max;int need;int allocated;int SafeSequence;int request;boolean Finish;int worked;boolean flag = false;JFrame f1;JFrame f2;JFrame f3;JTextArea jt;void display() Border border = BorderFactory.createLoweredBevelBorder();Border borderTitled = BorderFactory.createTitledBorder(border, "按钮区&quo
8、t;);textAvailable = new JTextField5;textAllocation = new JTextField65;textNeed = new JTextField65;textProcessName = new JTextField("");textProcessName.setEnabled(false);textRequest = new JTextField5;tf1 = new JTextField(20);tf2 = new JTextField(20);labelInfo = new JLabel("请先输入资源个数和进程个
9、数(16),后单击确定");JPanel contentPane;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(l
10、abelInfo, null);JLabel b1 = new JLabel("资源个数:");b1.setForeground(Color.blue);JLabel b2 = new JLabel("进程个数:");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
11、);contentPane.add(b2, null);tf2.setBounds(180, 150, 170, 30);contentPane.add(tf2, null);button1 = new utton("确定");button = new utton("重置");button1.setBounds(80, 200, 80, 30);contentPane.add(button1, null);button.setBounds(220, 200, 80, 30);contentPane.add(button, null);this.setSi
12、ze(400, 300);this.setResizable(false);this.setTitle("银行家算法(SXJ)");this.setLocationRelativeTo(null);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setVisible(true);f1 = new JFrame();labelInfo1 = new JLabel("请先输入最大需求和分配矩阵,然后单击初始化");JPanel contentPane1;contentPane1 = (JPanel) f1.
13、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);JLabel labelAvailableLabel = new JLabel(&
14、quot;AllResource:");JLabel labelNeedLabel = new JLabel("MaxNeed:");JLabel labelAllocationLabel = new JLabel("allocated:");JLabel labelRequestLabel = new JLabel("request process:");labelNeedLabel.setBounds(75, 90, 100, 20);/ x,y,width,heightcontentPane1.add(labelNee
15、dLabel, 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 labelP
16、rocessLabel1 = new JLabel("进程1"), new JLabel("进程2"),new JLabel("进程3"), new JLabel("进程4"), new JLabel("进程5"),new JLabel("进程6") ;JLabel labelProcessLabel2 = new JLabel("进程1"), new JLabel("进程2"),new JLabel("进程3"),
17、 new JLabel("进程4"), new JLabel("进程5"),new JLabel("进程6") ;JPanel pPanel1 = new JPanel(), pPanel2 = new JPanel(), pPanel3 = new JPanel(), pPanel4 = new JPanel();pPanel1.setLayout(null);pPanel2.setLayout(null);/* * pPanel4.setLayout(null); pPanel4.setBounds(440,120,90,270)
18、; * pPanel4.setBorder(borderTitled); */buttonSetInit = new utton("初始化");buttonsearch = new utton("检测安全性");button2 = new utton("重置");buttonRequest = new utton("请求资源");buttonSetInit.setBounds(420, 140, 100, 30);contentPane1.add(buttonSetInit, null);buttonsearch.
19、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 (int pi = 0; pi < 6; pi+) labelProcessLabel1pi.setBounds(0, 0 + pi * 20, 60,
20、20);labelProcessLabel2pi.setBounds(0, 0 + pi * 20, 60, 20);pPanel1.setBounds(75, 120, 60, 120);pPanel2.setBounds(75, 270, 60, 120);for (int pi = 0; pi < 6; pi+) pPanel1.add(labelProcessLabel1pi, null);pPanel2.add(labelProcessLabel2pi, null);contentPane1.add(pPanel1);contentPane1.add(pPanel2);cont
21、entPane1.add(pPanel4);for (int si = 0; si < 5; si+)for (int pi = 0; pi < 6; pi+) textNeedpisi = new JTextField();textNeedpisi.setBounds(150 + si * 50, 120 + pi * 20, 50, 20);textNeedpisi.setEditable(false);textAllocationpisi = new JTextField();textAllocationpisi.setBounds(150 + si * 50, 270 +
22、pi * 20,50, 20);textAllocationpisi.setEditable(false);for (int si = 0; si < 5; si+) textAvailablesi = new JTextField();textAvailablesi.setEditable(false);textAvailablesi.setBounds(150 + si * 50, 70, 50, 20);textRequestsi = new JTextField();textRequestsi.setEditable(false);textRequestsi.setBounds(
23、150 + si * 50, 430, 50, 20);contentPane1.add(textAvailablesi, null);contentPane1.add(textRequestsi, null);for (int pi = 0; pi < 6; pi+)for (int si = 0; si < 5; si+) contentPane1.add(textNeedpisi, null);contentPane1.add(textAllocationpisi, null);textProcessName.setBounds(80, 430, 50, 20);conten
24、tPane1.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 = new JFrame("安全序列显示框");jt = new JTextArea(75, 40);jt.se
25、tBackground(Color.pink);jt.setForeground(Color.blue);JScrollPane scrollPane = new JScrollPane(jt); / 加滚动条scrollPane.setBorder(BorderFactory.createLoweredBevelBorder();/ 边界(f2.getContentPane().add(scrollPane);f2.setSize(450, 400);f2.setResizable(false);f2.setDefaultCloseOperation(EXIT_ON_CLOSE);f2.se
26、tVisible(false);buttonSetInit.setEnabled(false);buttonRequest.setEnabled(false);buttonsearch.setEnabled(false);button1.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) / labelInfo.setText("请先初始化allocated和Maxneed,后单击初始化按钮");f1.setVisible(true);buttonSetInit.
27、setEnabled(true);resourceNum = Integer.parseInt(tf1.getText();processNum = Integer.parseInt(tf2.getText();for (int i = 0; i < processNum; i+) for (int j = 0; j < resourceNum; j+) textNeedij.setEditable(true);textAllocationij.setEditable(true);textAvailablej.setEditable(true););buttonSetInit.ad
28、dActionListener(new ActionListener() public void actionPerformed(ActionEvent e) Init();buttonsearch.setEnabled(true););buttonsearch.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) count = 0;SafeSequence = new intprocessNum;worked = new intresourceNum;Finish = new bo
29、oleanprocessNum;copyVector(worked, available);Safety(0);jt.append("安全序列数量:" + count);if (flag) labelInfo1.setText("当前系统状态:安全");f2.setVisible(true);buttonRequest.setEnabled(true);textProcessName.setEnabled(true);for (int i = 0; i < resourceNum; i+) textRequesti.setEditable(true
30、); else labelInfo1.setText("当前系统状态:不安全");buttonSetInit.setEnabled(false););buttonRequest.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) count = 0;for (int i = 0; i < processNum; i+) Finishi = false;jt.setText("");flag = false;RequestResource(
31、););button2.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) /* * tf1.setText(""); tf2.setText(""); */f2.setVisible(false);jt.setText("");for (int i = 0; i < processNum; i+) for (int j = 0; j < resourceNum; j+) textNeedij.setText(&
32、quot;");textAllocationij.setText("");textAvailablej.setText("");textRequestj.setText("");/ textNeedij.setEditable(false);/ textAllocationij.setEditable(false);/ textAvailablej.setEditable(false);textRequestj.setEditable(false);textProcessName.setText("");
33、Finishi = false;flag = false;buttonsearch.setEnabled(false);/ labelInfo.setText("请先输入资源个数和进程个数,后单击确定"););button.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) tf1.setText("");tf2.setText("");f2.setVisible(false);jt.setText(""
34、);flag = false;);void copyVector(int v1, int v2) for (int i = 0; i < v1.length; i+)v1i = v2i;void Add(int v1, int v2) for (int i = 0; i < v1.length; i+)v1i += v2i;void Sub(int v1, int v2) for (int i = 0; i < v1.length; i+)v1i -= v2i;boolean Smaller(int v1, int v2) boolean value = true;for (
35、int i = 0; i < v1.length; i+)if (v1i > v2i) value = false;break;return value;public static void main(String args) OsBanker ob = new OsBanker();ob.display();/ System.out.println(" "+count);void Init() / 初始化操作矩阵available = new intresourceNum;for (int i = 0; i < resourceNum; i+) avai
36、lablei = Integer.parseInt(textAvailablei.getText();max = new intprocessNumresourceNum;allocated = new intprocessNumresourceNum;need = new intprocessNumresourceNum;for (int i = 0; i < processNum; i+) for (int j = 0; j < resourceNum; j+) maxij = Integer.parseInt(textNeedij.getText();allocatedij
37、= Integer.parseInt(textAllocationij.getText();for (int i = 0; i < resourceNum; i+)for (int j = 0; j < processNum; j+)needji = maxji - allocatedji;for (int i = 0; i < resourceNum; i+)for (int j = 0; j < processNum; j+) availablei -= allocatedji;if (availablei < 0) labelInfo.setText(&qu
38、ot;您输入的数据有误,请重新输入");void Safety(int n) / 查找所有安全序列if (n = processNum) count+;for (int i = 0; i < processNum; i+) jt.append("进程" + (SafeSequencei + 1) + " ");jt.append("n");flag = true;return;for (int i = 0; i < processNum; i+) if (Finishi = false) boolean OK = true;for (int j = 0; j < resourceNum; j+) if (needij >
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026 年成人高考市场营销本科考哪些科目?用什么软件听课刷题
- 2026 年尘肺病慢病护理宣讲
- 2026 年内镜中心护理质控管理工作分享
- 2026 年内镜中心胃肠镜检查护理配合课件
- 2026 年口腔黏膜溃疡护理分享
- 2026 年猩红热护理个案研讨宣讲
- 胸腔积液教学查房-右侧大量积液查因总结2026
- 部编版八年级上册语文第五单元字词
- 2026年《花卉学》期末考试模考模拟试题附答案详解(黄金题型)
- 2026年保密知识测试(二)
- 2026赫章鑫晨建工(集团)有限公司招聘20名工作人员笔试备考试题及答案详解
- GB/T 47826-2026航空航天系列阻燃磷酸酯液压油技术规范
- 新能源汽车保养维修手册
- APQP与PPAP培训课件教学课件
- 内部合伙人制度及股权激励方案(珍藏版)
- 视频监控设备测试方案
- 2025年留疆战士考试题(附答案)
- GB/T 3033-2025船舶与海上技术管路系统内含物的识别颜色
- 教师资格条例解读
- 专题22 语法填空(全国)十年(2016-2025)高考《英语》真题分类汇编
- 【杭州律协】2025商业诋毁不正当竞争案例研究白皮书
评论
0/150
提交评论