当前位置:文档之家› 操作系统原理课程设计

操作系统原理课程设计

操作系统原理课程设计——银行家算法模拟指导老师:周敏唐洪英杨宏雨杨承玉傅由甲黄贤英院系:计算机学院计算机科学与技术班级:0237-6学号:2002370609姓名:刘洪彬同组者:杨志时间:2005/1/10---2005/1/14银行家算法模拟一、设计目的本课程设计是学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。

二、设计要求银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。

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

从课程设计的目的出发,通过设计工作的各个环节,达到以下教学要求:两人一组,每组从所给题目中任选一个(如自拟题目,需经教师同意),每个学生必须独立完成课程设计,不能相互抄袭,同组者文档不能相同;设计完成后,将所完成的工作交由老师检查;要求写出一份详细的设计报告。

三、设计内容编制银行家算法通用程序,并检测所给状态的系统安全性。

1)银行家算法中的数据结构假设有n个进程m类资源,则有如下数据结构:可利用资源向量Available。

这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。

Available[j]=K,则表示系统中现有Rj 类资源K个。

最大需求矩阵Max。

这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。

如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。

分配矩阵Allocation。

这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给没一进程的资源数。

如果Allocation[i,j]=K,则表示进程i 当前已分得Rj类资源的数目为K。

需求矩阵Need。

这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。

如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。

上述三个矩阵存在如下关系:Need[i,j]= Max[i,j]- Allocation[i,j]2)银行家算法设进程I提出请求Request[N],则银行家算法按如下规则进行判断。

(1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。

(2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。

(3)系统试探分配资源,修改相关数据:AVAILABLE=AVAILABLE-REQUESTALLOCATION=ALLOCATION+REQUESTNEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

3)安全性检查(1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE(2)从进程集合中找到一个满足下述条件的进程,FINISH[i]=FALSENEED<=WORK如找到,执行(3);否则,执行(4)(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

WORK=WORK+ALLOCATIONFINISH=TRUEGO TO 2(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。

四、算法实现通过程序实现定义的进程,为各进程分配资源,具体过程是:首先在程序中定义了3类资源,数量分别为10,5,7。

然后定义进程p0,p1,p2,p3,p4,接着为各进程申请各资源,然后在程序执行并比较申请的资源数量与各资源所剩数量,若前者大于后者则申请失败,反之则成功。

同时该程序可以撤消新建进程,也可以查看资源分配情况。

五、程序流程图银行家算法程序流程图如下:六、模块间调用关系本程序的主要函数模块为:void changdata(int k) //为进程申请资源并修改数据int chkerr(int s) //检查分配是否成功void showdata() //查看资源情况void main() //主函数其中主函数中调用了void changdata(int k) 、int chkerr(int s)、void showdata()函数模块。

七、源程序清单#include "string.h"#include "iostream.h"#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}};int Request[N]={0,0,0};void main(){int i=0,j=0;char flag='Y';void showdata();void changdata(int);void rstordata(int);int chkerr(int);showdata();while(flag=='Y'||flag=='y'){i=-1;while(i<0||i>=M){cout<<" 请输入需申请资源的进程号(从0到"<<M-1<<",否则重输入!):"; cin>>i;if(i<0||i>=M)cout<<" 输入的进程号不存在,重新输入!"<<endl;}cout<<" 请输入进程"<<i<<"申请的资源数"<<endl;for (j=0;j<N;j++){cout<<" 资源"<<j<<": ";cin>>Request[j];if(Request[j]>NEED[i][j]){cout<<"进程"<<i<<"申请的资源数大于进程"<<i<<"还需要"<<j<<"类资源的资源量!";cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;flag='N';break;}else{if(Request[j]>AVAILABLE[j]){cout<<" 进程"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;flag='N';break;}}}if(flag=='Y'||flag=='y'){changdata(i);if(chkerr(i)){rstordata(i);showdata();}elseshowdata();}elseshowdata();cout<<endl;cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";cin>>flag;}}void showdata(){int i,j;cout<<" 系统可用的资源数为:"<<endl<<endl;cout<<" ";for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<AVAILABLE[j];cout<<endl;// cout<<endl;// cout<<" 各进程资源的最大需求量:"<<endl<<endl;// for (i=0;i<M;i++)// {// cout<<"进程"<<i<<":";// for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<MAX[i][j];// cout<<endl;// }cout<<endl;cout<<" 各进程还需要的资源量:"<<endl<<endl;for (i=0;i<M;i++){cout<<"进程"<<i<<":";for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<NEED[i][j];cout<<endl;}cout<<endl;cout<<" 各进程已经得到的资源量: "<<endl<<endl;for (i=0;i<M;i++){cout<<"进程"<<i<<":";for (j=0;j<N;j++)cout<<" 资源"<<j<<":"<<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 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){cout<<endl;cout<<" 系统不安全本次资源申请不成功"<<endl;cout<<endl;return 1;}}cout<<endl;cout<<" 经安全性检查,系统安全,本次分配成功。

相关主题