Java语言的银行家算法.docx
- 文档编号:8230742
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:12
- 大小:71.35KB
Java语言的银行家算法.docx
《Java语言的银行家算法.docx》由会员分享,可在线阅读,更多相关《Java语言的银行家算法.docx(12页珍藏版)》请在冰豆网上搜索。
Java语言的银行家算法
操作系统课程设计(一号黑体加粗)
银行家算法模拟
(小二黑体加粗)
院系:
小二黑体加粗
班级:
学号:
姓名:
同组者:
时间:
目录(小二黑体加粗)
一、题目2
二、设计目的2
三、总体设计思想概述3
四、设计要求3
五、设计方案3
六、说明4
七、流程图5
八、运行结果5
九、源程序9
十、总结10
十一、参考文献10
一、题目:
(标题2,即三号黑体加粗)
银行家算法模拟。
二、设计目的:
通过此课程设计,进行的一次全面的综合训练,使之更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
三、总体设计思想概述:
安全状态下系统不会进入死锁,不安全状态可能进入死锁。
在进行资源分配之前,先计算分配的安全性,判断是否为安全状态。
四、设计要求:
银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
设计完成后,要求写出一份详细的设计报告。
五、设计方案:
编制银行家算法通用程序,并检测所给状态的系统安全性。
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-REQUEST
ALLOCATION=ALLOCATION+REQUEST
NEED=NEED-REQUEST
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
3)安全性检查
(1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE
(2)从进程集合中找到一个满足下述条件的进程,
FINISH[i]=FALSE
NEED<=WORK
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
WORK=WORK+ALLOCATION
FINISH=TRUE
GOTO2
(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。
六、说明
通过程序实现定义的进程,为各进程分配资源,具体过程是:
首先在程序中定义了3类资源,数量分别为10,5,7。
然后定义进程p0,p1,p2,p3,p4,接着为各进程申请各资源,然后在程序执行并比较申请的资源数量与各资源所剩数量,若前者大于后者则申请失败,反之则成功。
同时该程序可以撤消新建进程,也可以查看资源分配情况。
七、流程图:
八、运行结果
9、源程序
publicclassBanker{
publicfinalstaticintN=5;//?
?
?
?
publicfinalstaticintM=3;//?
?
?
?
?
privateintResource[]=newint[M];//?
?
?
?
?
?
?
privateintAvailable[]=newint[M];//?
?
?
?
?
?
?
?
?
?
privateintMax[][]=newint[N][M];//?
?
?
?
?
?
?
?
?
?
?
?
?
?
privateintAllocation[][]=newint[N][M];//?
?
?
?
?
?
?
?
?
?
?
?
?
privateintNeed[][]=newint[N][M];//?
?
?
?
?
?
?
?
?
privateintWork[]=newint[M];//?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
privatebooleanFinish[]=newboolean[N];//?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
privateintRequest[]=newint[M];//?
?
?
?
?
?
privateintp[]=newint[N];//?
?
?
?
?
?
publicBanker(int_Resource[],int_Available[],int_Max[][],
int_Allocation[][]){//?
?
?
?
?
?
?
?
?
?
?
?
System.arraycopy(_Resource,0,Resource,0,Resource.length);
System.arraycopy(_Available,0,Available,0,Available.length);
System.arraycopy(_Max,0,Max,0,Max.length);
System.arraycopy(_Allocation,0,Allocation,0,Allocation.length);
for(inti=0;i ? ? ? ? ? ? ? Need? ? ? ? for(intj=0;j Need[i][j]=Max[i][j]-Allocation[i][j]; } for(inti=0;i //? ? ? Finish? Request? ? Finish[i]=false; for(inti=0;i Request[i]=0; System.arraycopy(Request,0,Work,0,Work.length);//? Request? ? ? ? ? Work for(inti=0;i //? ? ? ? ? ? ? ? ? ? ? ? p[i]=0; show();//? ? ? ? ? ? ? ? ? ? if(safe()){//? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("\n? ? ? ? ? ? ? ? ? ! "); System.out.println("? ? ? ? ? : "); for(intj=0;j if(j==N-1) System.out.print("? ? "+p[j]); else System.out.print("? ? "+p[j]+"——>"); } System.out.println("\n"); } } publicvoidbank(intk,int_Request[]) throwsArrayIndexOutOfBoundsException{//? ? ? ? ? System.arraycopy(_Request,0,Request,0,Request.length); inti; for(i=0;i if(Request[i]>Need[k][i]){//? ? k? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("? ? ? ? ? ? ? ! "); System.out.println("? ? "+k+"? ? ? ? ? "+i+"? ? ? ? "+Request[i] +",? ? ? ? ? "+"? ? ? ? ? ? ? ? "+Need[k][i]); break; } if(Request[i]>Available[i]){//? ? k? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("? ? ? ? ? ? ? ? ? ? ? ? ? ? "+i+"? ? ? ? : " +Available[i]); break; } } if(i==Request.length){ System.out.println("? ? "+k+"? ? ? ? ? ? ? ? ? : "); for(intj=0;j //? ? ? ? k? ? ? ? ? ? ? ? ? System.out.print("? ? "+k+"? ? ? ? "+j+"? ? ? : "+Request[j] +"\n"); for(intj=0;j ? ? Available[j]=Available[j]-Request[j]; Allocation[k][j]=Allocation[k][j]+Request[j]; Need[k][j]=Need[k][j]-Request[j]; } if(! safe()){//? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("\n? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ! ? ? ? ? ? \n"); recover(k);//? ? ? ? ? ? ? ? ? ? ? ? show();//? ? ? ? ? ? ? ? ? ? }else{//? ? ? ? ? ? ? ? ? ? ? ? System.out.println("\n? ? ? ? ? ? ! ! ! "); System.out.println("? ? ? ? ? : "); for(intj=0;j if(j==N-1) System.out.print("? ? "+p[j]); else System.out.print("? ? "+p[j]+"——>"); } System.out.println("\n"); show();//? ? ? ? ? ? ? ? ? ? } } } publicbooleansafe(){//? ? ? ? ? System.arraycopy(Available,0,Work,0,Work.length);//? Available? ? ? ? ? ? ? ? Work for(inti=0;i //? Finish? ? ? ? ? ? ? ? ? ? false Finish[i]=false; for(inti=0;i //? ? ? ? ? ? ? ? ? ? ? ? p[i]=0; intn=0; for(inti=0;i if(Finish[i]==false){//? ? ? ? Finish[i]==0? ? ? intcounter=0;//? ? ? for(intj=0;j if(Need[i][j]<=Work[j]) counter++;//? ? ? ? ? ? ? ? ? } if(counter==M){//i? ? ? ? ? ? ? ? ? ? Work[j]>=Need[i][j]? ? Finish[i]=true;//i? ? ? ? ? ? ? ? p[n++]=i;//? ? ? ? ? ? for(intj=0;j Work[j]=Work[j]+Allocation[i][j];//? ? ? ? i=-1;//? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } } } intm; for(m=0;m if(! Finish[m]) break; if(m==N)//? ? ? ? ? Finish[m]=true,? ? ? ? ? ? ? true,? ? ? ? ? ? ? false returntrue; else returnfalse; } publicvoidrecover(intk){//? ? ? ? ? ? ? ? for(inti=0;i Available[i]=Available[i]+Request[i]; Allocation[k][i]=Allocation[k][i]-Request[i]; Need[k][i]=Need[k][i]+Request[i]; } } publicvoidshow(){//? ? ? ? ? ? ? ? ? ? System.out.println("? ? ? ? ? ? : "); System.out.println("? ? ? ? ? ? ? ? : "); for(inti=0;i System.out.print("? ? "+i+": "+Resource[i]+""); System.out.println("\n\n? ? ? ? ? ? ? ? ? ? ? (Available)"); for(inti=0;i System.out.print("? ? "+i+": "+Available[i]+""); System.out.println("\n\n? ? ? ? ? ? ? ? ? ? ? ? ? ? (Max)"); System.out.println("\t? ? 0"+"\t? ? 1"+"\t? ? 2"); for(inti=0;i System.out.print("? ? "+i+": "); for(intj=0;j System.out.print("\t"+Max[i][j]); System.out.println(); } System.out.println(); System.out.println("? ? ? ? ? ? ? ? ? ? ? (Allocation)"); System.out.println("\t? ? 0"+"\t? ? 1"+"\t? ? 2"); for(inti=0;i System.out.print("? ? "+i+": "); for(intj=0;j System.out.print("\t"+Allocation[i][j]); System.out.println(); } System.out.println("\n? ? ? ? ? ? ? ? ? ? (Need)"); System.out.println("\t? ? 0"+"\t? ? 1"+"\t? ? 2"); for(inti=0;i System.out.print("? ? "+i+": "); for(intj=0;j System.out.print("\t"+Need[i][j]); System.out.println(); } System.out.println(); } publicstaticvoidmain(String[]args) throwsArrayIndexOutOfBoundsException{ intResource[]={10,5,7}; intAvailable[]={3,3,2}; intMax[][]={{7,5,3},{3,2,2},{9,0,2},{2,2,2}, {4,3,3}}; intAllocation[][]={{0,1,0},{2,0,0},{3,0,2}, {2,1,1},{0,0,2}}; intRequest[]={1,0,2}; Bankerbanker=newBanker(Resource,Available,Max,Allocation); banker.bank(0,Request);//? ? 0? ? ? ? (1,0,2) banker.bank(1,Request);//? ? 1? ? ? ? (1,0,2) } } 10、总结 十一、参考文献
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 语言 银行家 算法