银行家死锁避免算法模拟实现JavaWord文档下载推荐.docx
- 文档编号:21686620
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:11
- 大小:78.65KB
银行家死锁避免算法模拟实现JavaWord文档下载推荐.docx
《银行家死锁避免算法模拟实现JavaWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《银行家死锁避免算法模拟实现JavaWord文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
实验名称
死锁避免算法实现
同组人姓名
实验性质
□基本操作●设计性
□综合性□验证性
实验日期
2010-05-10
实验成绩
教师评价:
实验预习□实验操作□实验结果□实验报告□其它□
教师签名:
一、实验目的及要求
(1)了解操作系统如何处理死锁
(2)通过编写程序掌握如何利用银行家算法来实现死锁的避免。
二、实验内容
(1)用熟悉的计算机编程语言编写一实现计算机资源动态分配的程序。
(2)要求接收用户输入数据,利用银行家算法来判断该次请求能否分配。
(3)掌握操作系统是如何在资源的动态分配过程中防止系统死锁的发生。
三、主要设备及软件
PC、WindowsXP操作系统、MyEclipseJava编译环境
四、实验流程、操作步骤或核心代码、算法片段
本人以Java语言模拟实现银行家避免死锁算法,其中分别把银行家算法和安全性检测算法封装在不同的类中,即classBanker和classSafeTest,最终在主类中创建Banker类对象进行测试。
具体实现代码如下:
1、银行家类Banker的实现:
packagecom.kaiping.AvoidDeadlock;
importjava.util.Scanner;
publicclassBanker{
intProcessNum;
//进程数
intSourceNum;
//资源类型数
int[]Available;
//可利用资源向量
int[][]Max;
//最大需求矩阵
int[][]Allocation;
//分配矩阵
int[][]Need;
//需求矩阵
publicBanker(intpN,intsN){
ProcessNum=pN;
SourceNum=sN;
Available=newint[SourceNum];
Max=newint[ProcessNum][SourceNum];
Allocation=newint[ProcessNum][SourceNum];
Need=newint[ProcessNum][SourceNum];
}
publicvoidInitilize(){//初始化方法
Scanners=newScanner(System.in);
System.out.println("
==========初始化=========="
);
for(inti=0;
i<
Max.length;
i++){
System.out.print("
请依次输入第"
+i+"
进程的各资源数:
"
for(intj=0;
j<
Max[i].length;
j++){
Max[i][j]=s.nextInt();
}
for(inti=0;
i<
Allocation.length;
i++){
进程中已分配资源的数量:
for(intj=0;
j<
Allocation[i].length;
j++){
Allocation[i][j]=s.nextInt();
Need[i][j]=Max[i][j]-Allocation[i][j];
}
for(inti=0;
Available.length;
请输入系统中第"
种资源的剩余量:
Available[i]=s.nextInt();
==========初始化结果=========="
MAXALLOCATIONNEEDAVAILABLE"
ProcessNum;
P"
:
"
SourceNum;
if(Max[i][j]>
9){//如果是两位数,控制格式,在数字前少输出一个"
。
System.out.print(Max[i][j]+"
}else{
System.out.print("
+Max[i][j]+"
}
if(Allocation[i][j]>
9){
System.out.print(Allocation[i][j]+"
+Allocation[i][j]+"
}
if(Need[i][j]>
System.out.print(Need[i][j]+"
+Need[i][j]+"
if(i==0){
SourceNum;
if(Available[j]>
System.out.print(Available[j]+"
+Available[j]+"
System.out.println();
}
=====完成初始化====="
System.out.println();
publicvoidBakerAlgorithm(){//银行家算法具体实现
int[]Request=newint[SourceNum];
intnumber;
//进程号
Scanners=newScanner(System.in);
inti;
//循环计数器
请输入要申请资源的进程号:
number=s.nextInt();
请输入请求向量:
for(i=0;
i<
Request[i]=s.nextInt();
if(Request[i]>
Need[number][i]){//所需资源数大于需求量
System.out.println("
进程所要求分配的资源数已超过其宣布的最大值,系统不予分配!
return;
Available[i]){//所需资源大于可利用资源
系统中无足够的资源满足进程的申请,系统不予分配!
i++){//假设系统将申请资源数分配给该进程,对数据进行相关修改
Available[i]-=Request[i];
Need[number][i]-=Request[i];
Allocation[number][i]+=Request[i];
SafeTestsafetest=newSafeTest(this);
if(safetest.SafeTestAlgorithm()){//安全性检查结果为安全
System.out.println("
系统可以为该进程分配资源!
return;
}else
{
系统不为该进程分配资源!
for(i=0;
i++){//系统不能为该进程分配资源,前面的假设作废,对数据进行相关修改
Available[i]+=Request[i];
Need[number][i]+=Request[i];
Allocation[number][i]-=Request[i];
}
2、安全性检测算法类SafeTest的实现:
classSafeTest{
int[]SafeSequence;
//安全序列向量
int[]Work;
//空闲资源矩阵
boolean[]Finish;
//进程资源分配完成标志
Bankerbanker;
//银行家实例
publicSafeTest(BankerbK){
banker=bK;
ProcessNum=bK.ProcessNum;
SourceNum=bK.SourceNum;
SafeSequence=newint[ProcessNum];
Work=newint[SourceNum];
Finish=newboolean[ProcessNum];
for(inti=0;
i++){//初始化向量SafeSequence、Finish
SafeSequence[i]=0;
Finish[i]=false;
i<
i++){//初始化向量Work
Work[i]=bK.Available[i];
publicbooleanSafeTestAlgorithm(){//安全性测试算法具体实现
intk=0;
inti,j;
//循环计数器
ProcessNum;
if(Finish[i]==false){
for(j=0;
j<
/*判断当前进程需求矩阵能否得到满足*/
if(banker.Need[i][j]>
Work[j])
break;
//不满足则跳出
}
if(j==SourceNum){//第i个进程满足
SafeSequence[k++]=i;
//将进程号存入安全序列
for(intq=0;
q<
q++){//修改空闲资源矩阵
Work[q]+=banker.Allocation[i][q];
}
Finish[i]=true;
//标志该进程可完成
i=-1;
//下次检查重头开始
i++){//检查标志数组,若尚有false则未找到安全序列
if(!
Finish[i]){
找不到安全序列,系统处于不安全状态!
returnfalse;
System.out.println("
找到安全序列:
i++){//显示安全序列
System.out.print("
+SafeSequence[i]+"
系统处于安全状态!
returntrue;
3、主类AvoidDeadlockImplement的实现:
publicclassAvoidDeadlockImplement{
publicstaticvoidmain(String[]args){
intProNum,SouNum;
//进程数、资源类型数
Bankerbanker;
//银行家算法对象
SafeTestsafetest;
//安全性测试算法对象
Scannerscanner=newScanner(System.in);
请依次输入系统中的【进程数】和【资源类型数】:
ProNum=scanner.nextInt();
SouNum=scanner.nextInt();
banker=newBanker(ProNum,SouNum);
banker.Initilize();
safetest=newSafeTest(banker);
if(safetest.SafeTestAlgorithm()){
intgate=1;
while(gate!
=0){
banker.BakerAlgorithm();
//死锁检测
如果您要继续分配资源请输入\"
1\"
,退出请输入\"
0\"
您输入的值为:
gate=scanner.nextInt();
System.out.println();
初始化错误,原系统进程处于不安全状态!
使用愉快!
期待您下次使用!
五、实验心得体会
1、测试教材上银行家算法例子结果如下:
2、实验心得
通过本次实验,我更进一步领会了操作系统是如何在资源的动态分配过程中防止系统死锁的发生,对银行家避免死锁算法也有了更深的认识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 死锁 避免 算法 模拟 实现 Java