当前位置:文档之家› 银行家算法的java编程实现

银行家算法的java编程实现

银行家算法的java编程实现
银行家算法的java编程实现

/*死锁避免和死锁检测模拟程序【银行家算

法】网络工程06-3班学号:310609040308*/

import java.util.*;

public class TestTheBanker {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

TheBanker tb = new TheBanker();

tb.deadlockAvoidance();//死锁避免

int gate = 1;

while(gate!=0){

tb.deadlockDetection();//死锁检测

System.out.println("如果您要继续分配资源请输入\"1\",退出请输入\"0\"");

System.out.print("您输入的值为:");

gate = scanner.nextInt();

System.out.println();

}

System.out.println("使用愉快!期待您下次使用!");

}

}

class TheBanker{

int m;

int n;

int[][] max;

int[][] maxbak;//备份用

int[][] allocation;

int[][] allocationbak;//备份用

int[][] need;

int[][] needbak;//备份用

int[] available;

int[] availablebak;//备份用

public TheBanker(){

Scanner s = new Scanner(System.in);

System.out.println("初始化==============");

System.out.print("请依次输入系统中的【进程数】和【资源类型数】:");

m = s.nextInt();

n = s.nextInt();

max =new int[m][n];

maxbak = new int[m][n];

allocation = new int[m][n];

allocationbak = new int[m][n];

need = new int[m][n];

needbak = new int[m][n];

available = new int[n];

availablebak = new int[n];

for(int i=0;i

System.out.print("请依次输入第" + i + "进程的各资源数:");

for(int j=0;j

max[i][j] = s.nextInt();

maxbak[i][j] = max[i][j];

}

}

for(int i=0;i

System.out.print("请依次输入第" + i + "进程中已分配资源的数量:");

for(int j=0;j

allocation[i][j] = s.nextInt();

allocationbak[i][j] = allocation[i][j];

}

}

for(int i=0;i

for(int j=0;j

need[i][j] = max[i][j] - allocation[i][j];

needbak[i][j] = need[i][j];

}

}

for(int i=0;i

System.out.print("请输入系统中第" + i + "种资源的剩余量:");

available[i] = s.nextInt();

availablebak[i] = available[i];

}

System.out.println("初始化结果=============");

System.out.println(" MAX

ALLOCATION NEED AVAILABLE");

for(int i=0;i

System.out.print("P" + i + ": ");

for(int j=0;j

if(max[i][j]>9){//如果是两位数,控制格式,在数字前少输出一个" "。

System.out.print(max[i][j] + " ");

}else{

System.out.print(" " + max[i][j] + " ");

}

}

System.out.print(" ");

for(int j=0;j

if(allocation[i][j]>9){

System.out.print(allocation[i][j] + " ");

}else{

System.out.print(" " + allocation[i][j] + " ");

}

}

System.out.print(" ");

for(int j=0;j

if(need[i][j]>9){

System.out.print(need[i][j] + " ");

}else{

System.out.print(" " + need[i][j] + " ");

}

}

if(i==0){

System.out.print(" ");

for(int j=0;j

if(available[j]>9){

System.out.print(available[j] + " ");

}else{

System.out.print(" " + available[j] + " ");

}

}

}

System.out.println();

}

System.out.println("=====完成初始化=====");

System.out.println();

}

public void deadlockAvoidance(){

int[] security = new int[m];

boolean[] param = new boolean[m];

int[] tar = new int[n];

int count = 0;

int num1 = m+1;//计数器,每循环一遍所有进程就自减1

int num2 = m;//计数器,每遇到一个被满足的进程就自减1

while(num1>0){//如果num1==0,则说明依次循环下来没有能够满足的进程,因此中止

for(int i=0;i

if(param[i]==false){//只有没有被满足的进程才可以进入内层循环

param[i] = true;

for(int j=0;j

tar[j] = available[j] - need[i][j];

if(tar[j]<0){

param[i] = false;

}

}

if(param[i]==true){

for(int k=0;k

available[k] = available[k] + allocation[i][k];

}

security[count] = i;//记录以满足的进程号

count++;

num2--;

}

}

}

num1--;

while((num2==0)&&(num1>0)){

System.out.print("【安全序列】为:");

for(int i=0;i

if(i==(m-1)){

System.out.print("P" + security[i]);

}else{

System.out.print("P" + security[i] + "-->");

}

}

System.out.println();

System.out.println("=====【死锁避免】结束=====");

System.out.println();

return;

}

while((num1==0)&&(num2>0)){

System.out.println("抱歉!没有【安全序列】!");

System.out.println("=====【死锁避免】结束=====");

System.out.println();

}

}

}

public void deadlockDetection(){

Scanner sc = new Scanner(System.in);

int key;

int[] security = new int[m];

boolean[] param = new boolean[m];

int[] temp = new int[n];

int[] tar = new int[n];

int count = 0;

int num1 = m+1;//计数器,每循环一遍所有进程就自减1

int num2 = m;//计数器,每遇到一个被满足的进程就自减1

for(int i=0;i

for(int j=0;j

max[i][j] = maxbak[i][j];

allocation[i][j] = allocationbak[i][j];

need[i][j] = needbak[i][j];

available[j] = availablebak[j];

}

}

System.out.println();

System.out.println("死锁检测============");

System.out.println("如果您此时想申请系统资源请输入【进程号】和"+n+"种【资源量】,系统将帮您判断是否可行。");

System.out.print("您输入的进程号为:");

key = sc.nextInt();

for(int i=0;i

System.out.print("您要申请的第"+i+"种资源的数量为:");

temp[i] = sc.nextInt();

}

for(int i=0;i

allocation[key][i] = allocation[key][i] + temp[i];

need[key][i] = need[key][i] - temp[i];

if(need[key][i]<0){

System.out.println("申请资源大于所需资源,系统【不能】分配资源!");

for(int k=0;k

for(int j=0;j

if(k==0){

available[j] = availablebak[j];

max[k][j] = maxbak[k][j];

allocation[k][j] = allocationbak[k][j];

need[k][j] = needbak[k][j];

}

}

return;

}

available[i] = available[i] - temp[i];

if(available[i]<0){

System.out.println("申请资源大于系统所剩资源,系统【不能】分配资源!");

for(int k=0;k

for(int j=0;j

if(k==0){

available[j] = availablebak[j];

}

max[k][j] = maxbak[k][j];

allocation[k][j] = allocationbak[k][j];

need[k][j] = needbak[k][j];

}

}

return;

}

}

System.out.println("申请资源时各进程的状态=============");

System.out.println(" MAX

ALLOCATION NEED AVAILABLE");

for(int i=0;i

System.out.print("P" + i + ": ");

for(int j=0;j

if(max[i][j]>9){

System.out.print(max[i][j] + " ");

}else{

System.out.print(" " + max[i][j] + " ");

}

}

System.out.print(" ");

for(int j=0;j

if(allocation[i][j]>9){

System.out.print(allocation[i][j] + " ");

}else{

System.out.print(" " + allocation[i][j] + " ");

}

System.out.print(" ");

for(int j=0;j

if(need[i][j]>9){

System.out.print(need[i][j] + " ");

}else{

System.out.print(" " + need[i][j] + " ");

}

}

if(i==0){

System.out.print(" ");

for(int j=0;j

if(available[j]>9){

System.out.print(available[j] + " ");

}else{

System.out.print(" " + available[j] + " ");

}

}

}

System.out.println();

}

System.out.println("=====完成状态展示=====");

System.out.println();

while(num1>0){//如果num1==0,则说明依次循环下来没有能够满足的进程,因此中止

for(int i=0;i

if(param[i]==false){//只有没有被满足的进程才可以进入内层循环

param[i] = true;

for(int j=0;j

tar[j] = available[j] - need[i][j];

if(tar[j]<0){

param[i] = false;

}

}

if(param[i]==true){

for(int k=0;k

available[k] = available[k] + allocation[i][k];

}

security[count] = i;//记录以满足的进程号

count++;

num2--;

}

}

}

num1--;

while((num2==0)&&(num1>0)){

System.out.print("【安全序列】为:");

for(int i=0;i

if(i==(m-1)){

System.out.print("P" + security[i]);

}else{

System.out.print("P" + security[i] + "-->");

}

}

System.out.println();

System.out.println("可以产生新的安全序列!系统【能】将申请的资源分配给P"+ key +"!");

System.out.println("=====死锁检测结束=====");

System.out.println();

return;

}

while((num1==0)&&(num2>0)){

System.out.println("抱歉!【没有】安全序列!");

System.out.println("系统【不能】将申请的资源分配给P"+ key +"!");

System.out.println("=====死锁检测结束=====");

System.out.println();

return;

}

}

}

}

银行家算法实验报告

操作系统 (实验报告) 银行家算法姓名:***** 学号:***** 专业班级:***** 学验日期: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的矩阵,它定义了系统中每一类资源

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

南通大学 杏林学院 操作系统实验(用银行家算法实现资源分配)班级:计121 小组成员:方筱雯1213023008 周徐莲1213023014 指导老师:丁卫平

一:实验目的 为了了解系统的资源分配情况,假定系统的任何一种资源在任一时刻只能被一个进程使用。任何资源已经占用的资源只能由自己释放,而不能由其他进程抢占。当进程申请的资源不能满足时,必须等待。因此,只要资源分配算法能保证进程的资源请求,且不出现循环等待,则系统不会出现死锁。 编写模拟系统进行资源调度的程序,采用银行家算法,有效的避免死锁的产生。模拟进程的分配算法,了解死锁的产生和避免的办法。二:实验要求 (1):为了观察死锁产生和避免的情况,要求设计3到4个并发进程,共享系统的10个同类不可抢占的资源。各进程是动态进行资源的申请和释放。 (2):用银行家算法设计一个资源分配程序,运行这个程序,观察系统运行情况,并对系统运行的每一步进行显示。三:实验流程图

四:源程序 #include #include #include #include #define MaxNumber 100 //定义进程控制块 struct Process_struct{ int Available[MaxNumber]; //可利用资源数组 int Max[MaxNumber][MaxNumber]; //最大需求矩陈 int Allocation[MaxNumber][MaxNumber]; //分配矩陈 int Need[MaxNumber][MaxNumber]; //需求矩陈 int Request[MaxNumber][MaxNumber]; //M个进程还需要N类资源的资源量 int Finish[MaxNumber]; int p[MaxNumber]; }Process; int M,N; //M个进程,N类资源 int i,j,k,l=0; int Work[MaxNumber]; //可利用资源 int Pinput(); int Safe(); int Peques(); //进程输入 int Pinput() { int i,j; cout<<"输入进程的数目:\n"; cin>>M; cout<<"输入资源的种类:\n"; cin>>N; cout<<"输入每个进程最多所需的各类资源数,按照"<>Process.Max[i][j]; cout<<"输入每个进程已经分配的各类资源数,按照"<

银行家算法-实验报告

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

一、实验目的 银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。 实验环境 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.银行家算法的局限性有哪些?

银行家算法

操作系统课程设计报告题目:银行家算法 院(系):计算机科学与工程学院 专业: 班级: 学生: 学号: 指导教师: 2011年12月

目录 摘要 (1) 绪论 (1) 1、需求分析 (1) 1.1银行家算法的提出 (1) 1.2 银行家算法设计思想 (1) 1.3银行家算法设计分析 (2) 2、概要设计 (3) 2.1主要的常量变量 (4) 2.2算法中用到的数据结构的说明 (8) 2. 3算法中用到的函数.......................................................................( 8) 2.4 银行家算法 (8) 2.5流程图.................................... . (9) 3、详细设计 (13) 4. 调试与测试 (8) 4.1测试数据 (8) 4.2.测试的结果: (9) 5、结论 (10) 参考文献 (10) 附录 (11)

摘要 在多道操作系统中,可以利用多个进程并发执行来改善系统资源利用率,提高系统的吞吐量,但也可能发生人们不想看到的危险——死锁。为了解决这个问题,人们引入了多种机制处理死锁问题。本文主要介绍了操作系统如何运用银行家算法和安全性算法避免死锁的产生。同时运用Java编程语言模拟计算机内部资源分配的过程。让读者对银行家算法有更深刻的认识。 关键字:死锁银行家算法安全性算法资源分配 1.需求分析. 1.1银行家算法的提出 本次课程设计主要解决的问题是死锁的避免。 死锁:是指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程将永远不能再向前推进。 避免死锁是在不破坏死锁产生的四个必要条件,在资源的动态分配中,防止进程进入可能发生死锁的不安全状态。 根据此原理,Dijkstra 于1965年提出了一个经典的避免死锁的算法----银行家算法(banker’s algorithm)。 银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。所以通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法. 1.2 银行家算法设计思.想 我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。 为保证资金的安全,银行家规定: (1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客; (2)顾客可以分歧贷款,但贷款的总数不能超过最大需求量; (3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可

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

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

一、实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。 二、实验内容 模拟实现银行家算法实现死锁避免。要求:初始数据(如系统在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;

编程序模拟银行家算法

武汉理工大学华夏学院课程设计报告书 课程名称:操作系统原理 题目:编程序模拟银行家算法 系名:信息工程系 专业班级:软件1121 姓名:钟伟 学号:10212812120 指导教师:苏永红 2014年 6 月13 日

武汉理工大学华夏学院信息工程系 课程设计任务书 课程名称:操作系统原理课程设计指导教师:苏永红 班级名称:软件1121 开课系、教研室:软件与信息安全 一、课程设计目的与任务 操作系统课程设计是《操作系统原理》课程的后续实践课程,旨在通过一周的实践训练,加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系统原理、Linux系统、C语言程序设计技术进行实际问题处理的能力,进一步提高学生进行分析问题 和解决问题的能力,包含系统分析、系统设计、系统实现和系统测试的能力。 学生将在指导老师的指导下,完成从需求分析,系统设计,编码到测试的全过程。 二、课程设计的内容与基本要求 1、课程设计题目 编程序模拟银行家算法 2、课程设计内容 本课程设计要求在Linux操作系统,GCC编译环境下开发。 银行家算法是避免死锁的一种重要方法,本实验要求用用c/c++语言在Linux操作系统 环境下编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存 资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。银行家 对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借 款后能在有限的时间内归还。用银行家算法分配资源时,测试进程对资源的最大需求量,若 现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个 进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限 的时间内得到所需资源则称系统处于安全状态。 3、设计报告撰写格式要求: 1设计题目与要求 2 设计思想 3系统结构 4 数据结构的说明和模块的算法流程图 5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明 6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况) 7 自我评价与总结 8 附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释;

银行家算法的java编程实现

/*死锁避免和死锁检测模拟程序【银行家算 法】网络工程06-3班学号:310609040308*/ import java.util.*; public class TestTheBanker { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); TheBanker tb = new TheBanker(); tb.deadlockAvoidance();//死锁避免 int gate = 1; while(gate!=0){ tb.deadlockDetection();//死锁检测 System.out.println("如果您要继续分配资源请输入\"1\",退出请输入\"0\""); System.out.print("您输入的值为:"); gate = scanner.nextInt(); System.out.println(); } System.out.println("使用愉快!期待您下次使用!"); } } class TheBanker{ int m; int n; int[][] max; int[][] maxbak;//备份用 int[][] allocation; int[][] allocationbak;//备份用 int[][] need; int[][] needbak;//备份用 int[] available; int[] availablebak;//备份用 public TheBanker(){ Scanner s = new Scanner(System.in); System.out.println("初始化=============="); System.out.print("请依次输入系统中的【进程数】和【资源类型数】:"); m = s.nextInt(); n = s.nextInt(); max =new int[m][n];

基于java的实验——银行家算法

仲恺农业工程学院实验报告纸 东哥 实验三银行家算法 一.实验目的: 1、理解死锁概念,以及死锁产生的必要条件。 2、理解银行家算法基本原理。 3、掌握一种资源和多种资源的银行家算法的设计与实现。 二.实验内容: 1、设计出管理的资源种类和数量 2、设计出银行家算法的基本数据结构 3、设计出完成该资源的银行家算法 4、设计出简单的进程创建、运行资源需求、结束的过程 5、采用高级语言实现该应用程序 三.实验步骤和过程 1.死锁基本概念 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。 2. 产生死锁的原因 (1.竞争资源引起进程死锁 当系统中供多个进程共享的资源如打印机、公用队列的等,其数目不

足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。 (2.进程推进顺序不当引起死锁 由于进程在运行中具有异步性特征,这可能使P1和P2两个进程按下述两种顺序向前推进。 (3. P或V操作不当、同类资源分配不均或对某些资源的使用未加限制等等。 3. 产生死锁的必要条件 1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。系统中存在临界资源,进程应互斥地使用这些进程。 2)占有和等待条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。 3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。 4)循环等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。造成这组进程处于永远的等待状态! 4、处理死锁的基本方法 1) 预防死锁。 这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。

操作系统课程设计(银行家算法的模拟实现)

操作系统课程设计 (银行家算法的模拟实现) 一、设计目的 1、进一步了解进程的并发执行。 2、加强对进程死锁的理解。 3、用银行家算法完成死锁检测。 二、设计内容 给出进程需求矩阵C、资源向量R以及一个进程的申请序列。使用进程启动拒绝和资源分配拒绝(银行家算法)模拟该进程组的执行情况。 三、设计要求 1、初始状态没有进程启动。 2、计算每次进程申请是否分配,如:计算出预分配后的状态情况(安全状态、不安全状态),如果是安全状态,输出安全序列。 3、每次进程申请被允许后,输出资源分配矩阵A和可用资源向量V。 4、每次申请情况应可单步查看,如:输入一个空格,继续下个申请。 四、算法原理 1、银行家算法中的数据结构

(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的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已经分得Rj类资源的数目为K。 (4)、需求矩阵Need。这也是一个n*m的矩阵,用以表示每个进程尚需要的各类资源数。如果Need[i,j]=K,则表示进程i还需要 Rj类资源K个,方能完成其任务。上述三个矩阵间存在以下关系:Need[i,j]=Max[i,j]-Allocation[i,j] 2、银行家算法应用 模拟实现Dijkstra的银行家算法以避免死锁的出现,分两部分组成:一是银行家算法(扫描);二是安全性算法。 (1)银行家算法(扫描) 设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Ri类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查: ①如果Requesti[j]<=Need[i,j],便转向步骤②;否则认为出错,

银行家算法设计实验报告

银行家算法设计实验报告

银行家算法设计实验报告 一.题目分析 1.银行家算法: 我们可以把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求资源相当于客户向银行家贷款。操作系统按银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程尚需求的资源量,若是系统现存的资源可以满足它尚需求的资源量,则按当前的申请量来分配资源,否则就推迟分配。 当进程在执行中继续申请资源时,先测试该进程申请的资源量是否超过了它尚需的资源量。若超过则拒绝分配,若没有超过则再测试系统尚存的资源是否满足该进程尚需的资源量,若满足即可按当前的申请量来分配,若不满足亦推迟分配。 2.基本要求: (1)可以输入某系统的资源以及T0时刻进程对资源的占用及需求情况的表项,以及T0时刻系统的可利用资源数。 (2)对T0时刻的进行安全性检测,即检测在T0时刻该状态是否安全。

(3)进程申请资源,用银行家算法对其进行检测,分为以下三种情况: A. 所申请的资源大于其所需资源,提示分配不合理不予分配并返回 B. 所申请的资源未大于其所需资源, 但大于系统此时的可利用资源,提 示分配不合理不予分配并返回。 C. 所申请的资源未大于其所需资源, 亦未大于系统此时的可利用资源,预 分配并进行安全性检查: a. 预分配后系统是安全的,将该进 程所申请的资源予以实际分配并 打印后返回。 b. 与分配后系统进入不安全状态,提示系统不安全并返回。 (4)对输入进行检查,即若输入不符合条件,应当报错并返回重新输入。 3.目的: 根据设计题目的要求,充分地分析和理解题 目,叙述系统的要求,明确程序要求实现的功能以及限制条件。 明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现银行家算法。

银行家算法的设计与实现(JAVA语言).doc

银行家算法的设计与实现(JAVA语言).doc 淘豆网网友近日为您收集整理了关于操作系统课程设计报告-银行家算法的设计与实现(java语言)的文档,希望对您的工作和学习 有所帮助.以下是文档介绍:操作系统课程设计报告题目:银行家算法的设计与实现院(系):计算机科学与工程学院专业:信息对抗专业班级:学生:学号:指导教师:2011年12月1基于计算机操作系统银行 家算法实现摘要此次课程设计的主要内容是模拟实现资源分配.同时要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生具体用 银行家算法实现资源分配.要求如下:(1)设计一个3个并发进程共享3类不同资源的系统,进程可动态地申请资源和释放资源,系统按各 进程的申请动态地分配资源.(2)设计用银行家算法和随机分配算法,实现资源分配的两个资源分配程序,应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况.(3)确定一组各进程依次 申请资源数的序列,在相同的情况下分别运行上述两种资源分配程序,观察运行结果.银行家算法是避免死锁的一种重要方法,本实验要求 用高级语言编写和调试一个简单的银行家算法程序.加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法.死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程占用:第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其他资源:第四个为循环等 待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别 等待它前一个进程所持有的资源.防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁.通过这个算法可用解决生 活中的实际问题,如银行贷款等.通过对这个算法的设计,让学生能够对书本知识有更深的理解,在操作和其它方面有更高的提升.关键词:死锁;安全状态;安全序列;银行家算法;安全性检查2目录1概述..................................................(3)1.1 设计目的....................................................(3)1.

银行家算法的实现

实验四银行家算法的实现 1、实验目的 通过编写和调试银行家算法的模拟程序以加深对避免死锁方案的理解。熟悉银行家算法的分配思想。 2、实验要求 设计一个银行家方案。并编写模拟程序实现之。已知系统总共的资源数、进程名、进程已分配的资源、进程运行完毕最大最资源的需求量,以书上例题为例,分析某一时刻系统的安全状态,如果安全,输出安全序列。 3、算法描述 银行家算法中数据结构如下: n :系统中的进程个数; m :系统中的资源类数。 1)Available(m):现有资源向量。 Available(j)=k表示k个未分配的j类资源 2)Max(n,m):资源最大申请量矩阵。 Max(i,j)=k表示第i个进程在运行过程中对第j类资源的最大申请量为k。 3)Allocation(n,m):资源分配矩阵。 Allocation(i,j)=k表示进程i已占有k个j类资源。 4)Need(n,m):进程以后还需要的资源矩阵。 Need(i,j)=k表示进程i以后还需要k个第j类资源。 显然有Need[i,j]=Max[i,j]-Allocation[i,j]。 5)Request(n,m):进程申请资源矩阵。 Request(i,j)=k表示进程i申请k个第j类资源。 银行家算法思想如下: 若进程i申请资源,申请资源向量为Request(i),则有如下资源分配过程: 1)如果Request(i)〉Need(i),则报错返回。 2)如果Request(i)〉Avaliable,则进程i进入等待资源状态,返回。 3)假设进程进程i的申请已获批准,于是修改系统状态: Avaliable=Avaliable-Request(i) Allocation(i)=Allocation(i)+Request(i) Need(i)=Need(i)-Request(i) 4)调用安全状态检查算法。 设Work(m)为临时工作向量。初始时Work=Available。令N={1,2,……n}。 寻求j∈N 使其满足:Need(j)<=Work,若不存在这样的j则转至3)。 Work=Work+Allocation(j)N=N-{j} 转至1)。 如果N=空集则返回(系统安全)。如果N≠空集则返回(系统不安全)。 5)若系统处于安全状态,则将进程i申请的资源分配给进程i,返回。 6)若系统处于不安全状态,则不将进程i申请的资源分配给进程i,恢复原来的资源分配状态,让进程i等待。 Avaliable = Avaliable + Request(i) Allocation(i)=Allocation(i)-Request(i) Need(i)=Need(i)+ Request(i) 4、源程序代码

银行家算法_实验报告

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

目录 一、课程设计目的和意义 (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、进一步了解进程的并发执行。 2、加强对进程死锁的理解。 3、用银行家算法完成死锁检测。 二、设计内容 给出进程需求矩阵C、资源向量R以及一个进程的申请序列。使用进程启动拒绝和资源分配拒绝(银行家算法)模拟该进程组的执行情况。 三、设计要求 1、初始状态没有进程启动。 2、计算每次进程申请是否分配,如:计算出预分配后的状态情况(安全状态、不安全状态),如果是安全状态,输出安全序列。 3、每次进程申请被允许后,输出资源分配矩阵A和可用资源向量V。 4、每次申请情况应可单步查看,如:输入一个空格,继续下个申请。 四、算法原理 1、银行家算法中的数据结构

(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的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已经分得Rj类资源的数目为K。 (4)、需求矩阵Need。这也是一个n*m的矩阵,用以表示每个进程尚需要的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。上述三个矩阵间存在以下关系: Need[i,j]=Max[i,j]-Allocation[i,j] 2、银行家算法应用 模拟实现Dijkstra的银行家算法以避免死锁的出现,分两部分组成:一是银行家算法(扫描);二是安全性算法。 (1)银行家算法(扫描) 设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示

实验二 银行家算法模拟

实验二银行家算法模拟 实验学时:2 实验类型:设计 实验要求:必修 一、实验目的 (1)进一步理解利用银行家算法避免死锁的问题; (2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。 (3)理解和掌握安全序列、安全性算法 二、实验内容 (1)了解和理解死锁; (2)理解利用银行家算法避免死锁的原理; (3)会使用某种编程语言。 三、实验原理 (一)安全状态 指系统能按照某种顺序如(称为序列为安全序列),为每个进程分配所需的资源,直至最大需求,使得每个进程都能顺利完成。 (二)银行家算法 假设在进程并发执行时进程i提出请求j类资源k个后,表示为Requesti[j]=k。系统按下述步骤进行安全检查: (1)如果Requesti≤Needi则继续以下检查,否则显示需求申请超出最大需求值的错误。(2)如果Requesti≤Available则继续以下检查,否则显示系统无足够资源,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等待。 (三)安全性算法 (1)设置两个向量: ①工作向量Work: 它表示系统可提供给进程继续运行所需的各类资源数目,它含有m 个元素,在执行安全算法开始时,Work∶=Available; ② Finish: 它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]∶=false; 当有足够资源分配给进程时,再令Finish[i]∶=true。 (2)从进程集合中找到一个能满足下述条件的进程: ① Finish[i]=false;

java实现银行家算法

实验名称银行家算法 一、实验目的 用高级语言编写和调试一个银行家算法程序,并可以利用银行家算法模拟分配资源以及进行安全性检查。加深对银行家算法的理解。 二、实验指导 1. 银行家算法中的数据结构 (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的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得R j类资源的数目为K (4) 需求矩阵Need。这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。 Need[i,j]=Max[i,j]-Allocation[i,j] 2. 银行家算法 设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等待。 3. 安全性算法

银行家算法实验报告

xx大学操作系统实验报告 姓名:学号:班级: 实验日期:实验名称:预防进程死锁的银行家算法 实验三预防进程死锁的银行家算法 1.实验目的:通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。理解银行家算法的运行原理,进一步掌握预防进程死锁的策略及对系统性能的评价方法。: 2. 需求分析 (1) 输入的形式和输入值的范围; 输入:首先输入系统可供资源种类的数量n 范围:0[Max]: 输入个进程已经申请的资源量[Allocation]: (2) 输出的形式 系统目前可用的资源[Avaliable]:

(显示系统是否安全) 分配序列: (3)程序所能达到的功能 通过手动输入资源种类数量和各进程的最大需求量、已经申请的资源量,运用银行家算法检测系统是否安全,若安全则给出安全序列,并且当用户继续输入某进程的资源请求时,能够继续判断系统的安全性。 (4) 测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。 正确输入

输入参数(已申请资源数)错误 3、概要设计 所有抽象数据类型的定义: int Max[100][100]; //各进程所需各类资源的最大需求int Avaliable[100]; //系统可用资源 char name[100] };//资源的名称 int Allocation[100][100]; //系统已分配资源 int Need[100][100] }; //还需要资源 int Request[100]; //请求资源向量 int temp[100]; //存放安全序列 int Work[100];//存放系统可提供资源 int M=100; //作业的最大数为100 int N=100; //资源的最大数为100 主程序的流程: * 变量初始化;

银行家算法课程设计报告

数学与计算机学院 课程设计说明书 课程名称: 操作系统原理-课程设计 课程代码: 8404061 题目: 银行家算法 年级/专业/班: 2009级软件工程2班 学生姓名: 闵地林 学号: 312009********* 开始时间:2011 年12 月05日 完成时间:2011 年12 月 25 日 课程设计成绩: 指导教师签名:年月日

目录 1 引言 (1) 1.1问题的提出 (1) 1.2任务与分析 (1) 2 需求分析 (1) 2.1数据的初始化 (1) 2.2银行家算法 (1) 2.3系统安全性的检测 (1) 2.4显示功能 (1) 2.5恢复功能 (1) 2.6菜单功能 (2) 3 程序运行平台 (2) 4 总体设计 (2) 5 详细设计 (2) 5.1数据的录入 (2) 5.2显示模块 (4) 5.3系统安全状态检测 (5) 5.4系统试为进程分配资源 (7) 5.5恢复函数 (8) 5.6菜单选项 (8) 6 系统测试 (9) 7 结论 (13) 参考文献 (15)

摘要 随着计算机的普及计算机的日新月异,计算机可以说在飞速的发展着,计算机领域的相关技术也越来越高,许多的技术得到了较好的改进,使计算机越来越满足人们的要求和生活习惯,这也是计算机得到飞速发展的原因之一,。随着计算机的发展,人们对计算机的需求也越来越高,为了防止用户操作过于平凡,导致计算机同一时刻进程过多而产生死锁,所以本次任务主要是编写银行家算法避免计算机产生死锁。经过分析,本次主要是银行家算法通用程序的编写,以及测试所跟进程状态的安全性,经查阅相关资料,了解了银行家算法的大体思路,经过设计流程图,用java语言,利用neatbean 6.9实现了银行家算法的通用程序,该程序具有输入进程资源以及计算机可利用资源的数量,即初始化。输出资源进程资源信息,检测系统安全性,进程请求资源,系统试为进程分配资源,不成功恢复资源等功能。因此银行家算法的各种功能基本已经实现。 关键词:银行家算法通用程序;计算机;避免死锁的算法

银行家算法C++代码实现

编号: 武汉大学计算机学院 课程实验(设计)报告 专业(班):计算机科学与技术计科6班 学号:2013301500217 姓名:张伟 课程名称:操作系统设计 任课教师:宋伟 2015年12 月22日

银行家算法实现 一、实习内容 编写实现银行家算法,实现资源的安全分配。 通过本实验熟悉银行家算法,对预防死锁有更深刻的认识。 二、实习题目 初始状态下,设置数据结构存储可利用资源向量(Available),最大需求矩阵(MAX),分配矩阵(Allocation),需求矩阵(Need),输入待分配进程队列和所需资源。 设计安全性算法,设置工作向量表示系统可提供进程继续运行的可利用资源数目。 如果进程队列可以顺利执行打印输出资源分配情况,如果进程队列不能顺利执行打印输出分配过程,提示出现死锁位置。 三、设计思想 数据结构 class process //定义进程 { public : bool finish = false; //完成状态 int need[max_resources]; //还需要分配的资源 int allocation[max_resources]; //已经分配的资源 int max_need[max_resources]; //最大需求量 int request[max_resources]; //本次需求量 public: process(int_need[max_resources], int_allocation[max_resources], int_max_need[max_resources]) { for (int i = 0; i < max_resources; i++) { need[i] = _need[i]; allocation[i] = _allocation[i]; max_need[i] = _max_need[i]; } } //构造函数 void set(int_need[max_resources], int_max_need[max_resources]) { for (int i = 0; i < max_resources; i++) { need[i] = _need[i]; allocation[i] = 0; max_need[i] = _max_need[i]; } } //赋值函数 process()

相关主题
文本预览
相关文档 最新文档