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)系统试探把
3、要求的资源分配给进程Pi,并修改下面数据结构中的数值: Available=Available-Requesti; Allocation=Allocation+Request; Need=Need-Request; (4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。3、安全性算法步骤:(1)设置两个向量 工作向量Work。它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation; 布尔向量Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finishi=false,当有足够资源分配给进程时,令Finishi
4、=true。(2)从进程集合中找到一个能满足下述条件的进程: Finishi=false Needor=Work 如找到,执行步骤(3);否则,执行步骤(4)。(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work=Work+Allocation; Finishi=true; 转向步骤(2)。(4)如果所有进程的Finishi=true,则表示系统处于安全状态;否则,系统处于不安全状态。4、流程图:系统主要过程流程图银行家算法流程图安全性算法流程图5、主要数据结构 假设有M个进程N类资源,则有如下数据结构:int maxM*N M个进程对N类资源的最大需求
5、量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 / 界面设计 JLabel labelInfo; JLabel l
6、abelInfo1; int resourceNum, processNum; int count = 0; JButton buttonRequest, buttonSetInit, button, button1, buttonsearch,button2; JTextField tf1, tf2; JTextField textAvailable; JTextField textAllocation; JTextField textNeed; JTextField textProcessName; JTextField textRequest; int available; int ma
7、x; 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, 按钮区); te
8、xtAvailable = 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(请先输入资源个数和进程个数(16),后单击确定); JP
9、anel 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(labelInfo, nul
10、l); 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); contentPane.add(b2, null)
11、; tf2.setBounds(180, 150, 170, 30); contentPane.add(tf2, null); button1 = new JButton(确定); button = new JButton(重置); 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)
12、; 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.getContentPane(); contentPane1.setLayout(null); conten
13、tPane1.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(AllResource:); JLabel labelNeedLabel = new JLab
14、el(MaxNeed:); JLabel labelAllocationLabel = new JLabel(allocated:); JLabel labelRequestLabel = new JLabel(request process:); labelNeedLabel.setBounds(75, 90, 100, 20); / x,y,width,height contentPane1.add(labelNeedLabel, null); labelAllocationLabel.setBounds(75, 240, 100, 20); contentPane1.add(labelA
15、llocationLabel, null); labelAvailableLabel.setBounds(75, 70, 100, 20); contentPane1.add(labelAvailableLabel, null); labelRequestLabel.setBounds(75, 400, 100, 20); contentPane1.add(labelRequestLabel, null); JLabel labelProcessLabel1 = new JLabel(进程1), new JLabel(进程2), new JLabel(进程3), new JLabel(进程4)
16、, new JLabel(进程5), new JLabel(进程6) ; JLabel labelProcessLabel2 = new JLabel(进程1), new JLabel(进程2), new JLabel(进程3), 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); pPan
17、el2.setLayout(null); /* * pPanel4.setLayout(null); pPanel4.setBounds(440,120,90,270); * pPanel4.setBorder(borderTitled); */ buttonSetInit = new JButton(初始化); buttonsearch = new JButton(检测安全性); button2 = new JButton(重置); buttonRequest = new JButton(请求资源); buttonSetInit.setBounds(420, 140, 100, 30); c
18、ontentPane1.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 (int pi = 0; pi 6; pi+)
19、 labelProcessLabel1pi.setBounds(0, 0 + pi * 20, 60, 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); con
20、tentPane1.add(pPanel1); contentPane1.add(pPanel2); contentPane1.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()
21、; textAllocationpisi.setBounds(150 + si * 50, 270 + 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(); tex
22、tRequestsi.setEditable(false); textRequestsi.setBounds(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)
23、; 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 = new JFrame(安全序列显示
24、框); jt = new JTextArea(75, 40); jt.setBackground(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.s
25、etDefaultCloseOperation(EXIT_ON_CLOSE); f2.setVisible(false); buttonSetInit.setEnabled(false); buttonRequest.setEnabled(false); buttonsearch.setEnabled(false); button1.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) / labelInfo.setText(请先初始化allocated和Maxneed,后单击初始化按
26、钮); f1.setVisible(true); buttonSetInit.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.se
27、tEditable(true); ); buttonSetInit.addActionListener(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; wo
28、rked = new intresourceNum; Finish = new booleanprocessNum; 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); 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;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1