当前位置:文档之家› 操作系统实验报告-利用银行家算法避免死锁

操作系统实验报告-利用银行家算法避免死锁

计算机操作系统实验报告题目利用银行家算法避免死锁一、实验目得:1、加深了解有关资源申请、避免死锁等概念,并体会与了解死锁与避免死锁得具体实施方法。

2、要求编写与调试一个系统动态分配资源得简单模拟程序,观察死锁产生得条件,并采用银行家算法,有效得防止与避免死锁得发生。

二、实验内容:用银行家算法实现资源分配:设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}得系统,例如,{A,B,C}得资源数量分别为10,5,7。

进程可动态地申请资源与释放资源,系统按进程得申请动态地分配资源,要求程序具有显示与打印各进程得某一个时刻得资源分配表与安全序列;显示与打印各进程依次要求申请得资源号以及为某进程分配资源后得有关资源数据。

三、问题分析与设计:1、算法思路:先对用户提出得请求进行合法性检查,即检查请求就是否大于需要得,就是否大于可利用得。

若请求合法,则进行预分配,对分配后得状态调用安全性算法进行检查。

若安全,则分配;若不安全,则拒绝申请,恢复到原来得状态,拒绝申请。

2、银行家算法步骤:(1)如果Requesti<or =Need,则转向步骤(2);否则,认为出错,因为它所需要得资源数已超过它所宣布得最大值。

(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够得资源,进程必须等待。

(3)系统试探把要求得资源分配给进程Pi,并修改下面数据结构中得数值:Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统就是否处于安全状态。

3、安全性算法步骤:(1)设置两个向量①工作向量Work。

它表示系统可提供进程继续运行所需要得各类资源数目,执行安全算法开始时,Work=Allocation;②布尔向量Finish。

它表示系统就是否有足够得资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。

(2)从进程集合中找到一个能满足下述条件得进程:①Finish[i]=false②Need<or=Work如找到,执行步骤(3);否则,执行步骤(4)。

(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它得资源,故应执行:Work=Work+Allocation;Finish[i]=true;转向步骤(2)。

(4)如果所有进程得Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。

4、流程图:系统主要过程流程图银行家算法流程图安全性算法流程图5、主要数据结构假设有M个进程N类资源,则有如下数据结构:int max[M*N] M个进程对N类资源得最大需求量int available[N] 系统可用资源数int allocated[M*N] M个进程已经得到N类资源得资源量int need[M*N] M个进程还需要N类资源得资源量int worked[]系统提供给进程继续运行所需得各类资源数目四、源代码import java、awt、*;import javax、swing、*;import java、util、*;importjava、awt、event、*;import javax、swing、border、*;public class OsBanker extends JFrame { // 界面设计JLabel labelInfo;JLabel labelInfo1;ﻩint resourceNum, processNum;int count = 0;ﻩJButtonbuttonRequest, buttonSetInit,button, button1,buttonsearch,button2;JTextField tf1, tf2;JTextField[] textAvailable;JTextField[][]textAllocation;ﻩJTextField[][] textNeed;JTextField textProcessName;ﻩJTextField[] textRequest;int available[];int max[][];intneed[][];ﻩ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、createLoweredBevelBorde r();ﻩBorder borderTitled = BorderFactory、createTitledBorder(border, "按钮区");ﻩtextAvailable= newJTextField[5];ﻩﻩtextAllocation = new JTextField[6][5];ﻩtextNeed = new JTextField[6][5];ﻩtextProcessName = new JTextField("");ﻩtextProcessName、setEnabled(false);ﻩtextRequest = new JTextField[5];ﻩtf1 = new JTextField(20);ﻩtf2 = new JTextField(20);ﻩﻩlabelInfo = new JLabel("请先输入资源个数与进程个数(1~6),后单击确定");ﻩ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(labelInfo, 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);ﻩcontentPane、add(b2, null);ﻩ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);ﻩ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);ﻩﻩ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("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,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 = { new JLabel("进程1"), newJLabel("进程2"),ﻩﻩﻩnew JLabel("进程3"), new JLabel("进程4"), newJLabel("进程5"),new JLabel("进程6")};JLabel[] labelProcessLabel2 = { new JLabel("进程1"), new JL abel("进程2"),ﻩnew JLabel("进程3"), new JLabel("进程4"), new JLabel("进程5"),ﻩnew JLabel("进程6") };ﻩJPanelpPanel1 =new JPanel(), pPanel2 = newJPanel(),pPa nel3 = new JPanel(), pPanel4 = new JPanel();ﻩpPanel1、setLayout(null);ﻩpPanel2、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);ﻩ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 (int pi = 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 (int pi = 0; pi < 6; pi++) {ﻩﻩpPanel1、add(labelProcessLabel1[pi], null);ﻩﻩpPanel2、add(labelProcessLabel2[pi], null);}ﻩﻩcontentPane1、add(pPanel1);contentPane1、add(pPanel2);contentPane1、add(pPanel4);ﻩﻩfor (int si =0; si < 5; si++)ﻩﻩfor (int pi =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] = new JTextField();textAllocation[pi][si]、setBounds(150 + si * 50,270 + pi * 20,50, 20);ﻩtextAllocation[pi][si]、setEditable(false);ﻩ}ﻩfor (int si = 0; si < 5; si++) {ﻩﻩﻩtextAvailable[si] = new JTextField();ﻩﻩtextAvailable[si]、setEditable(false);ﻩﻩtextAvailable[si]、setBounds(150 + si * 50, 70, 50, 20);ﻩﻩtextRequest[si] =new JTextField();ﻩﻩtextRequest[si]、setEditable(false);ﻩﻩﻩtextRequest[si]、setBounds(150 + si * 50, 430, 50, 20);ﻩﻩcontentPane1、add(textAvailable[si], null);contentPane1、add(textRequest[si], null);ﻩﻩ}ﻩﻩfor (int pi = 0; pi < 6;pi++)for (int si = 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 = new JFrame("安全序列显示框");ﻩﻩ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、setDefaultCloseOperation(EXIT_ON_CLOSE);ﻩf2、setVisible(false);ﻩbuttonSetInit、setEnabled(false);ﻩbuttonRequest、setEnabled(false);ﻩbuttonsearch、setEnabled(false);ﻩbutton1、addActionListener(newActionListener() { public void actionPerformed(ActionEvent e) {ﻩ// labelInfo、setText("请先初始化allocated与Maxneed,后单击初始化按钮");ﻩﻩ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++) {ﻩtextNeed[i][j]、setEditable(true);ﻩﻩﻩtextAllocation[i][j]、setEditable(true);ﻩtextAvailable[j]、setEditable(true);ﻩﻩﻩﻩ}ﻩﻩﻩﻩ}ﻩﻩ});ﻩﻩbuttonSetInit、addActionListener(new ActionListener() { ﻩpublicvoid actionPerformed(ActionEvente) {ﻩInit();ﻩﻩﻩbuttonsearch、setEnabled(true);ﻩ}});ﻩbuttonsearch、addActionListener(new ActionListener() {ﻩﻩpublic void actionPerformed(ActionEvent e) {ﻩcount = 0;ﻩﻩSafeSequence = new int[processNum];ﻩﻩworked =new int[resourceNum];Finish = new boolean[processNum];ﻩ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++) {ﻩﻩﻩtextRequest[i]、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++) {ﻩﻩﻩFinish[i] = false;ﻩ}ﻩﻩjt、setText("");ﻩﻩﻩflag = false;ﻩRequestResource();}ﻩﻩ});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++) {ﻩﻩﻩﻩtextNeed[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);ﻩﻩﻩtextProcessName、setText("");ﻩﻩﻩFinish[i] = 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("");ﻩﻩflag = false;ﻩﻩ}ﻩﻩ});ﻩ}ﻩvoid copyVector(int[] v1, int[] v2) {ﻩﻩfor (int i = 0; i< v1、length; i++)ﻩﻩv1[i] = v2[i];ﻩ}ﻩvoid Add(int[]v1,int[] v2) {ﻩﻩfor (int i = 0; i < v1、length; i++)v1[i] += v2[i];ﻩ}void Sub(int[] v1, int[] v2) {ﻩfor (int i = 0; i < v1、length; i++)ﻩﻩv1[i] -= v2[i];}ﻩboolean Smaller(int[] v1, int[] v2) {ﻩboolean value = true;for (int i = 0; i<v1、length; i++)ﻩif (v1[i] >v2[i]) {ﻩﻩ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 int[resourceNum];ﻩﻩfor (inti=0; i < resourceNum; i++) {ﻩavailable[i] = Integer、parseInt(textAvailable[i]、getText()); ﻩﻩ}ﻩmax = new int[processNum][resourceNum];allocated = new int[processNum][resourceNum];need = new int[processNum][resourceNum];ﻩfor(int i= 0;i < processNum; i++){ﻩﻩfor(int j = 0; j < resourceNum; j++) {ﻩmax[i][j] = Integer、parseInt(textNeed[i][j]、getText());ﻩﻩallocated[i][j] = Integer、parseInt(textAllocation[i][j]ﻩﻩ、getText());}ﻩ}ﻩﻩfor (int i= 0; i< resourceNum;i++)ﻩﻩfor (int j = 0; j < processNum; j++)ﻩﻩﻩneed[j][i]= max[j][i] - allocated[j][i];ﻩfor (inti = 0; i < resourceNum; i++)ﻩﻩfor (int j = 0; j < processNum; j++) {ﻩﻩﻩavailable[i] -=allocated[j][i];ﻩﻩﻩif (available[i]< 0) {ﻩlabelInfo、setText("您输入得数据有误,请重新输入");ﻩﻩﻩ}ﻩ}}ﻩvoidSafety(int n) //查找所有安全序列ﻩ{ﻩif (n == processNum) {count++;ﻩﻩfor (int i = 0; i < processNum; i++) {ﻩﻩﻩjt、append("进程" + (SafeSequence[i] + 1) + " ");ﻩ}ﻩjt、append("\n");ﻩﻩflag = true;ﻩﻩreturn;}for (int i = 0; i < processNum; i++) {ﻩﻩif (Finish[i] == false) {ﻩboolean OK = true;ﻩﻩfor (intj = 0; j < resourceNum; j++) {ﻩif (need[i][j]> worked[j]) {ﻩﻩOK = false;ﻩﻩﻩbreak;ﻩﻩﻩﻩ}ﻩﻩ}if (OK) {ﻩﻩfor (int j = 0; j < resourceNum; j++) {ﻩﻩworked[j] += allocated[i][j];}Finish[i] = true;ﻩSafeSequence[n] = i;Safety(n + 1);ﻩﻩFinish[i] = false;ﻩﻩSafeSequence[n] = -1;ﻩﻩﻩ// num++;ﻩﻩﻩﻩfor(int j = 0; j< resourceNum; j++){ﻩﻩﻩworked[j] -= allocated[i][j];ﻩﻩﻩ}ﻩﻩ}ﻩ}ﻩ}ﻩ}ﻩvoid RequestResource() { // 请求资源ﻩﻩjt、setText("");ﻩﻩint processname = (Integer、parseInt(textProcessName、getText())- 1);ﻩﻩrequest = new int[resourceNum];ﻩﻩfor (int i = 0; i < resourceNum; i++) {request[i]= Integer、parseInt(textRequest[i]、getText());}ﻩif (!Smaller(request, need[processname])) {ﻩﻩlabelInfo、setText("资源请求不符该进程得需求量、");ﻩ}elseif (!Smaller(request, available)) {ﻩlabelInfo1、setText("可用资源不足以满足请求,进程需要等待、");} else {Sub(available, request);Add(allocated[processname], request);ﻩﻩSub(need[processname], request);ﻩcopyVector(worked, available);ﻩﻩﻩSafety(0);if (flag) {ﻩﻩﻩlabelInfo1、setText("可立即分配给该进程!");ﻩﻩ} else {ﻩﻩﻩﻩlabelInfo1、setText("分配后导致系统处于不安全状态!,不可立即分配");ﻩﻩAdd(available, request);ﻩﻩSub(allocated[processname], request);ﻩAdd(need[processname], request);ﻩﻩ}}ﻩ// }}}五、实验结果:初始界面:初始化:检测安全性:请求资源:(1)进程2(1,0,2)(2)进程5(3,3,0)(3)进程1(0,2,0)六、遇到得问题及不足之处:1、程序编写得时候规定最大资源数与最大进程数均<=6。

相关主题