Java语言的银行家算法.docx
- 文档编号:30308092
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:14
- 大小:71.86KB
Java语言的银行家算法.docx
《Java语言的银行家算法.docx》由会员分享,可在线阅读,更多相关《Java语言的银行家算法.docx(14页珍藏版)》请在冰豆网上搜索。
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、源程序
publi?
cclass?
Banke?
r{
publi?
cfinal?
stati?
cintN=5;//?
?
?
?
publi?
cfinal?
stati?
cintM=3;//?
?
?
?
?
?
priva?
teintResou?
rce[]=newint[M];//?
?
?
?
?
?
?
?
priva?
teintAvail?
able[]=newint[M];//?
?
?
?
?
?
?
?
?
?
?
?
priva?
teintMax[][]=newint[N][M];//?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
priva?
teintAlloc?
ation?
[][]=newint[N][M];//?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
priva?
teintNeed[][]=newint[N][M];//?
?
?
?
?
?
?
?
?
?
priva?
teintWork[]=newint[M];//?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
priva?
teboole?
anFinis?
h[]=newboole?
an[N];//?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
priva?
teintReque?
st[]=newint[M];//?
?
?
?
?
?
?
priva?
teintp[]=newint[N];//?
?
?
?
?
?
?
publi?
cBanke?
r(int_Reso?
urce[],int_Avai?
lable?
[],int_Max[][],
int_Allo?
catio?
n[][]){//?
?
?
?
?
?
?
?
?
?
?
?
?
?
Syste?
m.array?
copy(_Reso?
urce,0,Resou?
rce,0,Resou?
rce.lengt?
h);
Syste?
m.array?
copy(_Avai?
lable?
0,Avail?
able,0,Avail?
able.lengt?
h);
Syste?
m.array?
copy(_Max,0,Max,0,Max.lengt?
h);
Syste?
m.array?
copy(_Allo?
catio?
n,0,Alloc?
ation?
0,Alloc?
ation?
.lengt?
h);
for(inti=0;i h;i++){//? ? ? ? ? ? ? ? ? Ne? ed? ? ? ? ? for(intj=0;j h;j++) Need[i][j]=Max[i][j]-Alloc? ation? [i][j]; } for(inti=0;i h.lengt? h;i++) //? ? ? Fi? nish? ? Reque? st? ? Finis? h[i]=false? ; for(inti=0;i st.lengt? h;i++) Reque? st[i]=0; Syste? m.array? copy(Reque? st,0,Work,0,Work.lengt? h);//? Requ? est? ? ? ? ? ? Wo? rk for(inti=0;i h;i++) //? ? ? ? ? ? ? ? ? ? ? ? ? ? p[i]=0; show();//? ? ? ? ? ? ? ? ? ? ? ? if(safe()){//? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Syste? m.out.print? ln("\n? ? ? ? ? ? ? ? ? ? ? ! "); Syste? m.out.print? ln("? ? ? ? ? ? : "); for(intj=0;j if(j==N-1) Syste? m.out.print? ("? ? "+p[j]); else Syste? m.out.print? ("? ? "+p[j]+"——>"); } Syste? m.out.print? ln("\n"); } } publi? cvoidbank(intk,int_Requ? est[]) throw? sArray? Index? OutOf? Bound? sExce? ption? {//? ? ? ? ? ? Syste? m.array? copy(_Requ? est,0,Reque? st,0,Reque? st.lengt? h); inti; for(i=0;i st.lengt? h;i++){ if(Reque? st[i]>Need[k][i]){//? ? k? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Syste? m.out.print? ln("? ? ? ? ? ? ? ? ! "); Syste? m.out.print? ln("? ? "+k+"? ? ? ? ? ? "+i+"? ? ? ? "+Reque? st[i] +",? ? ? ? ? ? "+"? ? ? ? ? ? ? ? ? "+Need[k][i]); break? ; } if(Reque? st[i]>Avail? able[i]){//? ? k? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Syste? m.out.print? ln("? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "+i+"? ? ? ? : " +Avail? able[i]); break? ; } } if(i==Reque? st.lengt? h){ Syste? m.out.print? ln("? ? "+k+"? ? ? ? ? ? ? ? ? ? : "); for(intj=0;j //? ? ? ? k? ? ? ? ? ? ? ? ? ? ? Syste? m.out.print? ("? ? "+k+"? ? ? ? "+j+"? ? ? : "+Reque? st[j] +"\n"); for(intj=0;j st.lengt? h;j++){//? ? ? Avail? able[j]=Avail? able[j]-Reque? st[j]; Alloc? ation? [k][j]=Alloc? ation? [k][j]+Reque? st[j]; Need[k][j]=Need[k][j]-Reque? st[j]; } if(! safe()){//? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Syste? m.out.print? ln("\n? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ! ? ? ? ? ? ? \n"); recov? er(k);//? ? ? ? ? ? ? ? ? ? ? ? ? ? show();//? ? ? ? ? ? ? ? ? ? ? ? }else{//? ? ? ? ? ? ? ? ? ? ? ? ? ? Syste? m.out.print? ln("\n? ? ? ? ? ? ? ! ! ! "); Syste? m.out.print? ln("? ? ? ? ? ? : "); for(intj=0;j if(j==N-1) Syste? m.out.print? ("? ? "+p[j]); else Syste? m.out.print? ("? ? "+p[j]+"——>"); } Syste? m.out.print? ln("\n"); show();//? ? ? ? ? ? ? ? ? ? ? ? } } } publi? cboole? ansafe(){//? ? ? ? ? ? Syste? m.array? copy(Avail? able,0,Work,0,Work.lengt? h);//? Avai? lable? ? ? ? ? ? ? ? ? ? Wo? rk for(inti=0;i h.lengt? h;i++) //? Fini? sh? ? ? ? ? ? ? ? ? ? ? ? fal? se Finis? h[i]=false? ; for(inti=0;i h;i++) //? ? ? ? ? ? ? ? ? ? ? ? ? ? p[i]=0; intn=0; for(inti=0;i if(Finis? h[i]==false? ){//? ? ? ? F? inish? [i]==0? ? ? intcount? er=0;//? ? ? for(intj=0;j if(Need[i][j]<=Work[j]) count? er++;//? ? ? ? ? ? ? ? ? ? } if(count? er==M){//i? ? ? ? ? ? ? ? ? ? ? ? Work? [j]>=Need[i][j]? ? Finis? h[i]=true;//i? ? ? ? ? ? ? ? ? p[n++]=i;//? ? ? ? ? ? ? for(intj=0;j Work[j]=Work[j]+Alloc? ation? [i][j];//? ? ? ? i=-1;//? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } } } intm; for(m=0;m if(! Finis? h[m]) break? ; if(m==N)//? ? ? ? ? ? Finis? h[m]=true,? ? ? ? ? ? ? ? tru? e,? ? ? ? ? ? ? ? fal? se retur? ntrue; else retur? nfalse? ; } publi? cvoidrecov? er(intk){//? ? ? ? ? ? ? ? ? for(inti=0;i st.lengt? h;i++){ Avail? able[i]=Avail? able[i]+Reque? st[i]; Alloc? ation? [k][i]=Alloc? ation? [k][i]-Reque? st[i]; Need[k][i]=Need[k][i]+Reque? st[i]; } } publi? cvoidshow(){//? ? ? ? ? ? ? ? ? ? ? ? Syste? m.out.print? ln("? ? ? ? ? ? ? : "); Syste? m.out.print? ln("? ? ? ? ? ? ? ? ? : "); for(inti=0;i rce.lengt? h;i++) Syste? m.out.print? ("? ? "+i+": "+Resou? rce[i]+""); Syste? m.out.print? ln("\n\n? ? ? ? ? ? ? ? ? ? ? ? ? (Avail? able)"); for(inti=0;i able.lengt? h;i++) Syste? m.out.print? ("? ? "+i+": "+Avail? able[i]+""); Syste? m.out.print? ln("\n\n? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (Max)"); Syste? m.out.print? ln("\t? ? 0"+"\t? ? 1"+"\t? ? 2"); for(inti=0;i Syste? m.out.print? ("? ? "+i+": "); for(intj=0;j Syste? m.out.print? ("\t"+Max[i][j]); Syste? m.out.print? ln(); } Syste? m.out.print? ln(); Syste? m.out.print? ln("? ? ? ? ? ? ? ? ? ? ? ? ? (Alloc? ation? )"); Syste? m.out.print? ln("\t? ? 0"+"\t? ? 1"+"\t? ? 2"); for(inti=0;i Syste? m.out.print? ("? ? "+i+": "); for(intj=0;j Syste? m.out.print? ("\t"+Alloc? ation? [i][j]); Syste? m.out.print? ln(); } Syste? m.out.print? ln("\n? ? ? ? ? ? ? ? ? ? ? ? (Need)"); Syste? m.out.print? ln("\t? ? 0"+"\t? ? 1"+"\t? ? 2"); for(inti=0;i Syste? m.out.print? ("? ? "+i+": "); for(intj=0;j Syste? m.out.print? ("\t"+Need[i][j]); Syste? m.out.print? ln(); } Syste? m.out.print? ln(); } publi? cstati? cvoidmain(Strin? g[]args) throw? sArray? Index? OutOf? Bound? sExce? ption? { intResou? rce[]={10,5,7}; intAvail? able[]={3,3,2}; intMax[][]={{7,5,3},{3,2,2},{9,0,2},{2,2,2}, {4,3,3}}; intAlloc? ation? [][]={{0,1,0},{2,0,0},{3,0,2}, {2,1,1},{0,0,2}}; intReque? st[]={1,0,2}; Banke? rbanke? r=newBanke? r(Resou? rce,Avail? able,Max,Alloc? ation? ); banke? r.bank(0,Reque? st);//? ? 0? ? ? ? ? (1,0,2) banke? r.bank(1,Reque? st);//? ? 1? ? ? ? ? (1,0,2) } } 10、总结 十一、参考文献
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 语言 银行家 算法