银行家算法C实现
银行家算法c语言流程图代码全
——银行家算法
院系 班级 学号 姓名
计算机与软件学院 08 软件工程 2 班
20081344066 何丽茗
一、实验目的
银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法 程序�进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念�并掌握避免死锁 的具体实施方法。
四、实验代码以及运行示例
1. 源代码�
#include<iostream>
#include<string.h>
#include<stdio.h>
#define False 0
#define True 1
using namespace std;
intMax[100][100]={0};//各进程所需各类资源的最大需求
for(j=0;j<N;j++)
cout<<Allocation[i][j]<<" ";
cout<<" ";
for(j=0;j<N;j++)
cout<<Need[i][j]<<" ";
cout<<endl;
}
}
intchangdata(inti)//进行资源分配 {
int j; for (j=0;j<M;j++) {
Y
i加1
提示 错误 重新 输入
所有进程运行 都结束
结束
初始化 need 矩阵 Y Need 矩阵为 0
N
任选一个进程作为当前进程
Need 向量为 0 N
银行家算法C语言代码
#include "malloc.h"#include "stdio.h"#include "stdlib.h"#define alloclen sizeof(struct allocation)#define maxlen sizeof(struct max)#define avalen sizeof(struct available)#define needlen sizeof(struct need)#define finilen sizeof(struct finish)#define pathlen sizeof(struct path)struct allocation{int value;struct allocation *next;};struct max{int value;struct max *next;};struct available /*¿ÉÓÃ×ÊÔ´Êý*/{int value;struct available *next;};struct need /*ÐèÇó×ÊÔ´Êý*/{int value;struct need *next;};struct path{int value;struct path *next;};struct finish{int stat;struct finish *next;};int main(){int row,colum,status=0,i,j,t,temp,processtest;struct allocation *allochead,*alloc1,*alloc2,*alloctemp;struct max *maxhead,*maxium1,*maxium2,*maxtemp;struct available *avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp ,*worktemp1;struct need *needhead,*need1,*need2,*needtemp;struct finish *finihead,*finish1,*finish2,*finishtemp;struct path *pathhead,*path1,*path2;printf("\nplease input the kinds of resourse:");scanf("%d",&colum);printf("please input the total number of the progress in the memory:");scanf("%d",&row);printf("please input the matrix of resourses that has allocated :\n"); for(i=0;i<row;i++){for (j=0;j<colum;j++){printf("Please input the number of system resources %c that has been allocated to process p%d:",'A'+j,i);if(status==0){allochead=alloc1=alloc2=(structallocation*)malloc(alloclen);alloc1->next=alloc2->next=NULL;scanf("%d",&allochead->value);status++;}else{alloc2=(struct allocation *)malloc(alloclen);scanf("%d,%d",&alloc2->value);if(status==1){allochead->next=alloc2;status++;}alloc1->next=alloc2;alloc1=alloc2;}}}alloc2->next=NULL;status=0;printf("please input the matrix of progress' maximumrequests:\n");for(i=0;i<row;i++){for (j=0;j<colum;j++){printf("Please input process p%d's maximum requests of system resources %c:",i,'A'+j);if(status==0){maxhead=maxium1=maxium2=(struct max*)malloc(maxlen); maxium1->next=maxium2->next=NULL;scanf("%d",&maxium1->value);status++;}else{maxium2=(struct max *)malloc(maxlen);scanf("%d,%d",&maxium2->value);if(status==1){maxhead->next=maxium2;status++;}maxium1->next=maxium2;maxium1=maxium2;}}}maxium2->next=NULL;status=0;printf("ÇëÊäÈëÏÖʱϵͳʣÓàµÄ×ÊÔ´¾ØÕó:\n");for (j=0;j<colum;j++){printf("ÖÖÀà %c µÄϵͳ×ÊÔ´Ê£Óà:",'A'+j);if(status==0){avahead=available1=available2=(structavailable*)malloc(avalen);workhead=work1=work2=(structavailable*)malloc(avalen);available1->next=available2->next=NULL;work1->next=work2->next=NULL;scanf("%d",&available1->value);work1->value=available1->value;status++;}else{available2=(struct available*)malloc(avalen); work2=(struct available*)malloc(avalen);scanf("%d,%d",&available2->value);work2->value=available2->value;if(status==1){avahead->next=available2;workhead->next=work2;status++;}available1->next=available2;available1=available2;work1->next=work2;work1=work2;}}available2->next=NULL;work2->next=NULL;status=0;alloctemp=allochead;maxtemp=maxhead;for(i=0;i<row;i++)for (j=0;j<colum;j++){if(status==0){needhead=need1=need2=(structneed*)malloc(needlen);need1->next=need2->next=NULL;need1->value=maxtemp->value-alloctemp->value; status++;}else{need2=(struct need *)malloc(needlen);need2->value=(maxtemp->value)-(alloctemp->value);if(status==1){needhead->next=need2;status++;}need1->next=need2;need1=need2;}maxtemp=maxtemp->next;alloctemp=alloctemp->next;}need2->next=NULL;status=0;for(i=0;i<row;i++){if(status==0){finihead=finish1=finish2=(structfinish*)malloc(finilen);finish1->next=finish2->next=NULL;finish1->stat=0;status++;}else{finish2=(struct finish*)malloc(finilen);finish2->stat=0;if(status==1){finihead->next=finish2;status++;}finish1->next=finish2;finish1=finish2;}}finish2->next=NULL; /*Initialization compleated*/ status=0;processtest=0;for(temp=0;temp<row;temp++){alloctemp=allochead;needtemp=needhead;finishtemp=finihead;worktemp=workhead;for(i=0;i<row;i++){worktemp1=worktemp;if(finishtemp->stat==0){for(j=0;j<colum;j++,needtemp=needtemp->next,worktemp=worktemp->nex t)if(needtemp->value<=worktemp->value)processtest++;if(processtest==colum){for(j=0;j<colum;j++){worktemp1->value+=alloctemp->value;worktemp1=worktemp1->next;alloctemp=alloctemp->next;}if(status==0){pathhead=path1=path2=(structpath*)malloc(pathlen);path1->next=path2->next=NULL;path1->value=i;status++;}else{path2=(struct path*)malloc(pathlen);path2->value=i;if(status==1){pathhead->next=path2;status++;}path1->next=path2;path1=path2;}finishtemp->stat=1;}else{for(t=0;t<colum;t++)alloctemp=alloctemp->next;finishtemp->stat=0;}}elsefor(t=0;t<colum;t++){needtemp=needtemp->next;alloctemp=alloctemp->next; }processtest=0;worktemp=workhead;finishtemp=finishtemp->next;}}path2->next=NULL;finishtemp=finihead;for(temp=0;temp<row;temp++){if(finishtemp->stat==0){printf("\nϵͳ´¦ÓÚ·Ç°²È«×´Ì¬!\n"); exit(0);}finishtemp=finishtemp->next;}printf("\nϵͳ´¦ÓÚ°²È«×´Ì¬.\n");printf("\n°²È«ÐòÁÐΪ: \n");do{printf("p%d ",pathhead->value);}while(pathhead=pathhead->next);printf("\n");return 0;}。
操作系统实验二:银行家算法
操作系统实验⼆:银⾏家算法实验⼆银⾏家算法⼀、实验⽬的1、了解什么是操作系统安全状态和不安全状态;2、了解如何避免系统死锁;3、理解银⾏家算法是⼀种最有代表性的避免死锁的算法,掌握其实现原理及实现过程。
⼆、实验内容根据银⾏家算法的基本思想,编写和调试⼀个实现动态资源分配的模拟程序,并能够有效避免死锁的发⽣。
三、实验原理进程申请资源时,系统通过⼀定的算法判断本次申请是否不可能产⽣死锁(处于安全状态)。
若可能产⽣死锁(处于不安全状态),则暂不进⾏本次资源分配,以避免死锁。
算法有著名的银⾏家算法。
1、什么是系统的安全状态和不安全状态?所谓安全状态,是指如果系统中存在某种进程序列<P1,P2,…,Pn>,系统按该序列为每个进程分配其所需要的资源,直⾄最⼤需求,则最终能使每个进程都可顺利完成,称该进程序列<P1,P2,…,Pn,>为安全序列。
如果不存在这样的安全序列,则称系统处于不安全状态。
2、银⾏家算法把操作系统看作是银⾏家,操作系统管理的资源相当于银⾏家管理的资⾦,进程向操作系统请求分配资源相当于⽤户向银⾏家贷款。
为保证资⾦的安全,银⾏家规定:(1) 当⼀个顾客对资⾦的最⼤需求量不超过银⾏家现有的资⾦时就可接纳该顾客;(2) 顾客可以分期贷款,但贷款的总数不能超过最⼤需求量;(3) 当银⾏家现有的资⾦不能满⾜顾客尚需的贷款数额时,对顾客的贷款可推迟⽀付,但总能使顾客在有限的时间⾥得到贷款;(4) 当顾客得到所需的全部资⾦后,⼀定能在有限的时间⾥归还所有的资⾦。
操作系统按照银⾏家制定的规则设计的银⾏家算法为:(1)进程⾸次申请资源的分配:如果系统现存资源可以满⾜该进程的最⼤需求量,则按当前的申请量分配资源,否则推迟分配。
(2)进程在执⾏中继续申请资源的分配:若该进程已占⽤的资源与本次申请的资源之和不超过对资源的最⼤需求量,且现存资源能满⾜该进程尚需的最⼤资源量,则按当前申请量分配资源,否则推迟分配。
(3)⾄少⼀个进程能完成:在任何时刻保证⾄少有⼀个进程能得到所需的全部资源⽽执⾏到结束。
操作系统习题及答案
优先级,后者所得到的是
优先级。
25. 在 机。
调度算法中,按照进程进入就绪队列的先后次序来分配处理
26. 作业调度是高级调度,进程调度是低级调度。( 是否正确? )
27. 线程与进程的根本区别在于进程是
单位,而线程是
单位,
具有自己的主存空间,
共享该主存空间并对其所有主存空间都有存
取权限。
28.在多用户环境下,由多个程序共享一台计算机,机内资源状态将由多个程序 来改变,因此使程序失去了在顺序执行上时具有的________和________特 征。
2、( )优先权是在创建进程时确定的,确定之后在整个进程运行期间不再改变。 A.先来先服务 B.静态 C.动态 D.短作业
3、以下关于死锁的必要条件的叙述中错误的是( )。 A.只要具备了死锁的必要条件,就一定发生死锁现象 B.解决死锁问题可以从死锁的必要条件出发
C.一旦出现死锁现象,处于死锁状态的进程一定同时具备死锁的必要条件 D.死锁的四个必要条件之间不是完全独立的,但也不是等价的
的值为( )。
A. > 0
B.< 0
C.>= 0
D.<=0
6、如果进程 PA 对信号量 S 执行 P 操作,则信号量 S 的值应(
)
A.加 1
B.减 1
C.等于 0 D.小于 0
7、从静态角度上看,进程是由程序、数据及(
)三部分组成。
A. JCB
B. PCB
C. FCB
D .I/O 缓冲区
H、处于(
、
2. 进程是一个
态的概念,程序是一个
态的概念。
3. 操作系统中,可以并行工作的基本单位是 组成。
,它是由程序、
C语言实验报告范例
C语言实验报告范例
实验题目:C语言实现银行家算法
实验目的:掌握C语言实现银行家算法的基本思想,并能熟练应用矩阵处理实现银行
家算法的功能。
实验内容:
1. 利用C语言实现银行家算法的核心思想,利用矩阵处理实现其核心功能模块。
2. 银行家算法是一种负责实现“当前分配”的基于矩阵的编程模型。
该算法可以通
过利用安全状态来识别一次可行解,从而解决请求和分配资源的冲突问题。
3. 根据上述信息,我们设计了C语言实现银行家算法的基本框架,包括初始化步骤、可行性检查步骤、回滚步骤以及主步骤。
4. 在初始化步骤中,我们采用矩阵存储技术,将银行家算法中的各个参数保存起来,具体过程中采用数组存储。
5. 在可行性检查步骤中,我们判断当前系统状态是否处于安全状态,如果处于安全
状态,则继续完成下一步余额检查;否则,处理发生冲突时,回滚处理。
6. 在主步骤中,我们过程中判断若系统处于可行状态,则继续分配资源;否则,则
执行回滚操作,将系统恢复到上一状态。
实验结果和结论:
通过实验,我们学会了如何使用C语言来实现银行家算法,进而通过实现矩阵处理,
实现了该算法的核心功能模块。
此外,我们还学习了安全状态机制,进行系统可行性检查,和完成系统的分配工作,以达到有效地实现银行家算法的目的。
本次实验结论如下:
1. 通过C语言实现银行家算法中的核心功能模块,使系统的可行性检查得以有效实现;
2. 利用矩阵存储来实现系统的可行性检查,从而有效地节省时间和提高资源分配的
效率;
3. 通过回滚处理,有效地解决资源请求和分配冲突问题,使系统能够有效地实现安
全状态。
操作系统,银行家算法
齐齐哈尔大学操作系统课程综合实践题目:银行家算法模拟实验班级:计本101班姓名:司伟东学号:2010021015指导教师:滕艳平2012年11 月银行家算法模拟实现摘要:随着计算机的普及和发展,计算机在日新月异的发展着,可以说计算机在人们生活中占有越来越重要的地位,许多的计算机领域取得了可喜的成果,许多的计算的到了较好的改进,随着计算机的发展,人们对计算机的需求也越来越高,为了防止用户操作导致计算机同一时刻进程过多产生死锁,我们引进了银行家算法来避免计算机死锁的发生,本论文阐述了什么叫银行家算法,了解银行家算法的大体思想,经过流程图,以及银行家算法是用以解决什么问题,简单论述了银行家算法的实现过程,并说明银行家算法的中心思想,本论文设计的目的是通过编写一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生.掌握避免死锁的集体实施方法。
关键字:死锁,银行家算法,,避免死锁,资源分配,安全序列一.银行家算法概论什么叫银行家算法:银行家算法最开始是用来模拟一个小城镇的银行家为一批顾客的贷款问题,,一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。
在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。
如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
把一个进程需要和已占有资源的情况记录在进程控制中,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁。
银行家算法其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。
c语言银行家算法
c语言银行家算法在C语言中实现银行家算法,首先需要了解该算法的基本概念和原理。
银行家算法是一种避免死锁的资源分配算法,它模拟了银行贷款的过程。
当一个进程请求资源时,系统先检查分配后是否安全,如果是,则分配资源。
否则,进程必须等待,直到足够的资源可用。
以下是一个简单的银行家算法的C语言实现:```c#include <stdio.h>#define MaxProcs 5#define MaxResources 3int Allocation[MaxProcs][MaxResources] = {0};int Max[MaxProcs][MaxResources] = {0};int Allocation[MaxProcs][MaxResources] = {0};int Available[MaxResources] = {0};int Need[MaxProcs][MaxResources] = {0};int Work[MaxResources] = {0};int safeSeq[MaxProcs] = {0};int count = 0;void calcNeed() {for (int p = 0; p < MaxProcs; p++) {for (int r = 0; r < MaxResources; r++) {Need[p][r] = Max[p][r] - Allocation[p][r];}}}void checkSafe() {int finish[MaxProcs] = {0};int k, j;for (k = 0; k < MaxProcs; k++) {safeSeq[k] = -1;}while (count < MaxProcs) {for (k = 0; k < MaxProcs; k++) {if (finish[k] == 0) {for (j = 0; j < MaxResources; j++) {if (Need[k][j] > Work[j]) {break;}}if (j == MaxResources) {for (j = 0; j < MaxResources; j++) {Work[j] += Allocation[k][j];safeSeq[count++] = k;finish[k] = 1;}}}}}if (count == MaxProcs) {printf("系统是安全的\n");} else {printf("系统是不安全的\n");}}```。
#操作系统课程设计-银行家算法(流程图 源代码 设计报告)
操作系统课程设计-银行家算法(流程图+源代码+设计报告)一、实验目的:熟悉银行家算法,理解系统产生死锁的原因及避免死锁的方法,加深记意。
二、实验要求:用高级语言编写和调试一个描述银行家算法的程序。
三、实验内容:1、设计一个结构体,用于描述每个进程对资源的要求分配情况。
包括:进程名——name[5],要求资源数目——command[m](m类资源),还需要资源数目——need[m],已分配资源数目——allo[m]。
2、编写三个算法,分别用以完成:①申请资源;②显示资源;③释放资源。
(动态完成)四、程序流程图五、源程序:最新版本:bk5.c/*bk2.c::可以自定义进程及资源数目,可选择读文件或创建新文件,但不超过10,5*//*可修改# define NP 10*//* # define NS 5 */ /*资源种类*//*bk3.c::可以继续分配资源(〉2)*//*bk4.c::可保存分析结果*//*bk5.c::除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*//*四、程序流程图:五、源程序:最新版本:bk5.c/*bk2.c::可以自定义进程及资源数目,可选择读文件或创建新文件,但不超过10,5*//*可修改#define NP10*//* #define NS5*//*资源种类*//*bk3.c::可以继续分配资源(〉2)*//*bk4.c::可保存分析结果*//*bk5.c::除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*/ #include "string.h"#include "stdio.h"#include"dos.h"#include"conio.h"#define MOVEIN1#define GUIYUE2#define ACC3#define OK1#define ERROR0#define MAXSH7#define MAXSHL10#define MAXINPUT50#define maxsize 100int act;int ip=0;int line=0; /*line为要写的行号,全局变量*/int writeok;int right;char wel[30]={"Welcome To Use An_Li System"};char ente[76]={" 警告:未经作者同意不得随意复制更改!"};char rights[40]={"Copyright (c)2002"};struct date today;sssssssssssss;ttttttttttttt{int data[maxsize];int top;}stack;int emptystack(stack*S){if(S->top==48&&S->data[S->top]==35)return(1); /*35is'#'*/else return(0);}int push(stack*S,int x){if(S->top>=maxsize-1)return(-1);else{S->top++;S->data[S->top]=x;return(0);}int gettop(stack*S){return S->data[S->top];}int pop(stack*S){if(emptystack(S)){printf("the stack is empty\n");exit(1);}else S->top--;return S->data[S->top+1];}void initstack(stack*S){int i;S->top=0;S->data[S->top]=35;}/*****模拟打字机的效果*********/delay_fun(){int i;void music();for(i=0;;i++){if(wel!='\0'){delay(1000);textcolor(YELLOW);gotoxy(26+i,8);cprintf("%c",wel);printf("谢谢");printf("网络");music(1,60);}else break;}delay(500000);for(i=0;;i++){if(ente!='\0'){delay(1000);textcolor(RED);/*显示警告及版权*/gotoxy(2+i,11);cprintf("%c",ente);}else break;}delay(40000);for(i=0;;i++){if(rights!='\0'){delay(1000);textcolor(YELLOW);gotoxy(30+i,14);cprintf("%c",rights);music(1,60);}elsebreak;}getch();}/*********登陆后的效果**********/ logined(){int i;clrscr();gotoxy(28,10);textcolor(YELLOW);cprintf("程序正在载入请稍候....."); gotoxy(35,12);for(i=0;i<=50;i++){gotoxy(40,12);delay(8000);cprintf("%02d%已完成",i*2);gotoxy(i+15,13);cprintf("\n");cprintf("|");}main0();}/*********对PC扬声器操作的函数****/void music(int loop,int f)/*f为频率*/ {int i;for(i=0;i<30*loop;i++){sound(f*20);}int analys(int s,int a){int hh,pos;switch(a){case(int)'i':hh=0;break;case(int)'+':hh=1;break;case(int)'*':hh=2;break;case(int)'(':hh=3;break;case(int)')':hh=4;break;case(int)'#':hh=5;break;case(int)'E':hh=6;break;case(int)'T':hh=7;break;case(int)'F':hh=8;break;default:{printf("\n analys()分析发现不该有的字符%c!(位置:%d)",a,ip+1); writeerror('0',"\n............分析出现错误!!!");writeerror(a,"\n 错误类型: 不该有字符");printf("谢谢");printf("网");return ERROR;}}pos=(s-48)*10+hh;switch(pos){case3:case43:case63:case73:act=4;return MOVEIN;case0:case40:case60:case70:act=5;return MOVEIN;case11:case81:act=6;return MOVEIN;case92:case22:act=7;return MOVEIN;case84:act=11;return MOVEIN;/*-------------------------------------------*/case91:case94:case95:act=1;return GUIYUE;case21:act=2;return GUIYUE;case101:case102:case104:case105:act=3;return GUIYUE;case31:case32:case34:case35:act=4;return GUIYUE;case111:case112:case114:case115:act=5;return GUIYUE;case51:case52:case54:case55:act=6;return GUIYUE;/*+++++++++++++++++*/case15:return ACC;/*******************************/case6:return1;case7:case47:return2;case8:case48:case68:return3;case46:return8;case67:return9;case78:return10;default:{if(a=='#')printf("");else printf("\n analys() 分析发现字符%c 不是所期望的!(位置:%d)",a,ip+1);writeerror('0',"\n...........分析出现错误!!!");writeerror(a,"\n 错误类型: 字符");writeerror('0'," 不是所期望的!");printf("谢谢");printf("网");return ERROR;}}}int writefile(int a,char*st){FILE*fp;fp=fopen("an_slr.txt","a");{fprintf(fp,"%s",st); /*若a==-1则为添加的注释*/}else if(a==-2){getdate(&today);gettime(&now);fprintf(fp,"\n测试日期:%d-%d-%d",today.da_year,today.da_mon,today.da_day);测试时间:%02d:%02d:%02d",now.ti_hour,now.ti_min,now.ti_sec); fprintf(fp,"}else if(a>=0)fprintf(fp,"\n step:%02d,%s",a,st);writeok=1;fclose(fp);}return writeok;}int writeerror(char a,char*st) /*错误类型文件*/{FILE*fpp;fpp=fopen("an_slr.txt","a");if(fpp==0){printf("\nwrite error!!");writeok=0;}else{if(a=='0')fprintf(fpp,"%s",st); /*若a=='0' 则为添加的注释*/else fprintf(fpp,"%s\'%c\'(位置:%d)",st,a,ip+1);writeok=1;fclose(fpp);}return writeok;}/*^^^^^^^^^^^^^^^^^^^^^^*/main0(){int an,flag=1,action,lenr;char a,w[MAXINPUT];int len,s,ss,aa,ana;stack*st;char r[MAXSH][MAXSHL];/*初始化产生式*/strcpy(r[0],"S->E");strcpy(r[1],"E->E+T");strcpy(r[2],"E->T");strcpy(r[3],"T->T*F");strcpy(r[4],"T->F");strcpy(r[5],"F->(E)");strcpy(r[6],"F->i");clrscr();printf("\nplease input analyse string:\n");gets(w);len=strlen(w);w[len]='#';w[len+1]='\0';push(st,48); /*(int)0 进栈*/writefile(-1,"\n------------------------SLR(1)词法分析器-------------------------"); writefile(-1,"\n计本003 安完成于2003.01.1214:04"); writefile(-1,"\n谢谢");writefile(-1,"网");writefile(-1,"\n 以下为串");writefile(-1,w);writefile(-1,"('#'为系统添加)的分析结果:");writefile(-2,"");do{s=gettop(st);aa=(int)w[ip];action=analys(s,aa);if(action==MOVEIN){ss=48+act;push(st,aa);push(st,ss); /*if ss=4int=52*/ip++;}else if(action==GUIYUE){lenr=strlen(r[act])-3;for(an=0;an<=2*lenr-1;an++)pop(st); /*#0 */s=gettop(st); /*s=0*/push(st,(int)r[act][0]);/*将产生式左端F 进栈*/ana=analys(s,(int)r[act][0])+48;if(ana>59)printf("\分析出错:ana>59!!!");push(st,ana);/*analys(s,aa)即为goto(s',aa)*/if((line+1)%20==0){printf("\nThis screen is full,press any key to continue!!!");getche();clrscr();}printf("step%02d: %s\n",line++,r[act]);writefile(line,r[act]);}else if(action==ACC){flag=0;right=1;}else if(action==ERROR){flag=0;right=0;}/*接受成功*/else{flag=0;right=0;}/* 出错*/}while(flag==1);if(right==1)printf("\nok,输入串%s 为可接受串!!",w);if(right==0)printf("\nsorry,输入串%s 分析出错!!",w);if(writeok==1){printf("\nAnWin soft have wrote a file an_slr.txt");if(right==1)writefile(-1,"\n最终结果:输入串为可接受串!");}}main() /*主函数*/{clrscr();delay_fun();logined();}六、测试报告-操作系统课程设计-银行家算法(流程图+源代码+设计报告)六、测试报告:(测试结果保存于系统生成的an.txt 文件中)以下为课本上的实例::-------------------------------------------------------------------------------------========================银行家算法测试结果=========================-------------------------------------------------------------------------------------T0 时刻可用资源(Available)A:3,B:3,C:2测试日期:2003-6-28请求分配时间:14:07:29经测试,可为该进程分配资源。
操作系统专升本考试练习题及答案141
操作系统专升本考试练习题及答案11.[单选题]树形目录的优点不包括A)便于文件的分类B)层次结构清晰C)解决了重名问题D)结构相对简单答案:D解析:本题主要考查的知识点为树形目录的优点。
树形目录的优点是便于文件的分类,层次结构清晰,便于管理和保护,解决了重名问题,查找速度加快。
缺点是查找一个文件按路径名逐层检查,由于每个文件都放在外存中,多次访问磁盘会影响速度,结构相对复杂。
2.[单选题]( )存储管理支持多道程序设计,算法简单,但存储碎片多。
A)段式B)页式C)固定分区D)段页式答案:C解析:3.[单选题]存储管理的目的是( )。
A)方便用户B)提高内存利用率C)方便用户和提高内存利用率D)增加内存实际容量答案:C解析:4.[单选题]具有微型化和实时性两个主要特点的操作系统是( )A)分时操作系统B)实时操作系统C)嵌入式操作系统D)批处理操作系统答案:C解析:5.[单选题]系统在( ),发生从目态到管态的转换。
A)发出P操作时B)发出V操作时解析:6.[单选题]在分时和批处理系统结合的操作系统中引入“前台”和“后台”的概念,其目的是提高()。
A)CPU 利用率B)分工协作效率C)用户使用的方便性D)计算机效率答案:D解析:7.[单选题]若进程 Pa,Pb 和 Pc 单独执行的时间分别为 Ta,Tb 和 Tc,Ta=1 小时,Tb=1.5 小时,Tc=2 小时,其中处理机工作时间分别为 Ta=20 分钟,Tb=25 分钟,Tc=45 分钟。
如果采用多道程序设计的方法,让 Pa,Pb 和 Pc 并发执行,假定处理机的利用率达到 60%,另加20 分钟系统开销,此时系统效率提高了()。
A)(200/9)%B)(10/27)%C)(500/9)%D)(1000/27)%答案:B解析:8.[单选题]在存储器的层次结构中,L5层是A)寄存器B)主存储器C)远程二级存储D)本地二级存储答案:C解析:9.[单选题]若干进程共享系统资源时,不属于形成死锁必要条件的是( )A)资源可共享B)互斥地使用资源C)占有并等待资源D)循环等待资源答案:A解析:10.[单选题]可用上下界限寄存器实现存储保护的是()存储管理。
操作系统课程设计实验报告用C实现银行家算法
操作系统实验报告2学院:计算机科学与技术学院班级:计091学号:姓名:时间:2011/12/30目录1.实验名称 (3)2.实验目的 (3)3.实验内容 (3)4.实验要求 (3)5.实验原理 (3)6.实验环境 (4)7.实验设计 (4)数据结构设计 (4)算法设计 (6)功能模块设计 (7)8.实验运行结果 (8)9.实验心得 (9)附录:源代码部分 (9)一、实验名称:用C++实现银行家算法二、实验目的:通过自己编程来实现银行家算法,进一步理解银行家算法的概念及含义,提高对银行家算法的认识,同时提高自己的动手实践能力;各种死锁防止方法能够阻止发生死锁,但必然会降低系统的并发性并导致低效的资源利用率;死锁避免却与此相反,通过合适的资源分配算法确保不会出现进程循环等待链,从而避免死锁;本实验旨在了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生;三、实验内容:利用C++,实现银行家算法四、实验要求:1.完成银行家算法的设计2.设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源;五、实验原理:系统中的所有进程放入进程集合,在安全状态下系统收到进程的资源请求后,先把资源试探性的分配给它;之后,系统将剩下的可用资源和进程集合中的其他进程还需要的资源数作比较,找出剩余资源能够满足的最大需求量的进程,从而保证进程运行完毕并归还全部资源;这时,把这个进程从进程集合中删除,归还其所占用的所有资源,系统的剩余资源则更多,反复执行上述步骤;最后,检查进程集合,若为空则表明本次申请可行,系统处于安全状态,可以真正执行本次分配,否则,本次资源分配暂不实施,让申请资源的进程等待;银行家算法是一种最有代表性的避免的算法;在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待;为实现银行家算法,系统必须设置若干;要解释银行家算法,必须先解释操作系统安全状态和不安全状态;安全序列是指一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi1≤i≤n,它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj j < i 当前占有资源量之和;安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态;安全状态一定是没有死锁发生;不安全状态:不存在一个安全序列;不安全状态不一定导致死锁;我们可以把看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款;为保证资金的安全,银行家规定:1 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;2 顾客可以分期贷款,但贷款的总数不能超过最大需求量;3 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;4 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配;当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量;若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配;六、实验环境:Win-7系统Visual C++七、实验设计:1.数据结构设计定义结构体:struct Process0, 0, 0;}}};class DataInit法设计class FindSafeListdb->available; db->pdb->ruleri.currentAvail db->pdb->ruleri-1.currentAvail;db->pdb->ruleri-1.allocation;db->pdb->ruleri.currentAvail{ return false; }db->sum{ return false; }}return true; laim_allocation{ return 1; }Source sdb->pi.allocation; db->ask;db->pi.db->ask;ifexsitSafeListdb db->ask;db->pi.db->ask;return 2;}db->0,0,0; 能模块设计class Data0, 0, 0;}}};class DataInitr1,r2,r3;cout<<'p'<<i<<" max allocationclaimR1,R2,R3: ";r1,r2,r3;r1=db->pi.>pi.;pi.;r3=db->pi.>pi.;db->pi.r1, r2, r3;}}};class Displaylaim;cout<<"\t\t";displaySourcepi.allocation;cout<<endl;}cout<<endl;}void displaySafeListData db urrentAvail;cout<<" ";displaySourcedb->pdb->ruleri.claim;cout<<" ";displaySourcedb->pdb->ruleri.allocation;cout<<" ";displaySourcedb->pdb->ruleri.claim_allocation;cout<<" true";cout<<endl;}}void displayAskResultData db,int n db->available;db->pdb->ruleri.currentAvail db->pdb->ruleri-1.currentAvail;db->pdb->ruleri-1.allocation;db->pdb->ruleri.currentAvail{ return false; }db->sum{ return false; }}return true; laim_allocation{ return 1; }Source sdb->pi.allocation; db->ask;db->pi.db->ask;ifexsitSafeListdb db->ask;db->pi.db->ask;return 2;}db->0,0,0; //找到安全序列,将请求资源置零,返回3return 3;}};void main{Data db;db=new Data;ifdb{ cout<<"errorno enough memory space"; return; } DataInit dataInit;db; //设置进程个数db; //设置系统总资源量db; //设置当前系统可获得资源量db; //设置t0时刻进程基本状态Display display;FindSafeList findSafeList;int r1=0,r2=0,r3=0;int c;db->r1,r2,r3; //设置请求资源为0,即无请求c=db,0; //寻找安全序列,返回结果ifc=3{ cout<<"t0时刻的进程组不存在安全序列\n"; return; }int choice=1;int pi;whilechoice{cout<<"\n 选择操作:\n 1 查看进程情况\n 2 请求分配资源\n 0 退出\n ";cin>>choice;switchchoice{case 1:{cout<<"当前资源量availableR1,R2,R3:\n ";db->available;cout<<endl;cout<<"\n当前进程资源分配情况piR1,R2,R3: \n";cout<<" 进程\tclaim\t\tallocation\n";db->p,db->pLength;break;}case 2:{cout<<"输入请求资源进程序号:";cin>>pi;cout<<"输入请求资源R1,R2,R3: 0,0,0表示当前进程组无请求\n";cin>>r1>>r2>>r3;db->r1,r2,r3;c=db,pi;db,c;cout<<endl;break;}case 0:{ break; }default:{ cout<<"input errortry again\n"; break; }}}}。
操作系统之银行家算法
操作系统之银⾏家算法
银⾏家算法
银⾏家算法是解决死锁问题的。
那么怎么解决呢? 死锁的⼀个原因就是互斥资源, 如上图,有A,B,C三个资源,数量分别是
10,5,7,MAX表⽰的是每个进程需要该资源,需要多少,Allocation表⽰现在分配了多少,Need表⽰他们还需要多少,⾃然Max-
Allocation就能算出need。
那么怎样算Available呢?某个资源⼀共有的减去分配了的,就是当前可⽤的。
work表⽰当前可⽤的资源的数⽬,刚开始肯定就是3 3 2,这个表⽰我们的系统中的资源还剩多少,然后判断可以分配给哪个进程,把这个进程的名字写在前⾯,然后need就是这个进程需要的资源数,Allocation是这个进程当前分配了多少,work+Allocation为把两个加起来,意思就是系统执⾏这个进程,完了以后会释放之前分配给他的,然后这个系统中当前有的资源数就是work+Allocation。
执⾏完,最后的work+Allocation应该跟刚
开始系统的资源数相同。
「怎样判断系统是否安全呢?」 如果每个进程都能执⾏,也就是finish都为true,那么这个系统就是安全的,反之就不安全。
P1发出请求向量,是在他原来需要的1 2 2⾥,先要请求1 0 2,所以先要判断请求的向量是不是⽐需要的多,如果多肯定是不对的。
第⼆步,请求的向量需要⽐当前可⽤的少,这两个条件都满⾜以后,我们就把Allocation的向量增加请求向量,把Need向量减少请求向量,然后继续进⾏计算。
C语言实现银行家算法
{
init(&pcount,&scount,Allocation,Need,Available); //调用初始化函数
print(pcount,scount,Allocation,Need,Available); //调用打印函数
int isreque = requs(scount,&number,Request,Allocation,Need,Available); //调用是否请求函数
for(j=0;j<s;j++)
{
scanf("%d",&Allocation[i][j]);
}
}
printf("Need\n");
for(i=0;i<p;i++)
{
printf("P%d:",i);
for(j=0;j<s;j++)
{
scanf("%d",&Need[i][j]);
}
}
printf("Available:");
C语言实现银行家算法(源码、运行结果)
一、源码
/*
银行家算法 10-22
*/
#include<stdio.h>
//函数声明
void init(int * pcount,int * scount,int Allocation[10][10],int Need[10][10],int Available[10]);
{
int p,s;
int i,j;
printf("进程数:");
操作系统银行家算法C语言代码
操作系统银行家算法C语言代码
银行家算法是保证系统安全的重要算法之一,它主要用于在多进程环境下避免死锁发生。
下面是银行家算法的C语言实现:
```c
#include <stdio.h>
#include <stdbool.h>
printf("请输入进程数和资源数,以空格分隔:");
scanf("%d%d", &m, &n);
printf("请输入各进程所需的最大资源数量:\n");
for (i = 0; i < m; i++)
{
printf("请输入第%d个进程的最大资源数量,以空格分隔:", i);
for (j = 0; j < n; j++)
scanf("%d", &max[i][j]);
}
for (i = 0; i < m; i++)
finish[i] = false;
printf("系统不是安全的,申请不能分配。
\n");
}
}
else
printf("申请不能满足,申请不能分配。
\n");
return 0;
}
```
该代码的输入包括:进程数、资源数、各进程所需的最大资源数、各进程已分配的资源数、系统中剩余的资源数,以及申请资源的进程编号和资源数量。
输出为判断系统是否安全以及申请资源是否成功分配的结果。
若系统是安全的,输出申请已经成功分配;若系统不是安全的,输出申请不能分配。
《实验7银行家算法》课件
系统资源分配与回收
当进程请求资源时,系统需要判断资 源的分配是否会导致系统进入不安全 状态。
在回收资源时,系统需要确保不会导 致死锁的发生。
如果安全,则分配资源;如果不安全 ,则撤销已分配的资源并让进程等待 。
死锁的检测与避免
1
死锁是指系统中出现的一种状态,在该状态下, 每个进程都在等待其他进程释放资源,从而导致 所有进程都无法继续执行。
测试案例不够全面
在测试算法时,我只使用了几个简单的测试案例,可能没有覆盖到 所有可能的场景。
缺乏对算法的深入分析
在实验过程中,我可能没有对算法进行深入的理论分析,导致对算 法的理解不够深入。
银行家算法在实际应用中的思考
01
02
03
安全性考虑
在实际应用中,银行家算 法可以帮助我们在分配资 源时避免死锁,提高系统 的安全性。
死锁的检测结果
总结词:结果呈现
详细描述:通过死锁的检测结果,可以了解系统在运 行过程中是否出现了死锁情况,以及死锁发生的条件 和位置,从而对算法的性能和效果进行评估。
05 实验总结与思考
CH家算法的基本原理
01
通过实验,我深入理解了银行家算法是如何工作的,包括安全
04 实验结果与分析
CHAPTER
系统状态变化图
总结词:直观展示
详细描述:通过系统状态变化图,可以清晰 地观察到系统在运行银行家算法过程中的资 源分配情况,以及随着时间推移系统状态的
变化趋势。
安全序列的生成
总结词:关键步骤
详细描述:安全序列的生成是银行家算法的核心步骤之一,通过安全序列的生成 ,可以确保系统在分配资源时始终处于安全状态,避免死锁的发生。
更新资源的状态,包括可用资 源数和已分配资源数。
2023年计算机四级《网络工程师》考试全真模拟易错、难点汇编叁(带答案)试卷号:48
2023年计算机四级《网络工程师》考试全真模拟易错、难点汇编叁(带答案)(图片大小可自由调整)一.全考点综合测验(共45题)1.【单选题】为预防内存换页时出现抖动(颠簸)现象,可以采用下列哪一种方式?A.采用工作集算法B.更换更快的处理机C.增加交换空间D.增加并发进程数量正确答案:A2.【单选题】银行家算法是应对死锁的一种算法,其实现的是A.死锁鸵鸟算法B.死锁检测与恢复算法C.死锁避免算法D.死锁预防算法正确答案:C3.【单选题】在连入Internet中的设备中,不需要运行IP协议的是A.集线器B.主机C.NAT 设备D.路由器正确答案:A4.【多选题】从简单页式存储管理方案发展到虚拟页式存储管理方案,页表项中通常需要增加的信息有A.有效位(存在位)B.修改位C.访问位(引用位)正确答案:ABC5.【单选题】从静态的角度看,下列选项中哪一个是进程必须拥有而程序所没有的?A.进程控制块C.常量数据D.全局变量正确答案:A本题解析:从静态的角度看,进程与程序都有代码、全局变量、常量数据等,然而只有进程控制块,是用来在内存中唯一标识和管理进程活动的控制结构,而程序则没有。
6.【单选题】关于TCP协议的描述中,错误的是A.TCP是一种网络层协议B.TCP支持面向连接的服务C.TCP提供流量控制功能D.TCP支持字节流传输服务正确答案:A7.【单选题】关于网络安全等级的描述中,正确的是B.中国采用橘皮书为标准C.B1安全性高于C2D.C1提供安全域机制正确答案:C8.【单选题】在采用页式存储管理方案的系统中,为了提高内存利用率并减少内碎片,页面的划分A.与页表数量相关,可以找到平衡点B.与页表数量无关,页面尺寸越大越好C.与页表数量无关,页面尺寸越小越好D.与页表数量相关,可根据物理内存大小划分正确答案:A9.【单选题】若一个单核处理机的系统中有多个进程存在,则这些进程是A.并发运行的B.并行运行的C.封闭运行的D.单道运行的正确答案:A10.【单选题】IEEE 802.11g标准使用的波段是A.1.2GHzB.2.4GHzC.4.9GHzD.5GHz正确答案:B11.【单选题】关于故障管理的描述中,错误的是A.可检测故障B.可隔离故障C.自动处理所有故障D.可处理故障正确答案:C12.A.线程让出CPUB.创建一个线程C..阻塞一个线程D.等待一个特定的线程退出正确答案:A13.【单选题】在Internet使用的域名中,com通常表示A.商业组织B.教育机构C.政府部门D.军事部门正确答案:A14.【单选题】IEEE802.3z标准支持的最大传输速率是A.40GbpsC.1GbpsD.100Mbps正确答案:C15.【单选题】如果一用户希望使用FTP下载一幅图像,那么他应该使用的文件传输方式为A.二进制方式B.文本方式C.被动方式D.主动方式正确答案:A16.【单选题】下列指令中,哪一种可以在用户态下执行?A.设置控制寄存器指令B.算术运算指令C.关中断指令D.切换栈指针指令17.【单选题】关于SIP协议的描述中,正确的是A.被SIP被QQ采用B.SIP只应用于TCP/IPC.SIP属于应用层协议D.SIP使用XML标识用户正确答案:C18.【单选题】假设某文件系统的物理结构采用类UNIX的二级索引结构。
银行家算法C语言代码
for(int i=0;i<SMAX;++i)
{
cout<<Available[i]<<"\t";
}
cout<<"\n\n未执行进程目前已得到的资源[Allocation]:"<<endl;
for(i=0;i<PMAX;++i)
{
cout<<"\n进程["<<i<<"] : ";
void SourceRequest(); //资源请求
void FreeSource(); // 资源释放
void ShowProcess(); // 显示已执行进程的顺序
void GrantSource(int i); // 进程i资源分配
bool IsSafe();
bool FindS(int i); //进程i已经是false 现在需要确认每个资源 是不是满足Need[i][j] <= Work[j]
{
cout<<"需要的资源大于资源总量,请重新输入\n";
--j;
continue;
}
cout<<"输入进程["<<i<<"]已经拥有资源["<<j<<"]的数量 :";
cin>>Allocation[i][j];
if(Allocation[i][j] > AvailableTemp[j])
#include <iostream>
银行家算法 实验报告
淮海工学院计算机工程学院实验报告书课程名:《操作系统原理》题目:银行家算法班级: D学号:姓名:一、实验目的银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。
实验环境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.银行家算法的局限性有哪些?银行家算法是一种最有代表性的避免死锁的算法。
银行家算法即把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
计算机四级网络工程师测试题(含参考答案)
计算机四级网络工程师测试题(含参考答案)一、单选题(共80题,每题1分,共80分)1、下列哪一种进程间通信方式不会在系统中产生多份相同的拷贝( )。
A、消息传递B、套接字C、共享内存D、管道通信正确答案:C2、组成操作系统的主要部分是存储管理、设备管理、文件管理和( )。
A、网络管理B、死锁管理C、进程线程管理D、用户管理正确答案:C3、当用户在编程中需要创建一个进程时,他可以采用下列哪一种方法( )。
A、调用进程创建原语由操作系统创建进程B、填写进程控制块的数据结构并提交系统C、填写进程控制块的数据结构并将其放入就绪队列D、将用户所在进程的进程控制块复制一份给新进程正确答案:A4、下列哪一种文件的物理结构检索速度慢,且不适于随机存取文件( )。
A、链接结构B、顺序结构C、索引结构D、I 节点结构正确答案:A5、关于传统以太网帧的描述中,错误的是( )。
A、帧前定界符字段长度为1字节B、前导码字段不计入帧头长度C、目的地址字段使用MAC地址D、帧校验的范围不包括数据部分正确答案:D6、关于SIMPLE的描述中,错误的是( )。
A、NOTIFY用于传输视频信息B、SUBSCRIBE用于获得呈现信息C、MESSAGE用于发送短消息D、是SIP的扩展正确答案:A7、下列对文件的描述中,哪一项与文件的物理结构相关( )。
A、文件中记录的个数B、用户对文件的存取方式C、文件长度D、文件目录的结构正确答案:B8、关于SIP中的用户代理,错误的是( )。
A、UAC负责发起呼叫B、UAC位于用户终端中C、UAS位于远程的代理服务器中D、UAS负责接受呼叫并进行响应正确答案:C9、下列进程运行时所发生的典型事件中,哪一个不会导致进程终止( )。
A、设备忙B、堆栈溢出C、对只读内存执行写操作D、被0除正确答案:A10、下列各种方法中,哪一种方法与改善磁盘读写速度无关( )。
A、加磁盘缓存B、旋转调度算法C、磁臂调度算法D、优化设备分配方案正确答案:D11、关于Internet域名服务系统的描述中,错误的是( )。
死锁避免之模拟银行家算法的编程实现
2021.11网络信息工程死锁避免之模拟银行家算法的编程实现刘畅,文家俊,贾海鹏,徐艳(四川大学锦城学院计算机与软件学院,四川成都,611731)摘要:本文介绍了银行家算法的背景和意义,和死锁现象的产生,及死锁的避免思路,和算法的思路,并用C语言对算法进行了实现,以及其在实际生活的应用。
关键词:死锁;银行家;资源;算法应用Programming implementation of the simulated banker algorithmfor deadlock avoidanceLiu Chang,Wen Jiajun,Jia Haipeng,Xu Yan(School of Computer and Software,Jincheng College,Sichuan University,Chengdu Sichuan,611731) Abstract:This paper introduces the background and significance of banker*s algorithm,the emergence of deadlock phenomenon,the idea of deadlock avoidance,and the idea of algorithm,and realizes the algorithm with C language,as well as its application in real life.Keywords:deadlock;Banker:resource;algorithm application1研究背景与意义在进程运行中,经常出现多方进程都需要同一资源时,各方都希望其它进程能释放出所需要的资源,从而所有进程都无法获得所需要的资源而没有继续运行,也导致都无法释放出其占有的资源,且会一直在该状态,最后形成死锁。
而形成它的四个条件有互斥,不可抢占,占有和等待,环路等待等条件[1\Dijkstra的银行家算法原本是为了银行的系统设计的,是为了保证银行能顺利的发放贷款,在操作系统中也可以解决系统资源问题,使多进程进入安全状态,能够有效的避免死锁和合理的分配资源给多个进程阂,从而避免了死锁。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<stdio.h>struct pcb{int rdy[10];int nd[10];}jc[10],tjc[10];int sys[10],tsys[10];int nn;int n;int g;int qq;int ri=0;int a=0;int ww[10];int wait[10][10];int req[10];int as[10];int zhuang[10];char tcs;void inputpcb(){int i,j;printf("please input the num of source: ");scanf("%d",&nn);l:if(nn>1000 || nn <0) {printf("\nplease input the num of source: ");scanf("%d",&nn);goto l;}printf("\nplease input the num of available: ");for(i=1;i<=nn;i++){scanf("%d",&tsys[i]);o:if(tsys[i]>1000 || tsys[i] <0) {printf("\nplease input the num of available: ");scanf("%d",&tsys[i]);goto o;}}printf("\nplease input the num of PCB: ");scanf("%d",&n);t:if(n>1000 || n <0) {printf("\nplease input the num of PCB: ");scanf("%d",&n);goto t;}printf("\nplease input the PCB:\n");for(i=1;i<=n;i++){printf("\nthe %dth PCB,",i);printf("the already and the need\n");for(j=1;j<=nn;j++){scanf("%d",&(tjc[i].rdy[j]));tt:if(tjc[i].rdy[j]>100 || tjc[i].rdy[j]<0) {printf("\nplease input the already: ");scanf("%d",&(tjc[i].rdy[j]));goto tt;}}for(j=1;j<=nn;j++){scanf("%d",&(tjc[i].nd[j]));ttt:if(tjc[i].nd[j]>100 || tjc[i].nd[j]<0) {printf("\nplease input the need: ");scanf("%d",&(tjc[i].nd[j]));goto ttt;}}}}void csh(){int i,j;for(i=1;i<=nn;i++) sys[i]=tsys[i];for(i=1;i<=n;i++)for(j=1;j<=nn;j++) {jc[i].rdy[j]=tjc[i].rdy[j];jc[i].nd[j]=tjc[i].nd[j];}for(i=1;i<=n;i++) zhuang[i]=0;}void outputpcb(){int i,j;printf("allocation need available\n\n");for(i=1;i<=n;i++){printf(" ");for(j=1;j<=nn;j++) printf("%d ",tjc[i].rdy[j]);printf(" ");for(j=1;j<=nn;j++) printf("%d ",tjc[i].nd[j]);printf(" ");if(i==1) for(j=1;j<=nn;j++) printf("%d ",tsys[j]);printf("\n");}if(n==0){printf(" ");for(j=1;j<=nn;j++) printf("%d ",tsys[j]);printf("\n\n");}printf(" the wait query:\n");for(i=1;i<=a;i++){printf("\n%d ",ww[i]);for(j=1;j<=nn;j++)printf("%d ",wait[i][j]);}printf("\n\n");}void inputreq(){int i,j=0;printf("please input the PCB requested\n\n If you have no request,you can check the wait!\n\n");scanf("%d",&qq);oo:if(qq>1000 || qq<0) {printf("please input the PCB requested\n\n");scanf("%d",&qq);}for(i=1;i<=n;i++)if(qq==i) j++;if(j<1) {printf("meiyou xiangtong de jincheng,please input the PCB requested\n\n");scanf("%d",&qq);goto oo;}printf("please input the source requested\n\n");for(i=1;i<=nn;i++){scanf("%d",&req[i]);ooo:if(req[i]>1000 ||req[i]<0) {printf("please input the source requested\n\n");scanf("%d",&req[i]);goto ooo;}}}int locate(){int i,j,k;for(g=1;g<=n;g++){j=0;if(zhuang[g]==0){for(i=1;i<=nn;i++)if(jc[g].nd[i]>sys[i] ){j=1;i=nn;}if(j==0){for(k=1;k<=nn;k++){ sys[k]+=jc[g].rdy[k];zhuang[g]=1;}return(g);}}}return 0;}int ss(int ri){int i;for(i=1;i<=n;i++)if(locate()!=0) as[++ri]=g;if(i==n+1 && ri==n)return 1;elsereturn 0;}void output(){int i;printf("\nthe sort is ");for(i=1;i<=n;i++)printf("%d ",as[i]);}int canloc(){int i,j;j=0;for(i=1;i<=nn;i++)if(req[i]>(jc[qq].nd[i])) j=1;if(j==1) return 2;for(i=1;i<=nn;i++)if(req[i]>sys[i]) j=1;if(j==0) return 1;else return 0;}int change(int a[10],int b){int i;for(i=1;i<=nn;i++){jc[b].nd[i]-=a[i];jc[b].rdy[i]+=a[i];sys[i]-=a[i];}}int exchange(int a[10],int b){int i;for(i=1;i<=n;i++){jc[b].nd[i]+=a[i];jc[b].rdy[i]-=a[i];sys[i]+=a[i];}}void agree(){int i;for(i=1;i<=nn;i++) tsys[i]=tsys[i]-req[i];for(i=1;i<=nn;i++) tjc[qq].nd[i]=tjc[qq].nd[i]-req[i]; for(i=1;i<=nn;i++) tjc[qq].rdy[i]=tjc[qq].rdy[i]+req[i]; }void back(){int i,j,k,d;printf("shuru xiangyao chexiao de PCB hao or 0: ");scanf("%d",&k);while(k!=0){for(i=1;i<=nn;i++){sys[i]+= jc[k].rdy[i];tsys[i]+=tjc[k].rdy[i];}for(i=k;i<=n;i++)for(j=1;j<=nn;j++){jc[i].rdy[j]=jc[i+1].rdy[j];jc[i].nd[j]=jc[i+1].nd[j];tjc[i].rdy[j]=tjc[i+1].rdy[j];tjc[i].nd[j]=tjc[i+1].nd[j];}for(i=1;i<=a;i++){while (ww[i]==k){for(j=i;j<=a;j++){ww[j]=ww[j+1];for(d=1;d<=nn;d++)wait[j][d]=wait[j+1][d];}a-=1;}}n-=1;printf("shuru xiangyao chexiao de PCB hao or 0: ");scanf("%d",&k);}pstart();}int pstart(){printf("\n1.If you want to tuichu you can input a;\n");printf("2.If you want to chexiao zuoye you can input b;\n"); printf("3.If you want to shengqing ziyuan you can input c;\n"); scanf("%c",&tcs);if(tcs=='a')exit(0);elseif(tcs=='b') back();}main(){int i,j;clrscr();printf("Welcome to the yinhangjiasuanfa system!\n\n");pstart();inputpcb();while(1){csh();clrscr();outputpcb();inputreq();if(canloc()==1){change(req,qq);if(ss(ri)==1){output();agree();}else{exchange(req,qq);printf("the sys is not safe!!!");getch();}}elseif (canloc()==2){ printf("the request is bigger than need,stop the process and the next\n\n"); }else{ww[++a]=qq;for(i=1;i<=nn;i++)wait[a][i]=req[i];for(i=1;i<=a;i++){printf("\n%d ",ww[i]);for(j=1;j<=nn;j++)printf("%d ",wait[i][j]);}printf("\n\nthe availble is not enough for the request,save it and wait!\nThe next\n\n");}pstart();getch();}}。