欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      操作系統(tǒng)實(shí)驗(yàn)報(bào)告-利用銀行家算法避免死鎖(推薦五篇)

      時(shí)間:2019-05-14 04:02:08下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《操作系統(tǒng)實(shí)驗(yàn)報(bào)告-利用銀行家算法避免死鎖》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(kù)還可以找到更多《操作系統(tǒng)實(shí)驗(yàn)報(bào)告-利用銀行家算法避免死鎖》。

      第一篇:操作系統(tǒng)實(shí)驗(yàn)報(bào)告-利用銀行家算法避免死鎖

      計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告

      題 目 利用銀行家算法避免死鎖

      一、實(shí)驗(yàn)?zāi)康模?/p>

      1、加深了解有關(guān)資源申請(qǐng)、避免死鎖等概念,并體會(huì)和了解死鎖和避免死鎖的具體實(shí)施方法。

      2、要求編寫(xiě)和調(diào)試一個(gè)系統(tǒng)動(dòng)態(tài)分配資源的簡(jiǎn)單模擬程序,觀察死鎖產(chǎn)生的條件,并采用銀行家算法,有效的防止和避免死鎖的發(fā)生。

      二、實(shí)驗(yàn)內(nèi)容:

      用銀行家算法實(shí)現(xiàn)資源分配:

      設(shè)計(jì)五個(gè)進(jìn)程{p0,p1,p2,p3,p4}共享三類(lèi)資源{A,B,C}的系統(tǒng),例如,{A,B,C}的資源數(shù)量分別為10,5,7。進(jìn)程可動(dòng)態(tài)地申請(qǐng)資源和釋放資源,系統(tǒng)按進(jìn)程的申請(qǐng)動(dòng)態(tài)地分配資源,要求程序具有顯示和打印各進(jìn)程的某一個(gè)時(shí)刻的資源分配表和安全序列;顯示和打印各進(jìn)程依次要求申請(qǐng)的資源號(hào)以及為某進(jìn)程分配資源后的有關(guān)資源數(shù)據(jù)。

      三、問(wèn)題分析與設(shè)計(jì):

      1、算法思路:

      先對(duì)用戶(hù)提出的請(qǐng)求進(jìn)行合法性檢查,即檢查請(qǐng)求是否大于需要的,是否大于可利用的。若請(qǐng)求合法,則進(jìn)行預(yù)分配,對(duì)分配后的狀態(tài)調(diào)用安全性算法進(jìn)行檢查。若安全,則分配;若不安全,則拒絕申請(qǐng),恢復(fù)到原來(lái)的狀態(tài),拒絕申請(qǐng)。

      2、銀行家算法步驟:

      (1)如果Requesti<o(jì)r =Need,則轉(zhuǎn)向步驟(2);否則,認(rèn)為出錯(cuò),因?yàn)樗枰馁Y源數(shù)已超過(guò)它所宣布的最大值。

      (2)如果Request<o(jì)r=Available,則轉(zhuǎn)向步驟(3);否則,表示系統(tǒng)中尚無(wú)足夠的資源,進(jìn)程必須等待。

      (3)系統(tǒng)試探把要求的資源分配給進(jìn)程Pi,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值:

      Available=Available-Request[i];

      Allocation=Allocation+Request;Need=Need-Request;(4)系統(tǒng)執(zhí)行安全性算法,檢查此次資源分配后,系統(tǒng)是否處于安全狀態(tài)。

      3、安全性算法步驟:(1)設(shè)置兩個(gè)向量

      ①工作向量Work。它表示系統(tǒng)可提供進(jìn)程繼續(xù)運(yùn)行所需要的各類(lèi)資源數(shù)目,執(zhí)行安全算法開(kāi)始時(shí),Work=Allocation;②布爾向量Finish。它表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運(yùn)行完成,開(kāi)始時(shí)先做Finish[i]=false,當(dāng)有足夠資源分配給進(jìn)程時(shí),令Finish[i]=true。

      (2)從進(jìn)程集合中找到一個(gè)能滿(mǎn)足下述條件的進(jìn)程:

      ①Finish[i]=false ②Need

      (3)當(dāng)進(jìn)程P獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行: Work=Work+Allocation;Finish[i]=true;轉(zhuǎn)向步驟(2)。

      (4)如果所有進(jìn)程的Finish[i]=true,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。

      4、流程圖: 系統(tǒng)主要過(guò)程流程圖

      銀行家算法流程圖

      安全性算法流程圖

      5、主要數(shù)據(jù)結(jié)構(gòu)

      假設(shè)有M個(gè)進(jìn)程N(yùn)類(lèi)資源,則有如下數(shù)據(jù)結(jié)構(gòu):

      int max[M*N] M個(gè)進(jìn)程對(duì)N類(lèi)資源的最大需求量 int available[N] 系統(tǒng)可用資源數(shù)

      int allocated[M*N] M個(gè)進(jìn)程已經(jīng)得到N類(lèi)資源的資源量 int need[M*N] M個(gè)進(jìn)程還需要N類(lèi)資源的資源量

      int worked[] 系統(tǒng)提供給進(jìn)程繼續(xù)運(yùn)行所需的各類(lèi)資源數(shù)目

      四、源代碼

      import java.awt.*;import javax.swing.*;import java.util.*;import java.awt.event.*;import javax.swing.border.*;

      public class OsBanker extends JFrame { // 界面設(shè)計(jì)

      JLabel labelInfo;JLabel labelInfo1;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 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, “按鈕區(qū)”);

      textAvailable = new JTextField[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(”請(qǐng)先輸入資源個(gè)數(shù)和進(jìn)程個(gè)數(shù)(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(”資源個(gè)數(shù):“);b1.setForeground(Color.blue);JLabel b2 = new JLabel(”進(jìn)程個(gè)數(shù):“);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(”請(qǐng)先輸入最大需求和分配矩陣,然后單擊初始化“);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(”進(jìn)程1“), new JLabel(”進(jìn)程2“),new JLabel(”進(jìn)程3“), new JLabel(”進(jìn)程4“), new JLabel(”進(jìn)程5“),new JLabel(”進(jìn)程6“)};

      JLabel[] labelProcessLabel2 = { new JLabel(”進(jìn)程1“), new JLabel(”進(jìn)程2“),new JLabel(”進(jìn)程3“), new JLabel(”進(jìn)程4“), new JLabel(”進(jìn)程5“),new JLabel(”進(jìn)程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);

      * pPanel4.setBorder(borderTitled);

      */

      buttonSetInit = new JButton(”初始化“);

      buttonsearch = new JButton(”檢測(cè)安全性“);

      button2 = new JButton(”重置“);

      buttonRequest = new JButton(”請(qǐng)求資源“);

      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] = new JTextField();

      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);// 加滾動(dòng)條

      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(new ActionListener(){

      public void actionPerformed(ActionEvent e){

      // labelInfo.setText(”請(qǐng)先初始化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(){

      public void actionPerformed(ActionEvent e){

      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(”安全序列數(shù)量:“ + count);if(flag){

      labelInfo1.setText(”當(dāng)前系統(tǒng)狀態(tài):安全“);

      f2.setVisible(true);

      buttonRequest.setEnabled(true);

      textProcessName.setEnabled(true);

      for(int i = 0;i < resourceNum;i++){

      textRequest[i].setEditable(true);

      } } else {

      labelInfo1.setText(”當(dāng)前系統(tǒng)狀態(tài):不安全“);} 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(”請(qǐng)先輸入資源個(gè)數(shù)和進(jìn)程個(gè)數(shù),后單擊確定“);} });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(int i = 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]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(”資源請(qǐng)求不符該進(jìn)程的需求量.“);

      } else if(!Smaller(request, available)){

      labelInfo1.setText(”可用資源不足以滿(mǎn)足請(qǐng)求,進(jìn)程需要等待.“);

      } else {

      Sub(available, request);

      Add(allocated[processname], request);

      Sub(need[processname], request);

      copyVector(worked, available);

      Safety(0);

      if(flag){

      labelInfo1.setText(”可立即分配給該進(jìn)程!“);

      } else {

      labelInfo1.setText(”分配后導(dǎo)致系統(tǒng)處于不安全狀態(tài)!,不可立即分配");

      Add(available, request);

      Sub(allocated[processname], request);

      Add(need[processname], request);

      }

      }

      // } } }

      五、實(shí)驗(yàn)結(jié)果:

      初始界面:

      初始化:

      檢測(cè)安全性:

      請(qǐng)求資源:

      (1)進(jìn)程2(1,0,2)

      (2)進(jìn)程5(3,3,0)

      (3)進(jìn)程1(0,2,0)

      六、遇到的問(wèn)題及不足之處:

      1、程序編寫(xiě)的時(shí)候規(guī)定最大資源數(shù)和最大進(jìn)程數(shù)均<=6。

      2、程序直接初始化了6個(gè)進(jìn)程框,既浪費(fèi)了內(nèi)存空間,又對(duì)可視化界面的美觀造成影響。

      3、未對(duì)輸入異常進(jìn)行處理:比如在請(qǐng)求資源的第一個(gè)方框中只能填入進(jìn)程的數(shù)字編號(hào),當(dāng)填入的為非整數(shù)時(shí),程序會(huì)拋出異常。

      4、未解決進(jìn)程名中對(duì)字符串的處理,直接固定進(jìn)程名為數(shù)字,用戶(hù)不能直接輸入原有的進(jìn)程名,造成不好的用戶(hù)體驗(yàn)。

      第二篇:操作系統(tǒng)銀行家算法(避免死鎖)實(shí)驗(yàn)報(bào)告

      操作系統(tǒng)實(shí)驗(yàn):銀行家算法

      姓名:李天瑋

      班級(jí):軟工1101 實(shí)驗(yàn)內(nèi)容:

      在windows系統(tǒng)中實(shí)現(xiàn)銀行家算法程序。

      學(xué)號(hào):201126630117 實(shí)現(xiàn)銀行家算法所用的數(shù)據(jù)結(jié)構(gòu):

      假設(shè)有5個(gè)進(jìn)程3類(lèi)資源,則有如下數(shù)據(jù)結(jié)構(gòu): 1.MAX[5,3] 5個(gè)進(jìn)程對(duì)3類(lèi)資源的最大需求量。2.AVAILABLE[3]系統(tǒng)可用資源數(shù)。

      3.ALLOCATION[5,3]5個(gè)進(jìn)程已經(jīng)得到3類(lèi)資源的資源量。4.NEED[5,3]5個(gè)進(jìn)程還需要3類(lèi)資源的資源量。

      銀行家算法:

      設(shè)進(jìn)程1提出請(qǐng)求Request[N],則銀行家算法按如下規(guī)則進(jìn)行判斷。(1)如果Request[N]<=NEED[1,N],則轉(zhuǎn)(2);否則,出錯(cuò)。(2)如果Request[N]<=AVALIABLE,則轉(zhuǎn)(3);否則,出錯(cuò)。(3)系統(tǒng)試探非配資源,修改相關(guān)數(shù)據(jù)。

      AVALIABLE=AVALIABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST(4)系統(tǒng)執(zhí)行安全性檢查,如安全,則分配成立;否則試探險(xiǎn)性分配作廢,系統(tǒng)恢復(fù)原狀,進(jìn)程等待。

      安全性檢查:

      (1)設(shè)置兩個(gè)工作向量WORK=AVAILABLE;FINISH[M]=FALSE.(2)從晉城集合中找到一個(gè)滿(mǎn)足下述條件的進(jìn)程,F(xiàn)INISH[i]=FALSE NEED<=WORK 如找到,執(zhí)行(3);否則,執(zhí)行(4)。

      (3)設(shè)進(jìn)程獲得資源,可順利執(zhí)行,直至完成,從而釋放資源。

      WORK=WORK+ALLOCATION FINISH[i]=TRUE GOTO(2)

      (4)如所有進(jìn)程FINISH[M]=TRUE,則表示安全;否則系統(tǒng)不安全。

      1.用init()函數(shù)對(duì)于數(shù)據(jù)的初始化

      關(guān)鍵代碼:

      #define M 5 #define N 3

      void init(){

      cout<<“請(qǐng)輸入5個(gè)進(jìn)程對(duì)3類(lèi)資源最大資源需求量:”<

      } cout<<“請(qǐng)輸入系統(tǒng)可用的資哩源數(shù):”<

      { } cin>>AVAILABLE[j];for(int j=0;j>MAX[i][j];} //cout<

      cout<<“請(qǐng)輸入5個(gè)進(jìn)程已經(jīng)-的到的3類(lèi)資源的資源量:”<

      for(int i=0;i

      } cout<<“請(qǐng)?輸?入?5個(gè)?進(jìn)?程ì還1需è要癮3類(lèi)え?資哩?源′的?資哩?源′量?:”<

      } for(int j=0;j>NEED[i][j];} //cout<>ALLOCATION[i][j];} //cout<

      }// Stack around the variable 'AVAILABLE' was corrupted.顯示數(shù)據(jù)詳細(xì)信息

      進(jìn)行測(cè)試 輸入一號(hào)進(jìn)程號(hào),并給需要申請(qǐng)資源設(shè)定為{1,0,2}

      檢驗(yàn)錯(cuò)誤輸入時(shí)候的報(bào)錯(cuò)信息

      檢驗(yàn)當(dāng)再次申請(qǐng)0號(hào)資源并申請(qǐng)資源數(shù)目為{0,2,0}時(shí),系統(tǒng)提示系統(tǒng)不安全申請(qǐng)不成功。

      每當(dāng)驗(yàn)證申請(qǐng)成功后會(huì)進(jìn)行的修改操作:

      if(flag=='Y'||flag=='y')//進(jìn)?行D數(shù)簓據(jù)Y修T改?

      { changdata(i);

      }

      } if(chkerr(0)){

      } else showdata();rstordata(i);showdata();else showdata();cout<>flag;退?出?演Y示?”;

      第三篇:死鎖_銀行家算法實(shí)驗(yàn)報(bào)告

      實(shí)驗(yàn)?zāi)康?/p>

      銀行家算法是避免死鎖的一種重要方法。通過(guò)編寫(xiě)一個(gè)模擬動(dòng)態(tài)資源分配的銀行家算法程序,進(jìn)一步深入理解死鎖、產(chǎn)生死鎖的必要條件、安全狀態(tài)等重要概念,并掌握避免死鎖的具體實(shí)施方法

      二、實(shí)驗(yàn)要求

      根據(jù)銀行家算法的基本思想,編寫(xiě)和調(diào)試一個(gè)實(shí)現(xiàn)動(dòng)態(tài)資源分配的模擬程序,并能夠有效地防止和避免死鎖的發(fā)生。

      (1)設(shè)計(jì)思想說(shuō)明

      設(shè)計(jì)銀行家算法是為了避免死鎖

      三、實(shí)驗(yàn)方法內(nèi)容 1.算法設(shè)計(jì)思路

      銀行家算法又稱(chēng)“資源分配拒絕”法,其基本思想是,系統(tǒng)中的所有進(jìn)程放入進(jìn)程集合,在安全狀態(tài)下系統(tǒng)受到進(jìn)程的請(qǐng)求后試探性的把資源分配給他,現(xiàn)在系統(tǒng)將剩下的資源和進(jìn)程集合中其他進(jìn)程還需要的資源數(shù)做比較,找出剩余資源能滿(mǎn)足最大需求量的進(jìn)程,從而保證進(jìn)程運(yùn)行完成后還回全部資源。這時(shí)系統(tǒng)將該進(jìn)程從進(jìn)程集合中將其清除。此時(shí)系統(tǒng)中的資源就更多了。反復(fù)執(zhí)行上面的步驟,最后檢查進(jìn)程的集合為空時(shí)就表明本次申請(qǐng)可行,系統(tǒng)處于安全狀態(tài),可以實(shí)施本次分配,否則,只要進(jìn)程集合非空,系統(tǒng)便處于不安全狀態(tài),本次不能分配給他。請(qǐng)進(jìn)程等待 2.算法流程圖

      3.算法中用到的數(shù)據(jù)結(jié)構(gòu)

      數(shù)據(jù)結(jié)構(gòu)的說(shuō)明

      1.可利用資源向量AVAILABLE。這是一個(gè)含有M個(gè)元素的數(shù)組,其中的每一個(gè)元素代表一類(lèi)可利用的資源數(shù)目,其3初始值是系統(tǒng)中所配置的該類(lèi)全部可哦那個(gè)資源的數(shù)目,其數(shù)值隨該類(lèi)資源的分配和回收而動(dòng)態(tài)的改變。

      2.最大需求矩陣MAX。這是一個(gè)M*N的矩陣,它定義了系統(tǒng)中N個(gè)進(jìn)程中的每一個(gè)進(jìn)程對(duì)M類(lèi)資源的最大需求。

      3.分配矩陣ALLOCATION。這也是一個(gè)M*N的矩陣,它定義了系統(tǒng)中每一類(lèi)資源當(dāng)前已分配給每一進(jìn)程的資源數(shù)。

      4.需求矩陣NEED。這也是一個(gè)M*N的矩陣,用以表示每一個(gè)進(jìn)程尚需的各類(lèi)資源數(shù)。5.NEED[R,W]=MAX[R,W]-ALLOCATION[R,W]

      4.主要的常量變量 #define W 10 //最大進(jìn)程數(shù)W=10 #define R 20 //最大資源總數(shù)R=20 int AVAILABLE[R];//可利用資源向量 int MAX[W][R];//最大需求矩陣 int ALLOCATION[W][R];//分配矩陣 int NEED[W][R];//需求矩陣 int Request[R];//進(jìn)程請(qǐng)求向量

      void changdata(int k);//進(jìn)程請(qǐng)求資源數(shù)據(jù)改變 int chksec(int s);//系統(tǒng)安全性的檢測(cè)

      5.主要模塊

      void inputdata()void showdata()void changdata(int k)void restoredata(int k)int chksec(int s)int chkmax(int s)

      四、實(shí)驗(yàn)代碼

      #include #include #define FALSE 0 #define TRUE 1 #define W 10 //最大進(jìn)程數(shù)W=10 #define R 20 //最大資源總數(shù)R=20 int M;int N;int ALL_RESOURCE[W];int AVAILABLE[R];//可利用資源向量 int MAX[W][R];//最大需求矩陣 int ALLOCATION[W][R];//分配矩陣 int NEED[W][R];//需求矩陣 int Request[R];//進(jìn)程請(qǐng)求向量 void inputdata();//數(shù)據(jù)輸入 void showdata();//數(shù)據(jù)顯示

      void changdata(int k);//進(jìn)程請(qǐng)求資源數(shù)據(jù)改變 void restoredata(int k);//數(shù)據(jù)恢復(fù) int chksec(int s);//系統(tǒng)安全性的檢測(cè) int chkmax(int s);//檢測(cè)最大需求

      void bank();//檢測(cè)分配的資源是否合理 void main(){ int i,j;inputdata();for(i=0;i

      if(j==0)break;} if(i>=M)cout<<“錯(cuò)誤提示:經(jīng)安全性檢查發(fā)現(xiàn),系統(tǒng)的初始狀態(tài)不安全!!n”<>M;

      if(M>W)cout<W);cout<>N;

      if(N>R)cout<R);cout<>ALL_RESOURCE[i];cout<>MAX[i][j];if(MAX[i][j]>ALL_RESOURCE[j])cout<ALL_RESOURCE[j]);} } cout<

      for(j=0;j

      do{ cin>>ALLOCATION[i][j];

      if(ALLOCATION[i][j]>MAX[i][j])

      cout<

      }while(ALLOCATION[i][j]>MAX[i][j]);} } cout<

      for(j=0;j

      NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];for(j=0;j

      for(i=0;i

      AVAILABLE[j]=0;} } }

      void showdata(){ int i,j;cout<<“各種資源的總數(shù)量,即向量all_resource為:”<

      cout<

      for(j=0;j

      cout<

      void changdata(int k){ int j;for(j=0;j

      AVAILABLE[j]=AVAILABLE[j]-Request[j];

      ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];

      NEED[k][j]=NEED[k][j]-Request[j];} }

      void restoredata(int k){ int j;for(j=0;j

      ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];

      NEED[k][j]=NEED[k][j]+Request[j];} }

      int chksec(int s){ int WORK,FINISH[W];int i,j,k=0;for(i=0;i

      FINISH[i]=FALSE;for(j=0;j

      { if(FINISH[i]==FALSE&&NEED[i][j]<=WORK)

      {

      WORK=WORK+ALLOCATION[i][j];

      FINISH[i]=TRUE;

      i=0;

      }else

      { i++;

      }

      }while(i

      if(FINISH[i]==FALSE)

      { return 1;

      } } return 0;}

      int chkmax(int s){ int j,flag=0;for(j=0;j

      if(MAX[s][j]==ALLOCATION[s][j])

      { flag=1;

      AVAILABLE[j]=AVAILABLE[j]+MAX[s][j];

      MAX[s][j]=0;

      } } return flag;}

      c { int i=0,j=0;char flag='Y';while(flag=='Y'||flag=='y'){ i=-1;while(i<0||i>=M){ cout<<“請(qǐng)輸入需申請(qǐng)資源的進(jìn)程號(hào)(從P0到P”<

      cin>>i;if(i<0||i>=M)

      cout<<“輸入的進(jìn)程號(hào)不存在,重新輸入!”<

      for(j=0;j

      cin>>Request[j];if(Request[j]>NEED[i][j])

      { cout<<“進(jìn)程P”<

      cout<<“申請(qǐng)不合理,出錯(cuò)!請(qǐng)重新選擇!”<

      flag='N';

      break;

      }

      else

      { if(Request[j]>AVAILABLE[j])

      { cout<<“進(jìn)程P”<

      cout<<“申請(qǐng)不合理,出錯(cuò)!請(qǐng)重新選擇!”<

      flag='N';

      break;

      }

      } }

      if(flag=='Y'||flag=='y'){ changdata(i);

      if(chksec(i))

      { cout<

      cout<<“該分配會(huì)導(dǎo)致系統(tǒng)不安全!!本次資源申請(qǐng)不成功,不予分配!!”<

      cout<

      restoredata(i);

      }

      else

      { cout<

      cout<<“經(jīng)安全性檢查,系統(tǒng)安全,本次分配成功,且資源分配狀況如下所示:”<

      cout<

      showdata();

      if(chkmax(i))

      {cout<<“在資源分配成功之后,由于該進(jìn)程所需的某些資源的最大需求量已經(jīng)滿(mǎn)足,”<

      cout<<“因此在進(jìn)程結(jié)束后系統(tǒng)將回收這些資源!”<

      showdata();

      }

      }

      } cout<>flag;} }

      五、實(shí)驗(yàn)結(jié)果 1.執(zhí)行結(jié)果

      2.結(jié)果分析 銀行家算法就是當(dāng)接收到一個(gè)系統(tǒng)資源的分配后找到一個(gè)安全序列,使得進(jìn)程間不會(huì)發(fā)生死鎖,若發(fā)生死鎖則讓進(jìn)程等待。

      六、實(shí)驗(yàn)總結(jié)

      通過(guò)本次銀行家算法實(shí)驗(yàn),加深了我對(duì)銀行家算法的了解,掌握了如何利用銀行家算法避免死鎖。實(shí)驗(yàn)中遇到點(diǎn)問(wèn)題,通過(guò)查閱資料、詢(xún)問(wèn)老師順利解決。通過(guò)這次的實(shí)踐,使我的理論知識(shí)更加的牢固。

      第四篇:操作系統(tǒng)銀行家算法實(shí)驗(yàn)報(bào)告

      實(shí)驗(yàn)四

      死鎖

      一、實(shí)驗(yàn)?zāi)康?/p>

      當(dāng)系統(tǒng)的總資源數(shù)m小于或等于所有進(jìn)程對(duì)對(duì)資源的最大需求時(shí),就可能產(chǎn)生 死鎖。死鎖會(huì)引起計(jì)算機(jī)系統(tǒng)的癱瘓。銀行家算法是在實(shí)現(xiàn)資源分配時(shí)避免死鎖的一個(gè)著名算法,該算法是在能確保系統(tǒng)處于安全狀態(tài)時(shí)才把資源分配給申請(qǐng)者。通過(guò)本實(shí)驗(yàn)使學(xué)生能進(jìn)一步理解死鎖的概念,并能選擇一個(gè)算法來(lái)避免死鎖。

      二、實(shí)驗(yàn)題目

      系統(tǒng)中有m個(gè)同類(lèi)資源被n個(gè)進(jìn)程共享,每個(gè)進(jìn)程對(duì)資源的最大需求數(shù)分別為S1, S2,…,Sn,且 Max(Si)<=m,(i=1,2,…n)。進(jìn)程可以動(dòng)態(tài)地申請(qǐng)資源和釋放資源。編寫(xiě)一個(gè)程序,現(xiàn)銀行家算法,當(dāng)系統(tǒng)將資源分配給某一進(jìn)程而不會(huì)死鎖時(shí),就分配之。否則,推遲分配,并顯示適當(dāng)?shù)男畔ⅰ?/p>

      三、數(shù)據(jù)結(jié)構(gòu)

      主要數(shù)據(jù)結(jié)構(gòu):

      Struct aa { void Print();//用于打印輸出表格的函數(shù) void Input();//用于輸入的函數(shù)

      void tryfenpei(int i);//試分配函數(shù) void refenpei(int i);//恢復(fù)數(shù)據(jù)函數(shù) void checksafe(int s);//安全檢測(cè)函數(shù) };

      四、銀行家算法的流程圖 開(kāi)始初始化資源類(lèi)數(shù)c=3,進(jìn)程數(shù)t=5初始化Available[c],Max[t][c],Allocation[t][c],Need[t][c],Request[c]輸入進(jìn)程數(shù)iInt f=0f

      五、源代碼

      #include #include “stdio.h” const unsigned short c = 3;//資源類(lèi)數(shù) const unsigned short t = 5;//進(jìn)程數(shù)

      void Print();//用于打印輸出表格的函數(shù) void Input();//用于輸入的函數(shù)

      void tryfenpei(int i);//試分配函數(shù) void refenpei(int i);//恢復(fù)數(shù)據(jù)函數(shù) void checksafe(int s);//安全檢測(cè)函數(shù)

      //定義初始化數(shù)組 int Available[c], Max[t][c], Allocation[t][c], Need[t][c], Request[c];

      int in;//用戶(hù)選擇的進(jìn)程號(hào)

      int main(int argc, char *argv[]){ int i;char ch='Y';cout<<“初始化數(shù)據(jù)如下:”<>in){ if(in<0||in>4){ cout<<“不存在該進(jìn)程,請(qǐng)重新輸入”<>Request[i]){ if(Request[i]<0)cout<<“錯(cuò)誤!輸入的數(shù)字無(wú)效.”<Need[in][i])cout<<“錯(cuò)誤!超出進(jìn)程需求量”<Available[i])cout<<“錯(cuò)誤!系統(tǒng)還沒(méi)有足夠的可用資源量滿(mǎn)足進(jìn)程需要”<

      cout<<“試分配完成!”<

      cout<<“需要繼續(xù)實(shí)驗(yàn)嗎?(y-繼續(xù) n終止)”;} else if(ch=='N'||ch=='n'){ cout<<“感謝您的使用,祝您愉快!”<>ch);return 0;}

      void Print(){ int i,j;cout<<“ 進(jìn)程個(gè)數(shù) : ”<0){ cout<<“ |”;} cout<

      void Input(){ for(int j=0;j>Available[j]){ if(Available[j]<0)cout<<“輸入數(shù)字無(wú)效,請(qǐng)重新輸入”<

      { for(int m=0;m>Max[l][m]){ if(Max[l][m]<0)cout<<“輸入數(shù)字無(wú)效,請(qǐng)重新輸入”<>Allocation[l][m])if(Allocation[l][m]<0)cout<<“輸入數(shù)字無(wú)效,請(qǐng)重新輸入”<

      void tryfenpei(int i){ for(int f=0;f

      //安全檢測(cè)函數(shù)

      void checksafe(int s){ int Work, flag, temp[t], i,j,l=0,k=0;bool Finish[t];for(i=0;i

      } if(l==5)//一共有三類(lèi)資源A B C,一條進(jìn)程下面的安全性檢測(cè)只檢測(cè)了A類(lèi)。如果A類(lèi)通過(guò)了,那么還要判斷B類(lèi),C類(lèi)。否則不用 { for(i=0;i

      } i=s;//s傳遞進(jìn)來(lái)賦給i,s是用戶(hù)輸入的進(jìn)程號(hào)(有主函數(shù)里的in傳遞進(jìn)來(lái))while(i

      if(Finish[i]==false&&Need[i][j]<=Work){ Work=Work+Allocation[i][j];Finish[i]=true;temp[k]=i;//cout<<“temp=”<”;cout<

      六、執(zhí)行結(jié)果:

      七、實(shí)驗(yàn)總結(jié)

      通過(guò)本次實(shí)驗(yàn)了解到用銀行家算法來(lái)預(yù)防死鎖是可靠的,但也是非常保守的,因?yàn)樗拗屏诉M(jìn)程對(duì)資源的存取,從而降低了進(jìn)程的并發(fā)運(yùn)行程度。死鎖檢測(cè)并不限制進(jìn)程對(duì)資源的申請(qǐng),只要有,就分配,但這也可能造成死鎖。但由于死鎖并不是經(jīng)常發(fā)生的,故大大提高了系統(tǒng)運(yùn)行的效率。

      總之,通過(guò)本實(shí)驗(yàn),使我進(jìn)一步加深理解和掌握銀行家算法。

      第五篇:操作系統(tǒng)課程設(shè)計(jì)----模擬銀行家算法避免死鎖

      模擬通過(guò)銀行家算法避免死鎖

      一、銀行家算法產(chǎn)生的背景及目的 1:在多道程序系統(tǒng)中,雖然借助于多個(gè)進(jìn)程的并發(fā)執(zhí)行來(lái)改善系統(tǒng)的利用率,提高系統(tǒng)的吞吐量,但可能發(fā)生一種危險(xiǎn)—死鎖。死鎖就是多個(gè)進(jìn)程在運(yùn)行過(guò)程中因爭(zhēng)奪資源而造成的一種僵局,當(dāng)進(jìn)程處于這種僵局狀態(tài)時(shí),如無(wú)外力作用,他們將無(wú)法再向前進(jìn)行,如再把信號(hào)量作為同步工具時(shí),多個(gè)Wait和Signal操作順序不當(dāng),會(huì)產(chǎn)生進(jìn)程死鎖。

      然而產(chǎn)生死鎖的必要條件有互斥條件,請(qǐng)求和保持條件,不剝奪條件和環(huán)路等待條件。在預(yù)防死鎖的幾種方法中,都施加了較強(qiáng)的限制條件,在避免死鎖的方法中,所施加的條件較弱,有可能獲得令人滿(mǎn)意的系統(tǒng)性能。在該方法中把系統(tǒng)的狀態(tài)分為安全狀態(tài)和不安全狀態(tài),只要能使系統(tǒng)都處于安全狀態(tài),便可避免死鎖。2:實(shí)驗(yàn)?zāi)康模鹤寣W(xué)生獨(dú)立的使用編程語(yǔ)言編寫(xiě)和調(diào)試一個(gè)系統(tǒng)分配資源的簡(jiǎn)單模擬程序,了解死鎖產(chǎn)生的原因及條件。采用銀行家算法及時(shí)避免死鎖的產(chǎn)生,進(jìn)一步理解課堂上老師講的相關(guān)知識(shí)點(diǎn)。銀行家算法是從當(dāng)前狀態(tài)出發(fā),逐個(gè)按安全序列檢查各客戶(hù)中誰(shuí)能完成其工作,然后假定其完成工作且歸還全部貸款,再進(jìn)而檢查下一個(gè)能完成工作的客戶(hù)。如果所有客戶(hù)都能完成工作,則找到一個(gè)安全序列,銀行家才是安全的。

      二:銀行家算法中的數(shù)據(jù)結(jié)構(gòu)

      1:可利用資源向量Available。這是一個(gè)含有m個(gè)元素的數(shù)組,其中的每個(gè)元素代表一類(lèi)可利用的資源數(shù)目,其初始值是系統(tǒng)中所配置的該類(lèi)全部可用資源的數(shù)目,其數(shù)值隨該類(lèi)資源的分配和回收而動(dòng)態(tài)的改變。如果Available[j]=k,z 則表示系統(tǒng)中現(xiàn)有Rj類(lèi)資源K 個(gè)。

      2:最大需求矩陣Max。這是一個(gè)n*m的矩陣,它定義了系統(tǒng)中n個(gè)進(jìn)程中的每一個(gè)進(jìn)程對(duì)m類(lèi)資源的最大需求。如果Max[i,j]=k,表示第i個(gè)進(jìn)程需要第Rj類(lèi)資源的最大數(shù)目k個(gè).3: 分配矩陣Allocation,也是n*m的矩陣,若Allocation[i,j]=k,表示第i 個(gè)進(jìn)程已分配Rj類(lèi)資源的數(shù)目為k個(gè)。

      4:需求矩陣Need。也是一個(gè)n*m的矩陣,Need[i,j]=k,表示第i個(gè)進(jìn)程還需Rj類(lèi)資源k個(gè)。

      三、銀行家算法及安全性算法

      1:銀行家算法

      設(shè)Request[i]是進(jìn)程Pi的請(qǐng)求向量,若Request[i][j]=k;表示進(jìn)程需要j類(lèi)資源k個(gè)。當(dāng)Pi發(fā)出資源請(qǐng)求時(shí),系統(tǒng)按下屬步驟進(jìn)行檢查;(1)如果Request[i][j]<=Need[i][j];便轉(zhuǎn)向步驟(2),否則認(rèn)為出錯(cuò),因?yàn)樗枰馁Y源數(shù)已超過(guò)他所宣布的最大值。

      (2)如果Request[i][j]<=Available[i][j],便轉(zhuǎn)向步驟(3),否則認(rèn)為尚無(wú)足夠資源,進(jìn)程需等待。(3)系統(tǒng)試探著把資源分配給進(jìn)程,并修改下面數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù) Available[i][j]=Available[i][j]-Request[i][j];Allocation[i][j]=Allocation[i][j]+Request[i][j];Need[i][j]=Need[i][j]-Request[i][j];(4)系統(tǒng)執(zhí)行安全性算法,檢查此次資源分配后系統(tǒng)是否處于安全狀態(tài)。若安全,才正式將資源分配給進(jìn)程Pi,已完成此次分配。否則,將本次的試探分配作廢,回復(fù)原來(lái)的資源分配狀態(tài),將進(jìn)程Pi等待。2:安全性算法

      (1)設(shè)置兩個(gè)向量;

      1:工作向量Work,表示系統(tǒng)可提供給進(jìn)程運(yùn)行所需的各類(lèi)資源數(shù)目,它含有m個(gè)元素,初始時(shí)Work=Available 2:Finish ,表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運(yùn)行完成。開(kāi)始時(shí)先做Finish[i]=true(2)從進(jìn)程中找到一個(gè)能滿(mǎn)需下屬條件的進(jìn)程

      1;Finish[i]=false;

      2:Need[i][j]<=Work[j];若找到執(zhí)行步驟(3),否則執(zhí)行步驟(4)

      (3)當(dāng)進(jìn)程Pi順利獲得資源后,直至完成,并釋放分配給它的資源,執(zhí)行: Work[j]=Work[j]+Allocation[i][j];Finish[i]=true;Go to step(2);(5)如果所有的進(jìn)程Finish[i]都滿(mǎn)足,則表示系統(tǒng)處于安全狀態(tài),否則,處于不安全狀態(tài)。

      四、模塊設(shè)計(jì)與分析及整體功能概述

      模塊設(shè)計(jì)與分析:

      整個(gè)銀行家算法分為初始化函數(shù)Init(),安全性算法函數(shù) safe(),銀行家算法函數(shù)bank()三部分。初始化函數(shù)生成開(kāi)始時(shí)刻系統(tǒng)中的進(jìn)程和資源情況,安全性算法判斷當(dāng)某進(jìn)程申請(qǐng)資源時(shí),系統(tǒng)能否處于安全狀態(tài)。在本實(shí)驗(yàn)中,若系統(tǒng)處于安全狀態(tài),便生成一個(gè)安全進(jìn)程序列(安全序列可能有多個(gè))。銀行家算法函數(shù)bank()負(fù)責(zé)整體的檢查與異常判斷。整體功能概述:

      死鎖會(huì)引起系統(tǒng)陷入僵局,操作系統(tǒng)必須防止此現(xiàn)象的發(fā)生。本實(shí)驗(yàn)通過(guò)一個(gè)動(dòng)態(tài)分配資源的模擬程序,更清楚的理解死鎖產(chǎn)生的原因和條件。Dijkstra的銀行家算法是最有代表性的避免死鎖的方法。運(yùn)行程序時(shí)用戶(hù)設(shè)定系統(tǒng)中進(jìn)程和可利用資源的種類(lèi)數(shù)目。輸入各進(jìn)程的可利用資源Available,最大需求MAX,已分配資源Allocation,需求資源Need,之后各系統(tǒng)發(fā)出資源請(qǐng)求Request,利用實(shí)驗(yàn)中的安全性算法判斷能否產(chǎn)生一個(gè)安全性隊(duì)列,若能,則給該進(jìn)程分配成功,否則,不予分配。

      五、流程圖設(shè)計(jì)

      六、源代碼及調(diào)試分析

      #include #define MAXm 50

      // 定義最大進(jìn)程數(shù) #define MAXn 100

      //定義最大資源數(shù)

      int MAX[MAXm][MAXn];

      //最大需求矩陣 int Allocation[MAXm][MAXn];

      //已分配矩陣 int Available[MAXn];

      //可用資源數(shù)組 int Need[MAXm][MAXn];

      //需求矩陣 int Request[MAXm][MAXn];

      //請(qǐng)求矩陣

      int Finish[MAXm];

      //存儲(chǔ)完成資源分配的進(jìn)程 int Sequence[MAXm];

      //模擬的資源分配序列

      int Work[MAXn];

      //系統(tǒng)是否有足夠的資源分配給進(jìn)程 int m,n;

      //m個(gè)進(jìn)程,n個(gè)資源

      #define False 0 #define True 1 void input();//數(shù)據(jù)輸入函數(shù) int safealg();//安全性算法函數(shù) void banker();//銀行家算法函數(shù) void main(){input();safealg();banker();}

      //*************初始化算法*************** void input(){ int i,j;

      //************自定義進(jìn)程數(shù)目與資源種類(lèi)******************* cout<<“***********************************n”;cout<<“*利用銀行家算法避免死鎖*n”;

      cout<<“*

      *n”;cout<<“************************************n”;cout<<“請(qǐng)輸入進(jìn)程的數(shù)目:”;cin>>m;cout<<“請(qǐng)輸入資源的種類(lèi):”;cin>>n;//*****輸入每個(gè)進(jìn)程對(duì)每種資源的最大需求、已經(jīng)獲得的數(shù)量、每種類(lèi)型資源的數(shù)目

      cout<<“各進(jìn)程資源最大需求(Max),按照”<

      cout<<“P”<

      for(j=0;j

      {

      cin>>MAX[i][j];

      if(j==n)

      cout<<“資源種類(lèi)數(shù)匹配出現(xiàn)錯(cuò)誤!”;//當(dāng)資源配置的種類(lèi)數(shù)大于預(yù)先輸入的數(shù)值時(shí),出錯(cuò)

      } } cout<<“各進(jìn)程當(dāng)前獲得資源(Allocation),按照”<

      cout<<“P”<

      for(j=0;j

      {

      cin>>Allocation[i][j];

      if(j==n)

      cout<<“資源種類(lèi)數(shù)匹配出現(xiàn)錯(cuò)誤!”;//當(dāng)資源配置的種類(lèi)數(shù)大于預(yù)先輸入的數(shù)值時(shí),出錯(cuò)

      Need[i][j]=MAX[i][j]-Allocation[i][j];//需求數(shù)等于最大需求減去已經(jīng)分配數(shù)

      } } cout<<“系統(tǒng)可用資源(Available):”<

      cin>>Available[j];//輸入各種資源的可利用數(shù)

      } cout<<“當(dāng)前時(shí)刻的進(jìn)程分配情況如圖:n”;cout<<“進(jìn)程號(hào)-”<<“MAX----”<<“Allocation---”<<“Need--”<<“Available---n”;//顯示各進(jìn)程的資源情況

      for(i=0;i

      cout<<“P”<

      for(j=0;j

      cout<<“ ”<

      for(j=0;j

      cout<<“ ”<

      cout<<“ ”;

      for(j=0;j

      cout<<“ ”<

      for(j=0;j

      cout<<“ ”<

      cout<

      } } //*****************銀行家算法,為進(jìn)程分配資源***********// void banker(){ int i,j;

      int choice;

      while(1)

      {

      cout<

      cout<<“輸入要進(jìn)行的操作(1:分配資源

      2:離開(kāi)):”;

      //用戶(hù)選擇

      cin>>choice;

      if(choice==1)

      //分配資源

      {

      cout<<“從P0到P”<

      cin>>i;

      if(i>=m)

      {

      cout<<“無(wú)此進(jìn)程號(hào)!請(qǐng)重新輸入:n”;

      cin>>i;//重新輸入進(jìn)程號(hào)

      }

      cout<<“請(qǐng)輸入進(jìn)程申請(qǐng)的資源(Request):”<

      for(j=0;j

      cin>>Request[i][j];

      //**********銀行家算法進(jìn)行檢查*************//

      for(j=0;j

      {

      if(Request[i][j]>Need[i][j])

      {

      cout<<“申請(qǐng)的資源大于它需要的資源數(shù),請(qǐng)重新輸入!n”;//資源申請(qǐng)不合理

      continue;

      }

      if(Request[i][j]>Available[j])

      {

      //資源申請(qǐng)數(shù)目大于可利用數(shù),無(wú)法分配,得等待

      cout<<“當(dāng)前系統(tǒng)可用資源不夠,請(qǐng)等待!”<

      continue;

      }

      }

      for(j=0;j

      {

      Available[j]=Available[j]-Request[i][j];

      //可用資源減少

      Allocation[i][j]=Allocation[i][j]+Request[i][j];//所得資源增加

      Need[i][j]=Need[i][j]-Request[i][j];

      //仍需資源減少

      }

      if(safealg()<0)//安全性算法的返回值

      {

      cout<<“分配不成功,請(qǐng)等待!”;

      for(j=0;j

      //把資源恢復(fù)成分配之前的狀態(tài)

      {

      Available[j]=Available[j]+Request[i][j];

      Allocation[i][j]=Allocation[i][j]-Request[i][j];

      Need[i][j]=Need[i][j]+Request[i][j];

      }

      for(i=0;i

      {

      Finish[i]=False;//沒(méi)有足夠的資源分配給該進(jìn)程

      }

      }//if(safealg()<0)

      else

      {

      cout<<“同意分配請(qǐng)求!”<

      for(j=0;j

      Work[j]=Available[j];

      cout<<“進(jìn)程號(hào)-”<<“--Work----”<<“Need---”<<“Allocation---”<<“Work+Allocation--”

      <<“Finish--”<

      for(i=0;i

      {

      cout<<“進(jìn)程P”<

      for(j=0;j

      cout<

      cout<<“ ”;

      for(j=0;j

      cout<

      cout<<“ ”;

      for(j=0;j

      cout<

      cout<<“

      ”;

      for(j=0;j

      cout<

      cout<<“

      ”;

      cout<

      for(j=0;j

      Work[j]=Allocation[Sequence[i]][j]+Work[j];//回收該進(jìn)程所分配的資源

      cout<

      }

      }//if(safealg()>=0)

      }//if(choice=1)

      else if(choice==2)

      //離開(kāi)————

      break;

      else cout<<“請(qǐng)輸入1或2!”;//只認(rèn)可1或2 }//while(1)} //*********安全性算法 ************// int safealg(){

      int i,j,k,l=0;

      //int Work[MAXn];

      //工作組

      //記錄序列

      for(i=0;i

      Work[i]=Available[i];

      //工作分配初始化為系統(tǒng)可用資源

      for(i=0;i

      //掃描所有進(jìn)程,預(yù)設(shè)所有進(jìn)程不能運(yùn)行

      {

      Finish[i]=False;

      }

      for(i=0;i

      { //

      if(Finish[i]==True)

      {

      continue;

      }

      else //對(duì)于未運(yùn)行的進(jìn)程,進(jìn)行如下處理

      {///

      for(j=0;j

      {

      if(Need[i][j]>Work[j])//由于部分資源得不到滿(mǎn)足,進(jìn)程i無(wú)法運(yùn)行

      { 的資源

      用資源

      }

      break;

      } }

      if(j==n)//進(jìn)程各類(lèi)資源全部得到滿(mǎn)足

      {

      Finish[i]=True;

      for(k=0;k

      { Work[k]+=Allocation[i][k];//工作分配加上可

      }

      Sequence[l++]=i;

      //模擬資源分配序列生成 i=-1;

      //重新掃描所有進(jìn)程從i=0開(kāi)始

      }

      else

      { //某一資源得不到滿(mǎn)足

      continue;//試探下一個(gè)進(jìn)程

      } }// if(l==m)//都試探完畢

      {

      cout<<“系統(tǒng)安全!”<

      cout<<“安全序列:”;

      for(i=0;i

      //輸出安全序列

      cout<<“進(jìn)程P”< ”;

      cout<

      return 0;} }// cout<<“系統(tǒng)進(jìn)入不安全狀態(tài)!”<

      分析:輸入各進(jìn)程的可利用資源Available,最大需求MAX,已分配資源Allocation,需求資源Need,之后各系統(tǒng)發(fā)出資源請(qǐng)求Request,利用實(shí)驗(yàn)中的安全性算法判斷能否產(chǎn)生一個(gè)安全性隊(duì)列,若能,則給該進(jìn)程分配成功,否則,不予分配。在確定安全序列的過(guò)程中,要檢測(cè)所有進(jìn)程的Finish[i]的值,每次循環(huán)檢測(cè)完后要重復(fù)從第一個(gè)進(jìn)程開(kāi)始。

      七、運(yùn)行結(jié)果 假設(shè)輸入進(jìn)程個(gè)數(shù)為5,資源種類(lèi)數(shù)為3,并以此輸入各進(jìn)程初始時(shí)刻的各種資源數(shù)量,如下

      若再繼續(xù)申請(qǐng)資源,假設(shè)為P4,申請(qǐng)資源(1 2 2)

      假設(shè)P1 申請(qǐng)資源(2 2 4)有

      八、心得體會(huì)

      經(jīng)過(guò)這次操作系統(tǒng)課程設(shè)計(jì),讓我受益匪淺,收獲頗多。主要體會(huì)如下: 1.利用Vc++編譯程序編寫(xiě)銀行家算法,進(jìn)一步理解到通過(guò)銀行家算法避免死鎖的思想,同時(shí)也理解了系統(tǒng)死鎖產(chǎn)生的原因及條件。

      2.在實(shí)驗(yàn)過(guò)程中所有的設(shè)計(jì)步驟遵循老師教授的程序功能化的思想,分別定義了三個(gè)函數(shù),init()初始化函數(shù),safealg()安全性算法函數(shù),bank()銀行家算法函數(shù),體現(xiàn)了函數(shù)的模塊化思想。這樣的話(huà),不僅提高了程序的可讀性和可操作性,而且還提高了CPU的利用率和內(nèi)存的利用率,因?yàn)槌绦虻倪\(yùn)行是局部性的,這種思想對(duì)于段頁(yè)式存儲(chǔ)管理系統(tǒng)尤為重要。

      3.實(shí)驗(yàn)過(guò)程中遇到的種種疑難問(wèn)題通過(guò)自己上網(wǎng)查找答案,鍛煉了自己糾錯(cuò)能力和搜索有價(jià)值信息的能力及自學(xué)的能力,并且進(jìn)一步鞏固了自己以前學(xué)過(guò)的專(zhuān)業(yè)知識(shí)。

      下載操作系統(tǒng)實(shí)驗(yàn)報(bào)告-利用銀行家算法避免死鎖(推薦五篇)word格式文檔
      下載操作系統(tǒng)實(shí)驗(yàn)報(bào)告-利用銀行家算法避免死鎖(推薦五篇).doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        東南大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告--銀行家算法

        操作系統(tǒng)實(shí)驗(yàn)三:銀行家算法的實(shí)現(xiàn) 一、 基本信息: a) 實(shí)驗(yàn)題目:銀行家算法的實(shí)現(xiàn) b) 完成人姓名:韓璐璐 c) 學(xué)號(hào):71114115 d) 報(bào)告日期:2016.5.27 二、 實(shí)驗(yàn)?zāi)康?通過(guò)實(shí)驗(yàn),加深對(duì)......

        銀行家算法實(shí)驗(yàn)報(bào)告

        計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告 何美西109253030212 一、 實(shí)驗(yàn)名稱(chēng):銀行家算法 二、 實(shí)驗(yàn)?zāi)康模恒y行家算法是避免死鎖的一種重要方法,通過(guò)編寫(xiě)一個(gè)簡(jiǎn)單的銀行家算法程序,加深了解有關(guān)資......

        銀行家算法實(shí)驗(yàn)報(bào)告

        計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告 一、 實(shí)驗(yàn)名稱(chēng):銀行家算法 二、 實(shí)驗(yàn)?zāi)康模恒y行家算法是避免死鎖的一種重要方法,通過(guò)編寫(xiě)一個(gè)簡(jiǎn)單的銀行家算法程序,加深了解有關(guān)資源申請(qǐng)、避免死鎖等概......

        銀行家算法_實(shí)驗(yàn)報(bào)告

        課程設(shè)計(jì)報(bào)告 課程設(shè)計(jì)名稱(chēng) 共享資源分配與銀行家算法 系(部)專(zhuān)業(yè)班級(jí)姓 名學(xué) 號(hào)指導(dǎo)教師 年 月 日 第 1 頁(yè) 共 1 頁(yè) 、 目 錄 一、課程設(shè)計(jì)目的和意義 ........................

        操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告-用C++實(shí)現(xiàn)銀行家算法

        操 作 系 統(tǒng) 實(shí) 驗(yàn) 報(bào) 告 (2) 學(xué)院:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 班級(jí):計(jì)091 學(xué)號(hào):姓名: 時(shí)間:2011/12/30 目 錄 1. 實(shí)驗(yàn)名稱(chēng)……………………………………………………3 2. 實(shí)驗(yàn)?zāi)康摹?.....

        銀行家算法實(shí)驗(yàn)報(bào)告[推薦閱讀]

        實(shí)驗(yàn)三 銀行家算法 (1)死鎖產(chǎn)生的原因和必要條件是什么? 原因: a) 系統(tǒng)資源不足; b) 進(jìn)程運(yùn)行推進(jìn)的順序不合適; c) 資源分配不當(dāng)。 如果系統(tǒng)資源充足,進(jìn)程的資源請(qǐng)求都能夠得到滿(mǎn)......

        銀行家算法《操作系統(tǒng)》課程設(shè)計(jì)報(bào)告

        《操作系統(tǒng)》課程設(shè)計(jì)報(bào)告課題:銀行家算法專(zhuān)業(yè)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)生姓名班級(jí)計(jì)算機(jī)學(xué)號(hào)指導(dǎo)教師信息工程學(xué)院一、實(shí)驗(yàn)要求和實(shí)驗(yàn)?zāi)康膶?shí)驗(yàn)?zāi)康模罕菊n程設(shè)計(jì)是學(xué)生學(xué)習(xí)完《操作系......

        操作系統(tǒng)實(shí)驗(yàn)報(bào)告(clock算法)

        實(shí)驗(yàn)四 頁(yè)面置換算法 一、實(shí)驗(yàn)?zāi)康?本實(shí)驗(yàn)主要對(duì)操作系統(tǒng)中請(qǐng)求分頁(yè)式內(nèi)存管理及其應(yīng)用的一些關(guān)鍵算法進(jìn)行模擬。學(xué)生通過(guò)設(shè)計(jì)與實(shí)現(xiàn)Clock算法,能夠加強(qiáng)對(duì)相應(yīng)理論的理解,并對(duì)......