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

合集下载

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

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

《计算机操作系统》课程设计题目银行家算法分析学院计算机与软件学院专业计算机科学与技术班级学号姓名指导教师起止时间一、算法综述银行家算法:在进程向系统提出资源分配请求时,算法会先对进程提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。

若请求合法,则进行试分配。

最后对试分配后的状态调用安全性检查算法进行安全性检查。

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

二.算法分析2.1 银行家算法中的数据结构为资源的种类i进程的数量j可利用资源向量int Available[j]最大需求矩阵int Max[i][j]分配矩阵int Allocation[i][j]需求矩阵int need[i][j]= Max[i][j]- Allocation[i][j]申请各类资源数量int Request i[j] i进程申请j资源的数量工作向量int Work[x] int Finish[y]2.2银行家算法设Request i是进程P i的请求向量,如果Request i[j]=K,表示进程P i需要k个Rj类型的资源,当P i发出资源请求后,系统按照下述步骤进行检查:(1)如果Request i[j]≤Need[j],便转向步骤(2);否则认为出错,因为它所需要的资源数已经超过它所宣布的最大值。

(2)如果Request i[j]≤Available[j],便转向步骤(3);否则,表示尚无足够资源,P i须等待。

(3)系统试探着将资源分配给进程P 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];(4)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。

若安全,才正式将资源分配给进程P i,以完成本次分配;否则本次的试探分配作废,恢复原来的资源分配状态,让进程P i等待。

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

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

五邑大学实验报告操作系统课程实验报告2013~2014年度第1学期院系:计算机学院学号: 11080101姓名:宋蓓蕾任课教师:白明成绩评定:实验一:银行家算法完成日期:2013年12月20日1、实验目的银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。

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

2、实验内容(1) 设计进程对各类资源最大申请表示及初值确定。

(2) 设定系统提供资源初始状况。

(3) 设定每次某个进程对各类资源的申请表示。

(4) 编制程序,依据银行家算法,决定其申请是否得到满足。

3、算法设计(全部代码)#include <STRING.H>#include <stdio.h>#include <stdlib.h>#include <CONIO.H> /*用到了getch()*/#define M 5 /*进程数*/#define N 3 /*资源数*/#define FALSE 0#define TRUE 1/*M个进程对N类资源最大资源需求量*/int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};/*系统可用资源数*/int AVAILABLE[N]={10,5,7};/*M个进程对N类资源最大资源需求量*/int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; /*M个进程已经得到N类资源的资源量*/int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};/*M个进程还需要N类资源的资源量*/int Request[N]={0,0,0};void main(){int i=0,j=0;char flag;void showdata();void changdata(int);void rstordata(int);int chkerr(int);showdata();enter:{printf("请输入需申请资源的进程号(从0到");printf("%d",M-1);printf("):");scanf("%d",&i);}if(i<0||i>=M){printf("输入的进程号不存在,重新输入!\n");goto enter;}err:{printf("请输入进程");printf("%d",i);printf("申请的资源数\n");printf("类别: A B C\n");printf(" ");for (j=0;j<N;j++){scanf("%d",&Request[j]);if(Request[j]>NEED[i][j]){printf("%d",i);printf("号进程");printf("申请的资源数> 进程");printf("%d",i);printf("还需要");printf("%d",j);printf("类资源的资源量!申请不合理,出错!请重新选择!\n");goto err;}else{if(Request[j]>AVAILABLE[j]){printf("进程");printf("%d",i);printf("申请的资源数大于系统可用");printf("%d",j);printf("类资源的资源量!申请不合理,出错!请重新选择!\n");goto err;}}}}changdata(i);if(chkerr(i)){rstordata(i);showdata();}elseshowdata();printf("\n");printf("按'y'或'Y'键继续,否则退出\n");flag=getch();if (flag=='y'||flag=='Y'){goto enter;}else{exit(0);}}/*显示数组*/void showdata(){int i,j;printf("系统可用资源向量:\n");printf("***Available***\n");printf("资源类别: A B C\n");printf("资源数目:");for (j=0;j<N;j++){printf("%d ",AVAILABLE[j]);}printf("\n");printf("\n");printf("各进程还需要的资源量:\n"); printf("******Need******\n");printf("资源类别: A B C\n");for (i=0;i<M;i++){printf(" ");printf("%d",i);printf("号进程:");for (j=0;j<N;j++){printf(" %d ",NEED[i][j]);}printf("\n");}printf("\n");printf("各进程已经得到的资源量: \n"); printf("***Allocation***\n");printf("资源类别: A B C\n");for (i=0;i<M;i++){printf(" ");printf("%d",i);printf("号进程:");/*printf(":\n");*/for (j=0;j<N;j++){printf(" %d ",ALLOCATION[i][j]);}printf("\n");}printf("\n");}/*系统对进程请求响应,资源向量改变*/void changdata(int k){int j;for (j=0;j<N;j++){AVAILABLE[j]=AVAILABLE[j]-Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j]; NEED[k][j]=NEED[k][j]-Request[j];}}/*资源向量改变*/void rstordata(int k){int j;for (j=0;j<N;j++){AVAILABLE[j]=AVAILABLE[j]+Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]; NEED[k][j]=NEED[k][j]+Request[j];}}/*安全性检查函数*/int chkerr(int s){int WORK,FINISH[M],temp[M];int i,j,k=0;for(i=0;i<M;i++)FINISH[i]=FALSE;for(j=0;j<N;j++){WORK=AVAILABLE[j];i=s;while(i<M){if (FINISH[i]==FALSE&&NEED[i][j]<=WORK){WORK=WORK+ALLOCATION[i][j];FINISH[i]=TRUE;temp[k]=i;k++;i=0;}else{i++;}}for(i=0;i<M;i++)if(FINISH[i]==FALSE){printf("\n");printf("系统不安全! 本次资源申请不成功!\n");printf("\n");return 1;}}printf("\n");printf("经安全性检查,系统安全,本次分配成功。

民大-银行家算法-操作系统实验报告

民大-银行家算法-操作系统实验报告

银行家算法实验报告一、实验题目为了了解系统的资源分配情况,假定系统的任何一种资源在任一种资源在任意时刻只能被一个进程使用。

任何进程已经占用的资源只能由进程自己释放,而不能任由其他进程抢占。

当进程申请的资源不能满足时,必须等待。

因此,只要资源分配算法能保证进程的资源请求,且不出现循环等待,则系统不会出现死锁。

而银行家算法是避免死锁的一种重要方法。

通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法二、实验要求要求编写系统进行资源调度的程序,模拟进程的资源分配算法,了解死锁的产生和避免的办法。

一个是随机动态地进行资源分配的模拟程序,即只要系统当前剩余资源满足进程的当前要求,就立即将资源分配给进程,以观察死锁产生情况;一个是采用银行家算法,有效地避免死锁的产生。

要求用银行家算法和随机算法实现资源分配。

1.设计3-4个并发进程,共享系统的10个同类不可抢占的资源。

各进程动态进行资源的申请和释放。

2.用银行家算法和随机算法分别设计一个资源分配程序,运行这两个程序,观察系统运行情况,并对系统运行的每一步情况进行显示。

二、总的设计思想及语言环境、工具等1.算法设计思路银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。

这时系统将该进程从进程集合中将其清除。

此时系统中的资源就更多了。

反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他,请进程等待。

2.语言环境、工具计算机基本配置要求:操作系统:WIN 98/2000/XP/2003 等Windows平台内存:256MB及以上主存64KB(Memory)(以KB为单位分配)开发语言:Visual C++ 6.0四、数据结构与模块说明(功能与框图)五、源程序(指导老师验收通过)#include<string.h>#include<iostream.h>#define FALSE 0#define TRUE 1#define W 10 //最大进程数W=10#define R 20 //最大资源总数R=20int 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]; //进程请求向量void inputdata(); //数据输入void showdata(); //数据显示void changdata(int k);//进程请求资源数据改变void restoredata(int k); //数据恢复int chksec(int s); //系统安全性的检测int chkmax(int s); //检测最大需求void bank(); //检测分配的资源是否合理void main(){ int i,j;inputdata();for(i=0;i<M;i++){ j=chksec(i);if (j==0) break;}if (i>=M)cout<<"错误提示:经安全性检查发现,系统的初始状态不安全\n"<<endl;else{ cout<<"提示:经安全性检查发现,系统的初始状态安全!"<<endl;bank();}}void inputdata(){ int i=0,j=0,p;cout<<"请输入总进程数:"<<endl;do{cin>>M;if (M>W) cout<<endl<<"总进程数超过了程序允许的最大进程数,请重新输入:"<<endl;}while (M>W);cout<<endl;cout<<"请输入资源的种类数:"<<endl;do {cin>>N;if (N>R)cout<<endl<<"资源的种类数超过了程序允许的最大资源种类数,请重新输入:"<<endl; }while (N>R);cout<<endl;cout<<"请依次输入各类资源的总数量,即设置向量all_resource:"<<endl;for(i=0;i<N;i++) cin>>ALL_RESOURCE[i];cout<<endl;cout<<"请依次输入各进程所需要的最大资源数量,即设置矩阵max:"<<endl;for (i=0;i<M;i++){for (j=0;j<N;j++){do { cin>>MAX[i][j];if (MAX[i][j]>ALL_RESOURCE[j])cout<<endl<<"该最大资源数量超过了声明的该资源总数,请重新输入:"<<endl; }while (MAX[i][j]>ALL_RESOURCE[j]);}}cout<<endl;cout<<"请依次输入各进程已经占据的各类资源数量,即设置矩阵allocation:"<<endl;for (i=0;i<M;i++){for (j=0;j<N;j++){do{ cin>>ALLOCATION[i][j];if (ALLOCATION[i][j]>MAX[i][j])cout<<endl<<"已占有的资源数量超过了声明的最大资源数量,请重新输入:"<<endl;}while (ALLOCATION[i][j]>MAX[i][j]);}}cout<<endl;for (i=0;i<M;i++)for(j=0;j<N;j++)NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];for (j=0;j<N;j++){ p=ALL_RESOURCE[j];for (i=0;i<M;i++){ p=p-ALLOCATION[i][j];AVAILABLE[j]=p;if(AVAILABLE[j]<0)AVAILABLE[j]=0;}}}void showdata(){ int i,j;cout<<"各种资源的总数量,即向量all_resource为:"<<endl;cout<<" ";for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<ALL_RESOURCE[j];cout<<endl<<endl;cout<<"当前系统中各类资源的可用数量,即向量available为:"<<endl; cout<<" ";for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<AVAILABLE[j];cout<<endl<<endl;cout<<"各进程还需要的资源数量,即矩阵need为:"<<endl<<endl;for (i=0;i<M;i++){ cout<<"进程P"<<i<<": ";for (j=0;j<N;j++)cout<<NEED[i][j]<<" ";cout<<endl;}cout<<endl;cout<<"各进程已经得到的资源量,即矩阵allocation为: "<<endl<<endl;for (i=0;i<M;i++){ cout<<"进程P"<<i<<": ";for (j=0;j<N;j++)cout<<ALLOCATION[i][j]<<" ";cout<<endl;} cout<<endl;}void changdata(int k){ int j;for (j=0;j<N;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<N;j++){ AVAILABLE[j]=AVAILABLE[j]+Request[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<M;i++)FINISH[i]=FALSE;for(j=0;j<N;j++){ WORK=AVAILABLE[j];i=s;do{ if(FINISH[i]==FALSE&&NEED[i][j]<=WORK){WORK=WORK+ALLOCATION[i][j];FINISH[i]=TRUE;i=0;}else{ i++;}}while(i<M);for(i=0;i<M;i++)if(FINISH[i]==FALSE){ return 1;}} return 0;}int chkmax(int s){ int j,flag=0;for(j=0;j<N;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<<"请输入需申请资源的进程号(从P0到P"<<M-1<<",否则重新输入!):"; cout<<"p";cin>>i;if(i<0||i>=M)cout<<"输入的进程号不存在,重新输入!"<<endl;}cout<<"请输入进程P"<<i<<"申请的资源数:"<<endl;for (j=0;j<N;j++){ cout<<" 资源"<<j<<": ";cin>>Request[j];if(Request[j]>NEED[i][j]){ cout<<"进程P"<<i<<"申请的资源数大于进程P"<<i<<"还需要"<<j<<"类资源的资源量!";cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;flag='N';break;}else{ if(Request[j]>AVAILABLE[j]){ cout<<"进程P"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;flag='N';break;}}}if(flag=='Y'||flag=='y'){ changdata(i);if(chksec(i)){ cout<<endl;cout<<"该分配会导致系统不安全本次资源申请不成功,不予分配"<<endl;cout<<endl;restoredata(i);}else{ cout<<endl;cout<<"经安全性检查,系统安全,本次分配成功,且资源分配状况如下所示:"<<endl;cout<<endl;showdata();if(chkmax(i)){cout<<"在资源分配成功之后,由于该进程所需的某些资源的最大需求量已经满足,"<<endl;cout<<"因此在进程结束后系统将回收这些资源!"<<endl;cout<<"在资源收回之后,各进程的资源需求和分配情况如下所示:"<<endl;showdata();}}}cout<<endl;cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";cin>>flag; }}六、运行结果分析1.输入进程数、资源种类数、各类资源总数量、各进程所需要的最大资源数量、各进程所已经占据的各类资源数量2.经安全性检验,系统状态安全,进程P0申请资源3.经安全性检验,系统状态安全,进程P0获得所申请资源4.进程P3申请资源5.经安全性检验,系统状态安全,进程P3获得所申请资源6.进程P1申请资源7.经安全性检验,系统状态安全,进程P1获得所申请资源8.进程P2申请资源9.经安全性检验,系统状态安全,进程P2获得所申请资源5.进程P1申请资源6.经安全性检验,系统状态安全,进程P1获得所申请资源七、总结这次实验中我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

实验2 《银行家算法》实验报告

实验2 《银行家算法》实验报告

《操作系统》实验
实验二银行家算法
专业:班级:学号:姓名:
一.实验目的
1、理解死锁的定义、原因和必要条件。

2、掌握银行家算法和安全性算法的基本思想。

3、能够编程模拟利用银行家算法和安全性算法避免死锁的实现过程。

二.使用的设备和仪器
计算机+Windows XP +Visual C++6.0
三.实验内容及要求
编写一程序,能够模拟银行家算法和安全算法来避免死锁。

假设系统资源有A、B、C 三种,可以运行4个进程。

该程序具备的基本功能为:
1、程序可以输入3种资源的数目,4个进程对3种资源的最大需求量、已分配量和需求量。

2、能够判断某一时刻系统是否处于安全状态,如果处于安全状态能够给出安全序列。

3、当某进程提出资源申请时,能够判断是否能把资源分配给申请进程。

四.实验步骤
1、程序源代码
2、实验运行界面
五.实验总结
实验过程中遇到的问题、解决办法、收获和体会等。

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

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

操作系统实验报告二一:实验标题:实现死锁避免算法:银行家算法。

二:实验环境:操作系统:windows7编译器:Visual Studio 2010三:设计方案:1.实验目的通过程序模拟银行家算法,理解如何应用银行家算法避免死锁。

2.实验手段直接在C源程序定义整形进程数量、资源种类;用2维数组表示最大需求、已分配的资源。

从文件获取相关数量。

3.验证方式检验当前资源是否有安全序列,是的话输出安全序列。

四:实验代码:#include<stdio.h>#include<stdlib.h>#define P_num 5#define R_num 3int Allocation[P_num][R_num],Avaliable[R_num],Max[P_num][R_num]; int Need[P_num][R_num];int compare(int *a,int *b,int n){ int i;for(i = 0;i < n;i ++)if(a[i] < b[i])return 0;return 1;}void add(int *a,int *b,int n){ int i;for(i = 0;i < n;i++)a[i] += b[i];}void substract(int *a,int *b,int n){ int i;for(i = 0;i < n;i++)a[i] -= b[i];}void assign(int *a,int *b,int n){ int i;for(i = 0;i < n;i ++)a[i] = b[i];}void input(){FILE *fp;int i,j;if((fp = fopen("banker.txt","r")) == 0){ printf("cannot open the file");exit(0);}for(i = 0;i < P_num; ++i)for(j = 0;j < R_num; ++j){fscanf(fp,"%d",&Allocation[i][j]);}for(i = 0;i < P_num; ++i)for(j = 0;j < R_num; ++j){fscanf(fp,"%d",&Max[i][j]);}for(j = 0;j < R_num; ++j){fscanf(fp,"%d",&Avaliable[j]);}fclose(fp);for(i = 0;i < P_num; ++i)for(j = 0;j < R_num; ++j){Need[i][j] = Max[i][j] - Allocation[i][j];}}int issafe(int *sp){int i;int count = 0;int n = 0;int work[R_num],finish[P_num];assign(work,Avaliable,R_num);for(i = 0;i < P_num;i ++)finish[i] = 0;n = P_num;while(n --){for(i = 0;i < P_num;i ++)if((finish[i] == 0) && compare(work,Need[i],R_num)){ add(work,Allocation[i],R_num);finish[i] = 1;sp[count] = i;count ++;}if(count >= P_num)return 1;}return 0;}int request(int pid,int *r,int n){int i;int sp[P_num];if(compare(Need[pid],r,n) == 1 && compare(Avaliable,r,n) == 1){ substract(Avaliable,r,n);add(Allocation[pid],r,n);substract(Need[pid],r,n);if(issafe(sp)){printf("Security Path:\n\t");for(i = 0;i < P_num;i ++)printf("p[%d] ",sp[i]);printf("\n");return 1;}else{add(Avaliable,r,n);substract(Allocation[pid],r,n);add(Need[pid],r,n);printf("no Security Parh on this request\n");return 0;}}else{printf("no Security Parh on this request\n");return 0;}}void main(){int id,i;int r[R_num],sp[P_num];input();if(issafe(sp)){printf("Security Path:\n\t");for(i = 0;i < P_num;i ++)printf("p[%d] ",sp[i]);printf("\n");}elseprintf("failed\n");printf("input the new request's id:");scanf("%d",&id);printf("input the new request:");for(i = 0;i < R_num;++ i)scanf("%d",&r[i]);request(id,r,R_num);}banker.txt文件内容:0 1 02 0 03 0 22 1 10 0 27 5 33 2 29 0 22 2 24 3 33 3 2所得结果:Security Path:P[1] p[3] p[4] p[0] p[2] Intput the new request's id:0Input the new request:0 2 0Security Path:p[3] p[1] p[2] p[0] p[4] 问题和想法:。

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

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

计算机操作系统实验报告一、实验名称:银行家算法二、实验目得:银行家算法就是避免死锁得一种重要方法,通过编写一个简单得银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会与了解死锁与避免死锁得具体实施方法。

三、问题分析与设计:1、算法思路:先对用户提出得请求进行合法性检查,即检查请求就是否大于需要得,就是否大于可利用得.若请求合法,则进行预分配,对分配后得状态调用安全性算法进行检查。

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

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

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

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

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

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

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

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

(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它得资源,故应执行:Work=Work+Allocation;Finish[i]=true;转向步骤(2).(4)如果所有进程得Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态.四、程序源代码:#include〈stdio、h>#define W 5//最大进程数W=5#define R 3//最大资源总数=3int Available[3];//可利用资源向量int Max[5][3];//最大需求矩阵int Allocation[5][3]; //分配矩阵intNeed[5][3];//需求矩阵int Request[3];//进程请求向量void dispose(){printf(”请输入可利用资源向量Available(格式:a,b,c)\n”);scanf("%d,%d,%d”,&Available[0],&Available[1],&Available[2]);printf(”请输入最大需求数Max(格式:a,b,c)\n");for(int j=0;j<5;j++){printf("进程%d:\n”,j);ﻩscanf("%d,%d,%d",&Max[j][0],&Max[j][1],&Max[j][2]);}printf("请输入分配数Allocation(格式:a,b,c)\n");for(j=0;j〈5;j++){printf("进程%d\n”,j);scanf(”%d,%d,%d",&Allocation[j][0],&Allocati on[j][1],&Allocation[j][2]);}//输入Max[5][3],Available[5][3],Allocation[5][3]for(j=0;j〈5;j++)for(int i=0;i〈3;i++)Need[j][i]=Max[j][i]—Allocation[j][i];//求出Need[5][3]}main(){ﻩprintf(”银行家算法 \n");dispose();printf("安全性检查\n");int Work[3];//系统可提供进程继续运行所需得各类资源数char Finish[5];//表示系统就是否有足够得资源分配for(int i=0;i<5;i++)Finish[i]='f';for(intk=0;k<3;k++)Work[k]=Available[k];int q[5];for(int x=0;x〈50;x++){printf(”请输入一个序列:\n”);scanf("%d,%d,%d,%d,%d",&q[0],&q[1],&q[2],&q[3],&q[4]);for(i=0;i<5;i++){if((Need[q[i]][0]〈=Work[0])&&(Need[q[i]][1]〈=Work[1])&&(Need[q[i]][2]<=Work[2]))//比较Need[i][j]与Work[j]{ﻩ for(k=0;k<3;k++)Work[k]=Work[k]+Allocation[q[i]][k];ﻩ Finish[i]='t';ﻩ}}if((Finish[0]=='t’)&&(Finish[1]==’t')&&(Fin ish[2]=='t')&&(Finish[3]=='t')&&(Fin ish[4]=='t'))//通过Finish[i]判断系统就是否安全ﻩbreak;elseﻩprintf("此序列不就是安全序列,请重新输入一个序列!\n");ﻩif(x==49)ﻩreturn 0;}printf("这个系统安全!\n");int a;printf("请输入Request进程:\n”);scanf(”%d”,&a);printf("该进程Request(a,b,c)\n");scanf("%d,%d,%d",&Request[0],&Request[1],&Request[2]);//输入请求量Request[3]if((Request[0]<=Need[a][0])&&(Request[1]<=Need[a][1])&&(Request[2]〈=Need[a][2]))//判断Request[i]<=Need[a][i]{if((Request[0]<=Need[a][0])&&(Request[0]<=Need[a][1])&&(Request[0]〈=Need[a][2]))//判断Request[i]<=Available[a][i]ﻩ{ﻩfor(int k=0;k<3;k++){ﻩAvailable[k]=Available[k]—Request[k];ﻩAllocation[a][k]=Allocation[a][k]+Reques t[k];ﻩNeed[a][k]=Need[a][k]—Request[k];ﻩﻩﻩ//如果上述判断成功,则修改相应得Available[k],Allocation [a][k],Need[a][k]ﻩﻩ}ﻩprintf("资源分配成功!\n”);ﻩ}ﻩelse{ﻩprintf(”资源分配失败!\n");return 0;ﻩ}}else{printf("资源分配失败!\n");ﻩreturn 0;}}程序截图:五、实验总结多个进程同时运行时,系统根据各类系统资源得最大需求与各类系统得剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁。

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

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

竭诚为您提供优质文档/双击可除银行家算法操作系统实验报告篇一:计算机操作系统银行家算法实验报告计算机操作系统实验报告一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

三、问题分析与设计: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 如找到,执行步骤(3);否则,执行步骤(4)。

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

银行家算法实验报告

银行家算法实验报告

操作系统实验报告——银行家算法计科101班张昊翔1007300204一.实验目的1. 加深对死锁概念的理解。

2. 能够利用银行家算法,有效避免死锁的发生,或检测死锁的存在。

二.主要思想我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。

若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

三.实验原理在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。

所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵局状态时,若无外力作用,它们都将无法再向前推进。

为保证系统中诸进程的正常运行,应事先采取必要的措施,来预防死锁。

最有代表性的避免死锁的方法,是Dijkstra的银行家算法。

银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

死锁的产生,必须同时满足四个条件,第一个为互斥条件,即一个资源每次只能由一个进程占用;第二个为请求和保持条件,指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程阻塞,但又对自己已获得的其他资源保持不放;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。

操作系统_银行家算法报告

操作系统_银行家算法报告

实验四:银行家算法的实现一.实验目的(1)加深了解有关资源申请、避免死锁等概念。

(2)体会和了解死锁和避免死锁的具体实施方法。

二.实验属性该实验为设计性实验。

三.实验仪器设备及器材普通PC386以上微机四.实验要求本实验要求2学时完成。

本实验要求完成如下任务:(1)设计进程对各类资源最大申请表示及初值的确定。

(2)设定系统提供资源的初始状况。

(3)设定每次某个进程对各类资源的申请表示。

(4)编制程序,依据银行家算法,决定其资源申请是否得到满足。

(5)显示资源申请和分配时的变化情况。

五、实验设计及其思路数据结构:Available[m] 用来表示可利用资源的数目初始值是该类全部可用资源的数目。

MAX[n][m] 用来定义n个进程中的每一个进程对m类资源的最大需求Allocation[i][j] 用来表示i个进程中的每一个进程对j类资源已经拥有的数值Need[i][j] 用来表示i个进程中的每一个进程对j类资源还需要的数值在此程序中通过输入输出流从txt文档中读取数据进入以上数据数组中通过控控制台向request[i][j]数组输入值 此数组用来表示进程i 向j 资源请求申请资源个数 银行家算法流程图开始进程发出资源请求(request )所需要资源小于目前最大值Request<=need所需要资源小于可利用值Request<=avilable把资源分配给此进程并改变相关数值安全性算法 返回值是Y否出错(该系统无法执行此类进程)该进程暂时无法获得此资源 需等待还原相关数据是否分配成功结束是是否安全性算法流程图六 输出结果向其中输入三组数据1 p1发出请求向量request (1,0,2) 正确结果为分配资源2 p4发出请求向量request (3,3,0) 正确结果会产生安全问题要等待3 p0发出请求向量request (0,2,0)正确结果产生安全隐患需等待开始定义可以用的资源数目work 还有是否能在有限的资源条件下完成线程的标志finish ,并给他们所有的线程都可以顺利完成count 等于进程总数 尽可能多的找到满足(finish==false 和need<=work 这两个条件的线程)并对资源做相应的更改更改次数用count 计录 返回 N返回Y 结束是 否七、代码#include<iostream.h>#include<fstream.h>#include<stdio.h>int *avilable;//表示现在可利用的各类资源的数目int **max1;//用二维数组存储各给线程最多能够申请到个资源的数目int **allocation;//用二维数组存储目前各个线程已占用各类资源的数量int **need;//用二维数组存储目前每个进程还需要各类资源的数量方能完成工作int*xiancheng;//用来存储安全序列int m,n;//m用来记录资源的总数,n用来计算进程的总数void show();//用来向控制台输出allocation,needmax1,avilable的数据int correct();//安全性算法void createavilable();//为目前可利用资源赋初值void createmax();//为每一个进程对各类资源的最大需求赋初值void createallocation();//为目前各个进程已经申请到的资源赋初值void createneed();//为完成该进程所需要的各类资源数量赋初值int banker();//银行家算法int main(){ int choice=1;createavilable();createmax();createallocation();createneed();while(choice!=0){banker();cout<<"请输入你的选择(1继续,2重来 0 退出)"<<endl;cin>>choice;if(choice==1) show();if(choice==2){createavilable();createmax();createallocation();createneed(); }}return 0;}void createavilable(){ifstream inFile;int i;i=0;inFile.open("avilable.txt");//从txt文件中读取数据为其赋值inFile>>m;inFile.get();avilable=new int[m];cout<<"avilable:"<<endl;cout<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl;while(inFile){inFile>>avilable[i];cout<<avilable[i]<<'\t';//显示到控制台上char c;inFile.get(c);//用来准确定读取时位真正的结束位置i++;}cout<<endl;}void createmax(){ifstream inFile1;inFile1.open("max.txt");inFile1>>n;inFile1.get();max1=new int*[n];//实现为二维数组动态分配内存for(int k=0;k<n;k++)max1[k]=new int[m];cout<<"max:"<<endl;cout<<'\t'<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl;for(int i=0;i<n;i++){ cout<<"p"<<i<<'\t';for(int j=0;j<m;j++){ if(inFile1) inFile1>>max1[i][j];cout<<max1[i][j]<<'\t';}cout<<endl;}}void createallocation(){ifstream inFile1;inFile1.open("allocation.txt");allocation=new int*[n];for(int k=0;k<n;k++)allocation[k]=new int[m];cout<<"allocation:"<<endl;cout<<'\t'<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl;for(int i=0;i<n;i++){ cout<<"p"<<i<<'\t';for(int j=0;j<m;j++){ if(inFile1) inFile1>>allocation[i][j]; cout<<allocation[i][j]<<'\t';}cout<<endl;}}void createneed(){need=new int*[n];for(int k=0;k<n;k++)need[k]=new int[m];cout<<"need:"<<endl;cout<<'\t'<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl;for(int i=0;i<n;i++){ cout<<"p"<<i<<'\t';for(int j=0;j<m;j++){ need[i][j]=max1[i][j]-allocation[i][j];//根据max allocation和need的关系为need赋值cout<<need[i][j]<<'\t';}cout<<endl;}}int correct(){int *work;//工作向量bool *finish,flag;//finish用来表示进程是否可以在特定的资源下完成工作,flag用来标记循环是否结束int i, k,count1,count;work=new int[m];xiancheng=new int[m];for( i=0;i<m;i++)work[i]=avilable[i];finish=new bool[n];//初值都为falsefor(k=0;k<n;k++)finish[k]=false;count=0;do{for(i=0;i<n;i++){flag=false;count1=0;for(k=0;k<m;k++)if(need[i][k]<=work[k]) count1++;//判断i个进程对各类资源的需要是小于该类资源的工作数量并记录小于的个数else break;if(count1==m&&finish[i]==false)//判断对每类资源来说都是所需小于工作数量并且该类线程并没有完成任务{ for(k=0;k<m;k++){work[k]=work[k]+allocation[i][k];finish[i]=true;flag=true;}xiancheng[count]=i;count++;}}}while(flag==true);//可能多的找到满足(finish==false和need<=work 这两个条件的线程)并对资源做相应的更改更改次数用count计录cout<<count<<endl;if(count==n)return 1;elsereturn 0;}int banker(){int *request,i,j,count;request=new int[m];//资源请求i=count=0;cout<<"哪个进程请求资源"<<endl;cin>>j;cout<<"请依次输入a,b,c资源的请求数"<<endl;while(i<m) {cin>>request[i]; i++;}for(i=0;i<m;i++)if(request[i]<=need[j][i]) count++;else break;if(count!=m) //判断所需要资源小于目前最大值Request<=need {cout<<"此操系统不能完成这个进程"<<endl;return 0;}count=0;for(i=0;i<m;i++)if(request[i]<=avilable[i]) count++;else break;if(count!=m)//所需要资源小于可利用值Request<=avilable {cout<<"现在可利用资源不能满足需要,需要等候"<<endl; return 0;}for(i=0;i<m;i++){avilable[i]=avilable[i]-request[i];allocation[j][i]=allocation[j][i]+request[i];need[j][i]=need[j][i]-request[i];}if(correct()==1)//安全性算法{cout<<"可以将资源分配给"<<"p"<<j<<"进程,其中安全序列可以是:"<<endl;for(i=0;i<n;i++)cout<<"p"<<xiancheng[i]<<'\t';cout<<endl;}else{cout<<"因为会造成系统不安全,所以不分配资源给"<<"p"<<j<<"进程"<<endl;for(i=0;i<m;i++){avilable[i]=avilable[i]+request[i];allocation[j][i]=allocation[j][i]-request[i];need[j][i]=need[j][i]+request[i];}}return 0;}void show(){ int i,j;cout<<"avilable:"<<endl;cout<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl;for( i=0;i<m;i++)cout<<avilable[i]<<'\t';cout<<endl;cout<<"max:"<<endl;cout<<'\t'<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl;for( i=0;i<n;i++){ cout<<"p"<<i<<'\t';for( j=0;j<m;j++){cout<<max1[i][j]<<'\t';}cout<<endl;}cout<<"allocation:"<<endl;cout<<'\t'<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl; for(i=0;i<n;i++){ cout<<"p"<<i<<'\t'; for( j=0;j<m;j++){cout<<allocation[i][j]<<'\t';}cout<<endl;}cout<<"need:"<<endl;cout<<'\t'<<"a"<<'\t'<<"b"<<'\t'<<"c"<<endl; for( i=0;i<n;i++){cout<<"p"<<i<<'\t';for( j=0;j<m;j++){cout<<need[i][j]<<'\t';}cout<<endl;}}。

银行家算法实验报告绪论

银行家算法实验报告绪论

一、实验背景在计算机系统中,资源分配和死锁问题是操作系统领域的重要研究课题。

在多进程环境下,进程之间会共享系统资源,如CPU、内存、磁盘等。

然而,当多个进程同时申请资源时,可能会出现死锁现象,导致系统瘫痪。

为了避免死锁,研究者提出了多种资源分配算法,其中最具代表性的就是银行家算法。

银行家算法最初由Edsger Dijkstra于1965年提出,旨在解决银行在贷款业务中可能出现的死锁问题。

该算法通过模拟银行家在贷款业务中的决策过程,对资源分配进行动态规划,以确保系统处于安全状态,从而避免死锁的发生。

二、实验目的本次实验旨在通过实现银行家算法,加深对资源分配、死锁和安全性概念的理解,并掌握以下内容:1. 了解资源分配的基本原理和死锁的概念。

2. 掌握银行家算法的原理和实现方法。

3. 能够运用银行家算法对系统资源进行动态分配,并确保系统处于安全状态。

4. 分析实验结果,验证银行家算法的有效性。

三、实验原理1. 资源分配资源分配是指操作系统将资源分配给进程的过程。

在多进程环境下,资源分配策略需要考虑以下因素:(1)资源的类型和数量。

(2)进程对资源的最大需求。

(3)进程当前已分配的资源。

(4)系统可利用的资源。

2. 死锁死锁是指多个进程在执行过程中,因争夺资源而相互等待,导致系统无法继续执行的现象。

产生死锁的必要条件包括:(1)互斥条件:资源不能被多个进程同时占用。

(2)请求和保持条件:进程在等待资源时,仍保持已占有的资源。

(3)不剥夺条件:进程不能被强制剥夺已占有的资源。

(4)循环等待条件:存在一个进程序列,其中每个进程都在等待前一个进程所持有的资源。

3. 安全状态安全状态是指系统可以按照某种顺序为每个进程分配资源,使得所有进程都可以顺利完成的状态。

判断系统是否处于安全状态的方法如下:(1)计算每个进程的最大需求。

(2)计算系统可利用的资源。

(3)从最大需求中减去已分配的资源,得到剩余需求。

(4)判断剩余需求是否小于等于系统可利用的资源。

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

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

操作系统银行家算法实验报告操作系统银行家算法实验报告引言:操作系统是计算机科学中的一个重要领域,它负责管理计算机的硬件和软件资源,以提供良好的用户体验。

在操作系统中,银行家算法是一种重要的资源分配和调度算法,它可以确保系统中的进程安全地访问资源,避免死锁的发生。

本实验旨在通过实践运用银行家算法,深入理解其原理和应用。

实验目的:1. 理解银行家算法的基本原理;2. 掌握银行家算法的实现方法;3. 分析银行家算法在资源管理中的应用。

实验过程:1. 实验环境的搭建在本次实验中,我们使用了一台运行Windows操作系统的计算机,并安装了Java开发环境。

同时,我们使用了一个模拟的资源管理系统,以便更好地理解和实践银行家算法。

2. 银行家算法的原理银行家算法是通过对系统中的资源进行合理分配,以避免死锁的发生。

它基于以下几个假设:- 每个进程对资源的最大需求量是已知的;- 系统中的资源数量是有限的;- 进程在请求资源时必须先声明其最大需求量;- 进程在释放资源后,不能再重新请求。

3. 银行家算法的实现银行家算法的实现主要包括以下几个步骤:- 初始化:获取系统中的资源总量和每个进程的最大需求量;- 安全性检查:通过模拟分配资源并检查系统是否处于安全状态,以确定是否可以满足进程的资源请求;- 资源分配:根据安全性检查的结果,决定是否分配资源给进程。

4. 银行家算法的应用银行家算法在实际应用中具有广泛的用途,尤其是在多任务操作系统中。

它可以用于资源的分配和调度,以确保系统中的进程能够安全地访问资源,避免死锁的发生。

结论:通过本次实验,我们深入了解了银行家算法的原理和应用。

银行家算法作为一种重要的资源管理和调度算法,可以有效地避免死锁的发生,提高系统的可靠性和稳定性。

在今后的学习和工作中,我们将继续深入研究操作系统相关的算法和原理,以提升自己在该领域的专业能力。

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

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

实验四银行家算法实习内容通过编程理解银行家算法,掌握进程安全性检查的方法及资源分配的方法,加深了解有关资源申请、避免死锁等概念,体会和了解死锁和避免死锁的具体实施方法。

实习目的银行家算法是避免死锁的代表性算法。

本实习旨在加深了解有关资源申请、避免死锁、状态安全性等概念,并体会和运用避免死锁的具体实施方法。

然后依照本实习,自行设计模拟程序。

实习原理算法思想:银行家算法操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。

若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。

安全状态一定是没有死锁发生。

不安全状态:不存在一个安全序列。

不安全状态一定导致死锁。

实习编程思路和流程在避免死锁的方法中,如果施加的限制条件较弱,有可能获得令人满意的系统性能。

在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。

基本思想为:在分配资源之前,判断系统是否是安全的;若安全,才分配。

它是最具代表性的死锁算法,具体算法如下表示:假设进程P提出请求Request[i],则银行家算法按如下步骤进行判断:1)如果Request[i] <=Need[i],则转向2);否则出错。

2)如果Request[i] <=Available[i],则转向3);否则出错。

3)系统试探分配相关资源,修改相关数据:Available[i]=Available[i]-Request[i];Allocation[i]=Allocation[i]+Request[i];Need[i]=Need[i]-Request[i];4)系统执行安全性检查,如安全,则分配成立;否则试探性分配资源作废,系统恢复原状,进程进入等待状态。

操作系统实验二(银行家算法)实验报告

操作系统实验二(银行家算法)实验报告

实验二实验报告实验源码:#include "stdio.h"#include <iostream.h>#include <string.h>#define False 0 // 定义False#define True 1 // 定义Trueint Max[100][100] = {0}; // 各进程所需各类资源的最大需求int Avaliable[100] = {0}; // 系统可用资源char name[100] = {0}; // 资源的名称int Allocation[100][100] = {0}; // 系统已分配资源int Need[100][100] = {0}; // 还需要资源int Request[100] = {0}; // 请求资源向量int temp[100] = {0}; // 存放安全序列int Work[100] = {0}; // 存放系统可提供资源int M = 100; // 作业的最大数为100int N = 100; // 资源的最大数为100// 显示资源矩阵void showdata(){int i,j;printf("\n此时刻的资源分配情况为:\n");// 显示表头printf(" Max Allocation Need Avaliable\n");printf("PCB ");// 显示作业名称for(j = 0;j < 4;j++){for(i = 0;i < N;i++)printf("%c ",name[i]);printf(" ");}printf("\n");// 显示当前作业资源分配情况for(i = 0;i < M;i++){printf(" %d ",i);for(j = 0;j < N;j++)printf("%d ",Max[i][j]);printf(" ");for(j = 0;j < N;j++)printf("%d ",Allocation[i][j]);printf(" ");for(j = 0;j < N;j++)printf("%d ",Need[i][j]);if(i == 0){printf(" ");for (j = 0;j < N;j++)printf("%d ",Avaliable[j]);}printf("\n");}}// 进行资源分配int changdata(int i){int j;for (j = 0;j < M;j++) {Avaliable[j] = Avaliable[j] - Request[j];Allocation[i][j] = Allocation[i][j] + Request[j];Need[i][j] = Need[i][j] - Request[j];}return 1;}// 安全性算法int safe(){int i,d,k = 0,m,h,s,apply,Finish[100] = {0};int j;int flag = 0;for(i = 0;i < N;i++)Work[i] = Avaliable[i];printf(" 安全性检查\n");printf(" Work Need Allocation Work+Allocation Finish\n");printf("PCB ");// 显示作业名称for(j = 0;j < 4;j++){for(i = 0;i < N;i++)printf("%c ",name[i]);printf(" ");}printf("\n");// 显示当前作业资源分配情况for(i = 0;i < M;i++){apply = 0;for(j = 0;j < N;j++){if (Finish[i] == False && Need[i][j] <= Work[j]){apply++;if(apply == N){printf(" %d ",i);for(d = 0;d < N;d++)printf("%d ",Work[d]);printf(" ");for(d = 0;d < N;d++)printf("%d ",Need[i][d]);printf(" ");for(d = 0;d < N;d++)printf("%d ",Allocation[i][d]);printf(" ");for(m = 0;m < N;m++){Work[m] = Work[m] + Allocation[i][m];printf("%d ",Work[m]);}// 变分配数Finish[i] = True;temp[k] = i;printf(" ");printf("true ");printf("\n");i = -1;k++;flag++;}}}}for(i = 0;i < M;i++){if(Finish[i] == False){for(j = 0;j < N;j++){Avaliable[j] = Avaliable[j] + Request[j];;Allocation[i][j] = Allocation[i][j] - Request[j];;Need[i][j] = Need[i][j] + Request[j];}printf("\n系统进入不安全状态!此时系统不分配资源!\n"); // 不成功系统不安全return 0;}}printf("\n此时系统是安全的!\n"); // 如果安全,输出成功printf("安全序列为:");for(i = 0;i<M;i++) // 输出运行进程数组{printf("%d",temp[i]);if(i < M - 1)printf("->");}printf("\n");return 0;}// 利用银行家算法对申请资源对进行判定void share(){char ch;int i = 0,j = 0;ch = 'y';printf("\n请输入要求分配的资源进程号(0 - %d):",M - 1);scanf("%d",&i); // 输入须申请的资源号printf("\n请输入进程%d 申请的资源:\n",i);for(j = 0;j < N;j++){printf("%c:",name[j]);scanf("%d",&Request[j]); // 输入需要申请的资源}for (j = 0;j < N;j++){if(Request[j] > Need[i][j]) // 判断申请是否大于需求,若大于则出错{printf("\n进程%d 申请的资源大于它需要的资源",i);printf(" 分配不合理,不予分配!\n");ch = 'n';break;} else {if(Request[j] > Avaliable[j]) // 判断申请是否大于当前资源,若大于则{// 出错printf("\n进程%d 申请的资源大于系统现在可利用的资源",i);printf(" 分配出错,不予分配!\n");ch = 'n';break;}}}if(ch == 'y') {changdata(i); // 根据进程需求量变换资源showdata(); // 根据进程需求量显示变换后的资源safe(); // 根据进程需求量进行银行家算法判断}}// 主函数int main(){int t = 1,i,j,number,choice,m,n,flag;char ming;printf("\n请首先输入系统可供资源种类的数量:");scanf("%d",&n);N = n;for(i = 0;i < n;i++){printf("资源%d 的名称:",i + 1);scanf("%s",&ming);name[i] = ming;printf("资源的数量:");scanf("%d",&number);Avaliable[i] = number;}printf("\n");printf("请输入作业的数量:");scanf("%d",&m);M = m;printf("\n请输入各进程的最大需求量( %d * %d 矩阵)[Max]:\n",m,n);for(i = 0;i < m;i++)for(j = 0;j < n;j++)scanf("%d",&Max[i][j]);do{flag = 0;printf("\n请输入各进程已经申请的资源量( %d * %d 矩阵)[Allocation]:\n",m,n);for(i = 0;i < m;i++)for(j = 0;j < n;j++){scanf("%d",&Allocation[i][j]);if(Allocation[i][j] > Max[i][j])flag = 1;Need[i][j] = Max[i][j] - Allocation[i][j];}if(flag)printf("\n申请的资源大于最大需求量,请重新输入!\n\n");}while(flag);showdata(); // 显示各种资源safe(); // 用银行家算法判定系统是否安全while(1){if(t == 1){printf("\n 利用银行家算法预分配资源\n");share();t = 0;}else break;printf("\n 是否继续银行家算法?(按1 键继续,按其它任意键退出):");scanf("%d",&t);printf("\n");}return 1;}实验结果截图:运行程序:输入相应数据并完成首次自检:进程1请求资源Request(1,0,2):进程4请求资源Request(3,3,0):进程0请求资源Request(0,2,0):。

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

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

实验报告四实验名称:一、编程实现银行家算法二、测试算法日期:2015-11-24 班级:13级计科学号:姓名:一、实验目的银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。

二、实验内容用java语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。

程序能模拟多个进程共享多种资源的情形。

进程可以动态地申请资源,系统按照各个进程的申请动态地分配资源。

要求程序具有显示和打印各个进程的某一时刻的资源分配和安全序列;显示和打印各个进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。

三、项目要求与分析1.要找出某一状态下所有的安全序列,程序该如何实现?要找出这个状态下的所有的安全序列,前提是要使这个系统先处于安全状态,而系统的状态可以通过以下来描述:(1)进程剩余申请数=最大申请数-占有数;(2)可分配资源数=总数-占有数之和;2.银行家算法的局限性有哪些?银行家算法是一个最具有代表性的避免死锁的算法。

银行家算法把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求资源相当于用户向银行家贷款。

当进程执行继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求数。

若超过则拒绝分配资源,若没有超过则再检测系统现存的资源数能否满足该进程尚需的最大资源数,若能满足则按当前的申请量分配资源,否则也要推迟分配。

但任何一种算法都存在其缺点,对各种进程的资源分配要求严格,经常使其处于不安全状态,银行家算法的主要局限是过于谨慎和检查各申请者对各类资源的最大需求量开销较大。

四、具体实现1.资源类代码:// 资源类假设一共三类资源;class Sources {private int A;private int B;private int C;public Sources(int a, int b, int c) {super();this.B = b;this.A = a;this.C = c;}public Sources(Sources sources) {super();this.B = sources.getB();this.A = sources.getA();this.C = sources.getC();}public int getB() {return B;}public void setB(int B) {this.B = B;}public int getA() {return A;}public void setA(int A) {this.A = A;}public int getC() {return C;}public void setC(int C) {this.C = C;}2.进程类代码://进程类,包进程使用最大内存,当前已分配内存,和需要分配内存class Processor {private String name;private Sources maxSources;private Sources allSources;private Sources needSources;public String getName() {return name;}public void setName(String name) { = name;}public Sources getMaxSources() {return maxSources;}public void setMaxSources(Sources maxSources) {this.maxSources = maxSources;}public Sources getNeedSources() {return needSources;}public void setNeedSources(Sources needSources) {this.needSources = needSources;}public Sources getAllSources() {return allSources;}public void setAllSources(Sources allSources) {this.allSources = allSources;}3.相关显示测试代码// 显示当前系统和各个进程的资源使用情况public void showdata(Processor[] processors) {// 显示当前可用资源System.out.print("当前系统可分配资源为:");showSources(allSources);System.out.println("-----------------进程状态-------------"); System.out.println("进程号 Max Allocation Need ");System.out.println(" A B C A B C A B C");for (int i = 0; i < processors.length; i++) {System.out.print(processors[i].getName() + " "+ processors[i].getMaxSources().getA() + " "+ processors[i].getMaxSources().getB() + " "+ processors[i].getMaxSources().getC() + " "); System.out.print(processors[i].getAllSources().getA() + " "+ processors[i].getAllSources().getB() + " "+ processors[i].getAllSources().getC() + " "); System.out.println(processors[i].getNeedSources().getA()+ " "+ processors[i].getNeedSources().getB() + " "+ processors[i].getNeedSources().getC() + " ");}System.out.println("-----------------------------------");}4.运行结果:五、所遇问题与解决方法这个银行家算法只有申请资源的相应操作,没有其他的添加资源,删除资源等的操作,但由于水平有限,没来得及解决。

OS银行家算法实验报告

OS银行家算法实验报告

《操作系统原理》实验报告银行家算法实验专业:计算机科学与技术学号:************姓名:***实验日期:2012-5-9一、实验目的通过实验用编程语言模拟银行家诉法来加强对银行家安全算法的理解和掌握。

二、实验内容熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安全序列。

三、算法中用到的数据结构1.可利用资源向量Available2.最大需求矩阵Max3.分配矩阵Allocation4.需求矩阵Need模拟实现银行家算法以避免死锁的出现.分两部分组成:第一部分:银行家算法(扫描)1.如果Request<=Need,则转向2;否则,出错2.如果Request<=Available,则转向3,否则等待3.系统试探分配请求的资源给进程4.系统执行安全性算法第二部分:安全性算法1.设置两个向量(1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)(2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为False2.若Finish[i]=False&&Need<=Work,则执行3;否则执行4(I为资源类别)3.进程P获得第i类资源,则顺利执行直至完成!并释放资源:Work=Work+Allocation;Finish[i]=true;转24. 若所有进程的Finish[i]=true,则表示系统安全;否则,不安全!四、算法流程图五、实现代码#include <stdio.h>#define P_NUM 5#define S_NUM 3int Max[P_NUM][S_NUM],Allocation[P_NUM][S_NUM],Need[P_NUM][S_NUM];int Available[S_NUM],Request[S_NUM];int Work[S_NUM],Finish[P_NUM],CurrentProcessId=-1,Arrange[P_NUM],CurrentId=0; FILE *fpr,*fpw;int times=0;void init(){int i=0,j=0;for(i=0;i<P_NUM;i++){for(j=0;j<S_NUM;j++){scanf("%d",&Max[i][j]);}for(j=0;j<S_NUM;j++){scanf("%d",&Allocation[i][j]);Need[i][j]=Max[i][j]-Allocation[i][j];}Finish[i]=0;}for(j=0;j<S_NUM;j++){scanf("%d",&Available[j]);}}void allocation(){int j=0,reasonable=1;if(CurrentProcessId>-1 && CurrentProcessId<P_NUM){printf("P%d Requests :( ",CurrentProcessId);for(j=0;j<S_NUM;j++){Need[CurrentProcessId][j]=Need[CurrentProcessId][j]-Request[j];Allocation[CurrentProcessId][j]=Allocation[CurrentProcessId][j]+Request[j];Available[j]=Available[j]-Request[j];printf("%d ",Request[j]);if(Need[CurrentProcessId][j]<0 || Available[j]<0)reasonable=0;}printf(")\n");if(reasonable==0){UnAllocation();printf("The Request is not reasonable! The below table is same with the top table! \n");}}}int UnAllocation(){int j=0;if(CurrentProcessId>-1 && CurrentProcessId<P_NUM){for(j=0;j<S_NUM;j++){Need[CurrentProcessId][j]=Need[CurrentProcessId][j]+Request[j];Allocation[CurrentProcessId][j]=Allocation[CurrentProcessId][j]-Request[j];Available[j]=Available[j]+Request[j];}}}void safeCheck(){int j=0,processNo=0,times=0;for(j=0;j<S_NUM;j++){Work[j]=Available[j];}processNo=meetCommand();if(processNo<0){UnAllocation();printf("this state is not safty!\n");}else{printf("Assign source in sequence :");for(j=0;j<P_NUM;j++){printf("→P%d",Arrange[j]);}printf("\n\n\n\n\n");}CurrentProcessId=-1;for(j=0;j<P_NUM;j++){Finish[j]=0;Arrange[j]=0;}}int meetCommand(){int meet=0,finish=1,i=0,j=0,maxUnFinish=0;for(i=0;i<P_NUM;i++){if(Finish[i]==0){finish=0;maxUnFinish=i;}}if(finish==1)return 0;for(i=0;i<P_NUM ;i++){if(Finish[i]==0){meet=0;for(j=0;j<S_NUM;j++){if(Need[i][j]>Work[j])meet=-1;}if(meet==0 ){Finish[i]=1;printCheckInfo(i);for(j=0;j<S_NUM;j++){Work[j]=Work[j]+Allocation[i][j];}Arrange[CurrentId]=i;CurrentId++;meetCommand();}if(i==maxUnFinish && meet==-1)return -1;}}return 0;}void printInfo(){int i=0,j=0;printf("┌───────┬────────┬─────────┬─────────┬────────┐\n");printf("││Max │Allocation │Need │Available │\n");printf("│processID ├────────┼─────────┼─────────┼────────┤\n");printf("││ A B C │ A B C │ A B C │ A B C │\n");printf("├───────┼────────┼─────────┼─────────┼────────┤\n");for(i=0;i<P_NUM;i++){printf("│P%d │",i);for(j=0;j<S_NUM;j++){printf(" %d ",Max[i][j]);}printf("│");for(j=0;j<S_NUM;j++){printf("%d ",Allocation[i][j]);}printf("│");for(j=0;j<S_NUM;j++){printf("%d ",Need[i][j]);}printf(" │");if(i==0){for(j=0;j<S_NUM;j++){printf("%d ",Available[j]);}printf(" │\n");}if(i>0)printf(" │\n");}printf("└───────┴────────┴─────────┴─────────┴────────┘\n");}int printCheckInfo(int i){int j=0,allFinsh=1;if(times==0){printf("┌───────┬────────┬─────────┬─────────┬────────┐\n");printf("││Work │Allocation │Need ││\n");printf("│processID ├────────┼─────────┼─────────┤States │\n");printf("││ A B C │ A B C │ A B C ││\n");printf("├───────┼────────┼─────────┼─────────┼────────┤\n");times++;}printf("│P%d │",i);for(j=0;j<S_NUM;j++){if(Work[j]>9)printf(" %d ",Work[j]);if(Work[j]<10)printf(" %d ",Work[j]);}printf("│");for(j=0;j<S_NUM;j++){printf("%d ",Allocation[i][j]);}printf("│");for(j=0;j<S_NUM;j++){printf("%d ",Need[i][j]);}printf(" │");for(j=0;j<P_NUM;j++){printf("%d ",Finish[j]);allFinsh*=Finish[j];}printf(" │\n");if(allFinsh==0)printf("├───────┼────────┼─────────┼─────────┼────────┤\n");if(allFinsh> 0)printf("└───────┴────────┴─────────┴─────────┴────────┘\n");}main(){int j=0;char comeOn;fpr = fopen("banker.txt","r");fpw = fopen("outcoming.txt","w");printf("程序运行结果如下:\n");init();printInfo();allocation();safeCheck();scanf("\n%c",&comeOn);while(comeOn=='y'|| comeOn=='Y'){printInfo();scanf("%d",&CurrentProcessId);for(j=0;j<S_NUM;j++){scanf("%d",&Request[j]);}allocation();times=0;CurrentId=0;safeCheck();scanf("\n%c",&comeOn);}}六、总结通过了这次实验更透彻的理解了银行家算法如何来避免思索的产生,以及对银行家算法的具体实现步骤更加清晰的理解。

银行家算法 实验报告

银行家算法 实验报告

淮海工学院计算机工程学院实验报告书课程名:《操作系统原理》题目:银行家算法班级: 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.银行家算法的局限性有哪些?银行家算法是一种最有代表性的避免死锁的算法。

银行家算法即把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

实验三银行家算法实验报告

实验三银行家算法实验报告

实验三银行家算法实验报告一、实验目的银行家算法是一种用于避免死锁的算法,本次实验旨在通过编程实现银行家算法,并通过模拟银行家算法的运行过程来加深对该算法的理解。

二、实验过程及结果1. 系统设计为了模拟银行家算法的运行过程,需要设计一个包含多个进程和资源的系统。

每个进程都有一定的最大需求资源数和已分配资源数。

系统中还有一定数量的可用资源,进程可以请求资源和释放资源。

2. 算法实现在程序中实现银行家算法需要以下几个关键的函数:(1)银行家算法的主函数:实现进程的请求资源和释放资源操作,并在此过程中判断是否产生死锁;(2)安全检查函数:用于判断系统状态是否安全,即是否存在一个安全序列,如果存在则表示系统处于安全状态,否则表示系统处于不安全状态;(3)资源请求函数:用于进程请求资源的操作,根据银行家算法的要求进行判断;(4)资源释放函数:用于进程释放资源的操作。

3. 算法运行通过对编写的程序进行多次运行测试,模拟不同进程对资源的请求和释放,观察系统是否能够始终处于安全状态。

在每次运行中,记录并输出系统的安全序列和进程的状态等信息。

4. 实验结果分析通过实验运行结果的分析,可以得出以下结论:(1)银行家算法能够有效地避免死锁的发生;(2)系统中资源的分配和释放过程需要合理,否则可能导致系统陷入死锁;(3)资源的分配策略对系统的安全状态有重要影响。

三、实验总结通过本次实验,深入了解了银行家算法的原理和实现过程,并通过编程实践加深了对该算法的理解。

银行家算法是一种重要的死锁避免算法,能够保证系统处于安全状态下运行,并且能够合理地分配系统资源,避免系统陷入死锁。

四、参考文献[1] 《操作系统概念》,Abraham Silberschatz,Peter B. Galvin,Greg Gagne,电子工业出版社,2014年五、附录(示例代码省略)以上是本次实验的实验报告,通过实验我们深入了解了银行家算法,了解了它在操作系统中的应用和重要性。

银行家算法实验报告

银行家算法实验报告

银行家算法实验报告 The pony was revised in January 2021计算机操作系统实验报告何美西一、实验名称:银行家算法二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

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

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

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

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

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

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

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

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

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

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

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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

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

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

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

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

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

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

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

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

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

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

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

四.程序源代码:
#include <>
#define W 5验总结
多个进程同时运行时,系统根据各类系统资源的最大需求和各类系统的剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁。

银行家算法是避免死锁的主要方法,其思路在很多方面都非常值得我们来学习借鉴。

相关文档
最新文档