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

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

计算机操作系统实验报告题目利用银行家算法避免死锁

一、实验目得:

1、加深了解有关资源申请、避免死锁等概念,并体会与了解死锁与避免死锁得具体实施方法。

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

二、实验内容:

用银行家算法实现资源分配:

设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}得系统,例如,{A,B,C}得资源数量分别为10,5,7。进程可动态地申请资源与释放资源,系统按进程得申请动态地分配资源,要求程序具有显示与打印各进程得某一个时刻得资源分配表与安全序列;显示与打印各进程依次要求申请得资源号以及为某进程分配资源后得有关资源数据。

三、问题分析与设计:

1、算法思路:

先对用户提出得请求进行合法性检查,即检查请求就是否大于需要得,就是否大于可利用得。若请求合法,则进行预分配,对分配后得状态调用安全性算法进行检查。若安全,则分配;若不安全,则拒绝申请,恢复到原来得状态,拒绝申请。

2、银行家算法步骤:

(1)如果Requesti

(2)如果Request

(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

如找到,执行步骤(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]、getTex

t());

}

?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。

2、程序直接初始化了6个进程框,既浪费了内存空间,又对可视化界面得美观造成影响。

3、未对输入异常进行处理:比如在请求资源得第一个方框中只能填入进程得数字编号,当填入得为非整数时,程序会抛出异常。

4、未解决进程名中对字符串得处理,直接固定进程名为数字,用户不能直接输入原有得进程名,造成不好得用户体验。

银行家算法实验报告

操作系统 (实验报告) 银行家算法姓名:***** 学号:***** 专业班级:***** 学验日期:2011/11/22 指导老师:***

一、实验名称: 利用银行家算法避免死锁 二、实验内容: 需要利用到银行家算法,来模拟避免死锁:设计M个进程共享N类资源,M个进程可以动态的申请资源,并可以判断系统的安全性,进行打印出,相应的安全序列和分配表,以及最后可用的各资源的数量。 三、实验目的: 银行家算法是一种最有代表性的避免死锁的算法,在避免死锁的方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。 为实现银行家算法,系统必须设置若干数据结构,所以通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁,产生死锁的必要条件,安全状态等重要的概念,并掌握避免死锁的具体实施方法。 四、实验过程 1.基本思想: 我们可以把操作系统看成是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程申请到资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过再测试系统现资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。 安全状态就是如果存在一个由系统中所有进程构成的安全序列P1……则系统处于安全状态。安全状态是没有死锁发生。而不安全状态则是不存在这样一个安全序列,从而一定会导致死锁。 2.主要数据结构: (1)可利用资源向量Available.这是一个含有m个元素的数组,其中的每一个 元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类的资源的分配和回收而动态地改变,如果Available[j]=K,则表示系统中现有Rj类资源K个。 (2)最大需求矩阵Max.这是一个n*m的矩阵,定义了系统中n 个进程中的每 一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K. (3)分配矩阵Allocation.这也是一个n*m的矩阵,它定义了系统中每一类资源

操作系统之调度算法和死锁中的银行家算法习题答案

操作系统之调度算法和死锁中的银行家算法习 题答案 集团文件发布号:(9816-UATWW-MWUB-WUNN-INNUL-DQQTY-

1. 有三个批处理作业,第一个作业 10:00 到达,需要执行 2 小时;第二个作业在10:10到达,需要执行 1 小时;第三个作业在 10:25 到达,需要执行 25 分钟。分别采用先来先服 务,短作业优先和最高响应比优先三种调度算法,各自的平均周转时间是多少?解: 先来先服务: (结束时间=上一个作业的结束时间+执行时间 周转时间=结束时间-到达时间=等待时间+执行时间) 按到达先后,执行顺序:1->2->3 短作业优先: 1)初始只有作业1,所以先执行作业1,结束时间是12:00,此时有作业2和3; 2)作业3需要时间短,所以先执行; 3)最后执行作业2 最高响应比优先:

高响应比优先调度算法既考虑作业的执行时间也考虑作业的等待时间,综合了先来先服务和最短作业优先两种算法的特点。 1)10:00只有作业1到达,所以先执行作业1; 2)12:00时有作业2和3, 作业2:等待时间=12:00-10:10=110m;响应比=1+110/60=2.8; 作业3:等待时间=12:00-10:25=95m,响应比=1+95/25=4.8; 所以先执行作业3 3)执行作业2 2. 在一单道批处理系统中,一组作业的提交时刻和运行时间如下表所示。试计算一下三种 作业调度算法的平均周转时间 T 和平均带权周转时间 W。 ( 1)先来先服务;( 2)短作业优先( 3)高响应比优先 解: 先来先服务: 作业顺序:1,2,3,4 短作业优先: 作业顺序:

操作系统死锁练习及答案

死锁练习题 (一)单项选择题 l系统出现死锁的根本原因是( )。A.作业调度不当B.系统中进程太多C.资源的独占性D.资源管理和进程推进顺序都不得当 2.死锁的防止是根据( )采取措施实现的。A.配置足够的系统资源B.使进程的推进顺序合理C.破坏产生死锁的四个必要条件之一D.防止系统进入不安全状态 3.采用按序分配资源的策略可以防止死锁.这是利用了使( )条件不成立。A.互斥使用资源B循环等待资源c.不可抢夺资源D.占有并等待资源 4.可抢夺的资源分配策略可预防死锁,但它只适用于( )。A.打印机B.磁带机c.绘图仪D.主存空间和处理器 5.进程调度算法中的( )属于抢夺式的分配处理器的策略。A.时间片轮转算法B.非抢占式优先数算法c.先来先服务算法D.分级调度算法 6.用银行家算法避免死锁时,检测到( )时才分配资源。A.进程首次申请资源时对资源的最大需求量超过系统现存的资源量B.进程己占用的资源数与本次申请资源数之和超过对资源的最大需求量c.进程已占用的资源数与本次申请的资源数之和不超过对资源的最大需求量,且现存资源能满足尚需的最大资源量D进程已占用的资源数与本次申请的资源数 之和不超过对资源的最大需求量,且现存资源能满足本次申请量,但不能满足尚需的最大资源量 7.实际的操作系统要兼顾资源的使用效率和安全可靠,对资源的分配策略,往往采用( )策略。A死锁的防止B.死锁的避免c.死锁的检测D.死锁的防止、避免和检测的混合(二)填空题 l若系统中存在一种进程,它们中的每一个进程都占有了某种资源而又都在等待其中另一个进程所占用的资源。这种等待永远不能结束,则说明出现了______。2.如果操作系统对 ______或没有顾及进程______可能出现的情况,则就可能形成死锁。3.系统出现死锁的四

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

计算机操作系统实验报告 题目利用银行家算法避免死锁 一、实验目的: 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

实验二 银行家算法报告

昆明理工大学信息工程与自动化学院学生实验报告 (2011 —2012 学年第二学期) 一、实验目的和要求 银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 二、实验内容 1.设计进程对各类资源最大申请表示及初值确定。 2.设定系统提供资源初始状况。 3.设定每次某个进程对各类资源的申请表示。 4.编制程序,依据银行家算法,决定其申请是否得到满足。 三、实验说明 1.数据结构 假设有M个进程N类资源,则有如下数据结构: MAX[M*N] M个进程对N类资源的最大需求量 AVAILABLE[N] 系统可用资源数 ALLOCATION[M*N] M个进程已经得到N类资源的资源量 NEED[M*N] M个进程还需要N类资源的资源量 2.银行家算法 设进程I提出请求Request[N],则银行家算法按如下规则进行判断。 (1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。 (2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: AVAILABLE=AVAILABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST

NEED=NEED-REQUEST (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。 3.安全性检查 (1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE (2)从进程集合中找到一个满足下述条件的进程, FINISH[i]=FALSE NEED<=WORK 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 WORK=WORK+ALLOCATION FINISH=TRUE GO TO 2 (4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。 四、程序流程图 初始化算法流程图:

银行家算法-实验报告

淮海工学院计算机工程学院实验报告书 课程名:《操作系统原理》 题目:银行家算法 班级: 学号: 姓名:

一、实验目的 银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。 实验环境 Turbo C 2.0/3.0或VC++6.0 实验学时 4学时,必做实验。 二、实验内容 用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形。进程可动态地申请资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。 三、实验说明 实验中进程的数量、资源的种类以及每种资源的总量Total[j]最好允许动态指定。初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(包括Need[i,j]、Available[j])则需要由程序根据已知量的值计算产生。 四、实验步骤 1、理解本实验中关于两种调度算法的说明。 2、根据调度算法的说明,画出相应的程序流程图。 3、按照程序流程图,用C语言编程并实现。 五、分析与思考 1.要找出某一状态下所有可能的安全序列,程序该如何实现? 答:要找出这个状态下的所有可能的安全序列,前提是要是使这个系统先处于安全状态,而系统的状态可通过以下来描述: 进程剩余申请数=最大申请数-占有数;可分配资源数=总数-占有数之和; 通过这个描述来算出系统是否安全,从而找出所有的安全序列。 2.银行家算法的局限性有哪些?

操作系统课程设计----模拟银行家算法避免死锁

模拟通过银行家算法避免死锁 一、银行家算法产生的背景及目的 1:在多道程序系统中,虽然借助于多个进程的并发执行来改善系统的利用率,提高系统的吞吐量,但可能发生一种危险—死锁。死锁就是多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵局状态时,如无外力作用,他们将无法再向前进行,如再把信号量作为同步工具时,多个Wait和Signal 操作顺序不当,会产生进程死锁。 然而产生死锁的必要条件有互斥条件,请求和保持条件,不剥夺条件和环路等待条件。在预防死锁的几种方法中,都施加了较强的限制条件,在避免死锁的方法中,所施加的条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统都处于安全状态,便可避免死锁。2:实验目的:让学生独立的使用编程语言编写和调试一个系统分配资源的简单模拟程序,了解死锁产生的原因及条件。采用银行家算法及时避免死锁的产生,进一步理解课堂上老师讲的相关知识点。银行家算法是从当前状态出发,逐个按安全序列检查各客户中谁能完成其工作,然后假定其完成工作且归还全部贷款,再进而检查下一个能完成工作的客户。如果所有客户都能完成工作,则找到一个安全序列,银行家才是安全的。 二:银行家算法中的数据结构 1:可利用资源向量Available。这是一个含有m个元素的数组,其中的每个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态的改变。如果Available[j]=k,z 则表示系统中现有Rj类资源K 个。 2:最大需求矩阵Max。这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=k,表示第i个进程需要第Rj 类资源的最大数目k个. 3: 分配矩阵Allocation,也是n*m的矩阵,若Allocation[i,j]=k,表示第i 个进程已分配Rj类资源的数目为k个。 4:需求矩阵Need。也是一个n*m的矩阵,Need[i,j]=k,表示第i个进程还需Rj类资源k个。 三、银行家算法及安全性算法 1:银行家算法 设Request[i]是进程Pi的请求向量,若Request[i][j]=k;表示进程需要j类资源k个。当Pi发出资源请求时,系统按下属步骤进行检查; (1)如果Request[i][j]<=Need[i][j];便转向步骤(2),否则认为出错,因为它 所需要的资源数已超过他所宣布的最大值。 (2)如果Request[i][j]<=Available[i][j],便转向步骤(3),否则认为尚无足 够资源,进程需等待。

《操作系统原理》5资源管理(死锁)习题

第五章死锁练习题 (一)单项选择题 1.系统出现死锁的根本原因是( )。 A.作业调度不当B.系统中进程太多C.资源的独占性D.资源管理和进程推进顺序都不得当 2.死锁的防止是根据( )采取措施实现的。 A.配置足够的系统资源B.使进程的推进顺序合理 C.破坏产生死锁的四个必要条件之一D.防止系统进入不安全状态 3.采用按序分配资源的策略可以防止死锁.这是利用了使( )条件不成立。 A.互斥使用资源B循环等待资源C.不可抢夺资源D.占有并等待资源 4.可抢夺的资源分配策略可预防死锁,但它只适用于( )。 A.打印机B.磁带机C.绘图仪D.主存空间和处理器 5.进程调度算法中的( )属于抢夺式的分配处理器的策略。 A.时间片轮转算法B.非抢占式优先数算法C.先来先服务算法D.分级调度算法 6.用银行家算法避免死锁时,检测到( )时才分配资源。 A.进程首次申请资源时对资源的最大需求量超过系统现存的资源量 B.进程己占用的资源数与本次申请资源数之和超过对资源的最大需求量 C.进程已占用的资源数与本次申请的资源数之和不超过对资源的最大需求量,且现存资源能满足尚需的最大资源量 D进程已占用的资源数与本次申请的资源数之和不超过对资源的最大需求量,且现存资源能满足本次申请量,但不能满足尚需的最大资源量 7.实际的操作系统要兼顾资源的使用效率和安全可靠,对资源的分配策略,往往采用( )策略。 A死锁的防止B.死锁的避免C.死锁的检测D.死锁的防止、避免和检测的混合 (二)填空题 1.若系统中存在一种进程,它们中的每一个进程都占有了某种资源而又都在等待其中另一个进程所占用的资源。这种等待永远不能结束,则说明出现了______。 2.如果操作系统对______或没有顾及进程______可能出现的情况,则就可能形成死锁。 3.系统出现死锁的四个必要条件是:互斥使用资源,______,不可抢夺资源和______。 4.如果进程申请一个某类资源时,可以把该类资源中的任意一个空闲资源分配给进程,则说该类资源中的所有资源是______。 5.如果资源分配图中无环路,则系统中______发生。 6.为了防止死锁的发生,只要采用分配策略使四个必要条件中的______。 7.使占有并等待资源的条件不成立而防止死锁常用两种方法:______和______. 8静态分配资源也称______,要求每—个进程在______就申请它需要的全部资源。 9.释放已占资源的分配策略是仅当进程______时才允许它去申请资源。 10.抢夺式分配资源约定,如果一个进程已经占有了某些资源又要申请新资源,而新资源不能满足必须等待时、系统可以______该进程已占有的资源。 11.目前抢夺式的分配策略只适用于______和______。 12.对资源采用______的策略可以使循环等待资源的条件不成立。 13.如果操作系统能保证所有的进程在有限的时间内得到需要的全部资源,则称系统处于______。14.只要能保持系统处于安全状态就可______的发生。 15.______是一种古典的安全状态测试方法。 16.要实现______,只要当进程提出资源申请时,系统动态测试资源分配情况,仅当能确保系统安全时才把资源分配给进程。

实验6 银行家算法避免死锁

实验六银行家算法避免死锁 一.实验目的 1、加深对死锁概念的理解 2、能够利用银行家算法有效地避免死锁的发生、或检测死锁的存在 二.实验内容及步骤 本实验在winTC环境下实现,winTC安装程序在ftp上,请自行安装。 1.利用银行家算法写一个程序,判定系统的安全性。 已知某系统有5个进程P0,P1,P2,P3,P4,三类资源A、B、C。死锁检测程序工作时 0)。 #define m 3 #define n 5 main(){ int test(int av[],int ned[],all[]); int available[m]={0,0,0},need[n][m]; int allocation[n][m]={{0,1,0},{2,0,0},{3,0,3},{2,1,1},{0,0,2}};//已占有资源 int i,j,g=1; int finish[n]={0,0,0,0,0};//已完成的进程 clrscr();//清屏 printf(“please input the need resource data\n”); for(i=0;i

scanf(“%d”,&need[i][j]);//输入各个进程需要的资源 j=0; do{ for(i=0;i #define m 3 #define n 5 main() { int test(int av[],int ned[],int all[]); int available[m]={0,0,0},need[n][m]; int allocation[n][m]={{0,1,0},{2,0,0},{3,0,3},{2,1,1},{0,0,2}}; int i,j,g=1; int finish[n]={0,0,0,0,0}; //clrscr(); printf("please input the need resource data\n"); for(i=0;i

操作系统(死锁)试题

第五章死锁 一.选择题 1.为多道程序提供的可共享资源不足时,可能出现死锁。但是,不适当的 C 也可能产生死锁。 (A)进程优先权(B)资源的线性分配 (C)进程推进顺序(D)分配队列优先权 2.采用资源剥夺法可以解除死锁,还可以采用 B 方法解除死锁。 (A)执行并行操作(B)撤销进程 (C)拒绝分配新资源(D)修改信号量 3.产生死锁的四个必要条件是:互斥、 B 循环等待和不剥夺。 (A)请求与阻塞(B)请求与保持 (C)请求与释放(D)释放与阻塞 4.在分时操作系统中,进程调度经常采用算法。 (A)先来先服务(B)最高优先权 (C)时间片轮转(D)随机 5.资源的按序分配策略可以破坏条件。 (A)互斥使用资源(B)占有且等待资源 (C)非抢夺资源(D)循环等待资源 6.在 C 情况下,系统出现死锁。 (A)计算机系统发生了重大故障 (B)有多个封锁的进程同时存在 (C)若干进程因竞争而无休止地相互等待他方释放已占有的资源 (D)资源数远远小于进程数或进程同时申请的资源数量远远超过资源总数 7。银行家算法在解决死锁问题中是用于 B 的。 (A)预防死锁(B)避免死锁 (C)检测死锁(D)解除死锁 8.支持多道程序设计的操作系统在运行过程中,不断地选择新进程运行来实现CPU的共享,但其中不是引起操作系统选择新进程的直接原因。 (A)运行进程的时间片用完 (B)运行进程出错 (C)运行进程要等待某一事件发生 (D)有新进程进入就绪队列 9. 在下列解决死锁的方法中,属于死锁预防策略的是 B 。 (A)银行家算法 (B)有序资源分配法 (C)死锁检测法 (D)资源分配图化简法 二、综合题 1.若系统运行中出现如表所示的资源分配情况,改系统是否安全?如果进程P2此时提出资源申请(1,2,2,2),系统能否将资源分配给它?为什么?

实验二 银行家算法

实验四银行家算法 一、实验目的 1.理解死锁避免相关内容; 2.掌握银行家算法主要流程; 3.掌握安全性检查流程。 操作系统中的死锁避免部分的理论进行实验。要求实验者设计一个程序,该程序可对每一次资源申请采用银行家算法进行分配。 二、实验设备 PC机、windows 操作系统、VC++6.0 三、实验要求 本实验要求3学时完成。 1.设计多个资源(≥3); 2.设计多个进程(≥3); 3.设计银行家算法相关的数据结构; 4.动态进行资源申请、分配、安全性检测并给出分配结果。 5.撰写实验报告,并在实验报告中画出银行家算法和和安全性检查算法流程图。 四、预备知识 死锁避免定义:在系统运行过程中,对进程发出的每一个资源申请进行动态检查,并根据检查结果决定是否分配资源:若分配后系统可能发生死锁,则不予分配,否则予以分配。 由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。 1 系统安全状态 1)安全状态 所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并且依次地运行完毕,这种进程序列{ P1 ,P2 …Pn}就是安全序列。如果存在

这样一个安全序列,则系统是安全的。 并非所有的不安全状态都会转为死锁状态,但当系统进入不安全状态后,便有可能进入死锁状态;反之,只要系统处于安全状态,系统便可避免进入死锁状态。所以避免死锁的实质:系统在进行资源分配时,如何使系统不进入不安全状态。 2)安全状态之例 假设系统有三个进程,共有12台磁带机。各进程的最大需求和T0时刻已分配情况如下表: 答:T0时刻是安全的,因为存在安全序列:P2 →P1→ P3 不安全序列:P1→… P3→… P2→P3→P1 3)由安全状态向不安全状态的转换 如果不按照安全序列分配资源,则系统可能会由安全状态进入不安全状态。例如,在T0时刻以后,P3又请求1台磁带机,若此时系统把剩余3台中的1台分配给P3,则系统便进入不安全状态。因为,此时也无法再找到一个安全序列,例如,把其余的2台分配给P2,这样,在P2完成后只能释放出4台,既不能满足P1尚需5台的要求,也不能满足P3尚需6台的要求,致使它们都无法推进到完成,彼此都在等待对方释放资源,即陷入僵局,结果导致死锁。 2 利用银行家算法避免死锁 1)银行家算法中的数据结构 ①可利用资源向量Available。 这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该

银行家算法_实验报告

课程设计报告课程设计名称共享资源分配与银行家算法 系(部) 专业班级 姓名 学号 指导教师 年月日

目录 一、课程设计目的和意义 (3) 二、方案设计及开发过程 (3) 1.课题设计背景 (3) 2.算法描述 (3) 3.数据结构 (4) 4.主要函数说明 (4) 5.算法流程图 (5) 三、调试记录与分析 四、运行结果及说明 (6) 1.执行结果 (6) 2.结果分析 (7) 五、课程设计总结 (8)

一、程设计目的和意义 计算机科学与技术专业学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,其目的在于加深催操作系统基础理论和基本知识的理解,加强学生的动手能力.银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法 二、方案设计及开发过程 1.课题设计背景 银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。这时系统将该进程从进程集合中将其清除。此时系统中的资源就更多了。反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。请进程等待 2.算法描述 1)如果Request[i] 是进程Pi的请求向量,如果Request[i,j]=K,表示进程Pi 需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查: 如果Requesti[j]<= Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。 2)如果Requesti[j]<=Available[j],便转向步骤3,否则,表示尚无足够资源,进程Pi须等待。 3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值: Available[j]:=Available[j]-Requesti[j]; Allocation[i,j]:=Allocation[i,j]+Requesti[j]; Need[i,j]:=Need[i,j]-Requesti[j];

操作系统之调度算法和死锁中的银行家算法习题答案

1.有三个批处理作业,第一个作业10:00 到达,需要执行2 小时;第二个作业在10:10 到达,需要执行1 小时;第三个作业在10:25 到达,需要执行25 分钟。分别采用先来先服务,短作业优先和最高响应比优先三种调度算法,各自的平均周转时间是多少? 解: 先来先服务: (结束时间=上一个作业的结束时间+执行时间 周转时间=结束时间-到达时间=等待时间+执行时间) 短作业优先: 1)初始只有作业1,所以先执行作业1,结束时间是12:00,此时有作业2和3; 2)作业3需要时间短,所以先执行; 最高响应比优先: 高响应比优先调度算法既考虑作业的执行时间也考虑作业的等待时间,综合了先来先服务和最短作业优先两种算法的特点。 1)10:00只有作业1到达,所以先执行作业1; 2)12:00时有作业2和3, 作业2:等待时间=12:00-10:10=110m;响应比=1+110/60=2.8; 作业3:等待时间=12:00-10:25=95m,响应比=1+95/25=4.8; 所以先执行作业3 2.在一单道批处理系统中,一组作业的提交时刻和运行时间如下表所示。试计算一下三种作业调度算法的平均周转时间T 和平均带权周转时间W。 (1)先来先服务;(2)短作业优先(3)高响应比优先

解: 先来先服务: 短作业优先: 作业顺序: 1)8:00只有作业1,所以执行作业1; 2)9:00有作业2和3,作业3短,所以先执行3; 3)9:12有作业2和4,作业4短,所以先执行4; 高响应比优先: 作业顺序: 1)8:00只有作业1,所以执行作业1; 2)9:00有作业2和3 作业2等待时间=9:00-8:30=30m,响应比=1+30/30=2; 作业3等待时间=9:00-9:00=0m,响应比=1+0/12=1; 所以执行作业2; 3)9:30有作业3和4 作业3等待时间=9:30-9:00=30m,响应比=1+30/12=3.5; 作业4等待时间=9:30-9:06=24m,响应比=1+24/6=5;

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

操作系统实验报告利用 银行家算法避免死锁 Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】

计算机操作系统实验报告题目利用银行家算法避免死锁 一、实验目的: 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)从进程集合中找到一个能满足下述条件的进程:

《银行家算法的模拟实现》—实验报告

《银行家算法的模拟实现》 --实验报告 题目: 银行家算法的模拟实现 专业: 班级: 组员: 指导老师:

一、实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。 二、实验内容 模拟实现银行家算法实现死锁避免。要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵Need和可利用资源向量Available。 三、实验分析过程 1、整个银行家算法的思路。 先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。 1)进程一开始向系统提出最大需求量. 2)进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量. 3)若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的 剩余资源量,若不超出,则分配,否则等待 2、算法用到的主要数据结构和C语言说明。 (1)、可利用资源向量INT A V AILABLE[M] M为资源的类型。 (2)、最大需求矩阵INT MAX[N][M] N为进程的数量。 (3)、已分配矩阵INT ALLOCA TION[N][M] (4)、还需求矩阵INT NEED[N][N] (5)、申请各类资源数量int Request[x]; // (6)、工作向量int Work[x]; (7)、int Finish[y]; //表示系统是否有足够的资源分配给进程,0为否,非0为是 3、银行家算法(主程序) (1)、系统初始化。输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等 (2)、输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。 (3)、检查用户的请求是否小于还需求的数量,条件是K<=NEED[I,J]。如果条件不符则提示重新输入,即不允许索取大于需求量 (4)、检查用户的请求是否小于系统中的可利用资源数量,条件是K<=A V ALIABLE[I,J]。 如果条件不符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句) (5)、进行资源的预分配,语句如下: A V ALIBLE[I][J]= A V ALIBLE[I][J]-K; ALLOCATION[I][J]= ALLOCATION[I][J]+K; NEED[I][J]=NEED[I][J]-K;

计算机操作系统银行家算法实验报告

计算机操作系统实验报告 一、实验名称:银行家算法 二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写 一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 三、问题分析与设计: 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

软考-操作系统死锁与银行家算法

1、设系统中有3种类型的资源(A B C)和5个进程P1 P2 P3 P4 P5.已知A、B、C的总数量为[17,5,20],在T0时刻的状态如表所示。问: (1)T0时刻是否为安全状态?若是,则给出安全序列 解:是。安全序列为p4 p2 p3 p5 p1 进程工作需要已分配系统状态(2)T0时刻若P2请求【0,3,4】,能否实施分配?为什么?

解:不能实施分配,可用资源为负数

(3)在(2)的基础上P4又请求【2,0,1】,能否实施分配?为什么? 解:不能实施分配,可用资源为负数

(4)在(3)基础上P1又请求【0,2,0】,能否实施分配?为什么?解:不能实施分配,可用资源为负数 2、考虑一个有150个存储器单元的系统,如下分配给三个进程: 进程最大占有 1 70 45 2 60 40 3 60 15 使用银行家算法,以确定下面的任何一个请求是否安全: (1)第4个进程到达,最多需要60个存储单元,最初需要25个单

元; 解:安全序列:p1 p2 p3 p4 (2)第4个进程到达,最多需要60个存储单元,最初需要35个单元; 如果安全,请给出任一安全序列;若不安全给出结果分配简表。解:安全序列:p2 p1 p3 p4

?3.操作系统分配资源时的一个主要考虑是避免死锁的发生。 ?若系统中有同类资源16个,有4个进程p1、p2、p3、p4共享该资源。 ?已知p1、p2、p3、p4所需的资源总数分别为8、5、9、6。?各进程请求资源的次序如表所示,若系统采用银行家算法为他们分配资源,那么____次申请分配会使系统进入不安全状态下表为进程申请资源的情况 ?序号进程申请量 ? 1 P1 6 ? 2 P2 4 ? 3 P3 5

操作系统实验四-银行家算法

银行家算法 xxx 711103xx 2012年5月21日一、实验目的 通过实验,加深对多实例资源分配系统中死锁避免方法——银行家算法的理解,掌握Windows环境下银行家算法的实现方法,同时巩固利用Windows API进行共享数据互斥访问和多线程编程的方法。 二、实验内容 1. 在Windows操作系统上,利用Win32 API编写多线程应用程序实现银行家算法。 2. 创建n个线程来申请或释放资源,只有保证系统安全,才会批准资源申请。 3. 通过Win32 API提供的信号量机制,实现共享数据的并发访问。 三、实验步骤(设计思路和流程图) 最主要的用以实现系统功能的应该有两个部分,一是用银行家算法来判断,二是用安全性算法来检测系统的安全性。 1、银行家算法 设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi 需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:

(1) 如果Requesti[j]≤Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。 (2) 如果Requesti[j]≤Available[j],便转向步骤(3);否则,表示尚无足够资源,Pi须等待。 (3) 系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:Available[j]∶=Available[j]-Requesti[j]; Allocation[i,j]∶=Allocation[i,j]+Requesti[j]; Need[i,j]∶=Need[i,j]-Requesti[j]; (4) 系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。 2、安全性算法 (1) 设置两个向量:①Work∶=Available; ②Finish (2) 从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false; ②Need[i,j]≤Work[j];若找到,执行步骤(3),否则,执行步骤(4)。(3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work[j]∶=Work[i]+Allocation[i,j]; Finish[i]∶=true; go to step 2; (4) 如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

计算机操作系统练习题及答案

单项选择 1. 两个进程合作完成一项任务。在并发执行中,一个进程要等待其合作伙伴发来消息,或建立某个条件后再运行,这种制约性合作关系被称为进程的—A—。 A.同步 B.执行 C.互斥 D.调度 2. 为了进行进程协调,进程之间应当具有一定的联系,这种联系通常采用进程间交换数据的方式进行,这种方式通常称为—C—。 A. 进程互斥 B. 进程同步 C. 进程通信 D. 进程制约 3. 除了因为资源不足,进程竞争资源可能出现死锁外,不适当的—C—也可能产生死锁。 A.进程优先权 B.资源线性分配 C.进程推进顺序 D.分配队列优先权 4. 除了可以采用资源剥夺法解除死锁外,还可以采用—C—方法解除死锁。 A.修改信号量 B.拒绝分配新的资源 C.撤消进程 D.执行并行操作 5. 资源的按序分配策略可以破坏—D—条件。 A. 互斥 B. 请求与保持 C. 不剥夺 D. 环路等待 6. 在—C—的情况下,系统出现死锁。 A. 计算机系统发生了重大故障 B. 有多个阻塞的进程存在 C. 若干个进程因竞争资源而无休止地相互等待他方释放已占有的资源 D. 资源数远小于进程数或进程同时申请的资源数远超过资源总数 7.某系统中有3个进程,都需要同类资源4个,试问该系统不会发生死锁的最少资源数是—B—。 A.9 B.10 C.11 D.12 8. 银行家算法是一种—B—算法。 A. 解除死锁 B.避免死锁 C. 预防死锁 D. 检测死锁 9. 在下列解决死锁的方法中,属于死锁预防策略的是—B—。 A. 银行家算法 B. 资源有序分配 C. 死锁检测法 D. 资源分配图化简法 10. 设有n个进程共用一个相同的程序段(临界区),如果每次最多允许m个进程(m≤n)同时进入临界区,则信号量的初值应为—B—。 A. n B. m C. m-n D. -m 11.死锁定理是用于处理死锁的哪一种方法—C—。 A.预防死锁 B.避免死锁 C.检测死锁 D.解除死锁 12. AND信号量集机制是为了—C—。 A. 信号量的集中使用 B. 解决结果的不可再现性问题 C. 防止系统的不安全性 D. 实现进程的相互制约 13.临界区是指—A—。

相关文档
最新文档