操作系统银行家算法实验Word文档格式.docx
- 文档编号:8137518
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:16
- 大小:355.57KB
操作系统银行家算法实验Word文档格式.docx
《操作系统银行家算法实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统银行家算法实验Word文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
Need[i][j]=Need[i][j]-Request[i][j];
系统执行安全性检查,如安全,则分配成立;
否则试探险性分配作废,系统恢复原状,进程等待。
<
2>
安全性检查
设置两个工作向量work[j=Available[j];
Finish[MAXPRO]=false。
从进程集合中找到一个满足下述条件的进程:
Finish[i]=false;
Need[i][j]<
=work[j];
如找到,执行
;
否则,执行
设进程获得资源,可顺利执行,直至完成,从而释放资源。
work[j]=work[j]+Allocation[i][j];
finish[i]=true;
如所有的进程Finish[M]=true,则表示安全;
否则系统不安全。
3>
数据结构
#defineMAXPRO50//最大进程数
#defineMAXRES50//资源种类最大数
intn_res;
//进程数
intn_pro;
//资源数
intr,i=0,j=0;
//全局标志量
intAvailable[MAXRES];
//系统中各类资源可用数
intClaim[MAXPRO][MAXRES];
//各进程所需各类资源的最大需求数
intAllocation[MAXPRO][MAXRES];
//各进程已分配的各类资源数
intNeed[MAXPRO][MAXRES];
//各进程还需要的各类资源数
intRequest[MAXPRO][MAXRES];
//当前进程将要向系统申请的各类资源数
voidInit();
//初始化(各类资源数、进程数、)
intsafe();
//检测系统是否安全
voidbank();
//资源分配函数
voiddisplay()//显示函数
(2)各算法流程图
初始化函数Init()
银行家算法bank()函数
安全性算法safe()
请加上进程的状态转换图、各原语的功能说明、多级反馈队列调度算法的描述、程序功能结构图、流程图、数据结构定义、主要变量的说明、函数的说明等
三、所用仪器、材料(设备名称、型号、规格等)。
所用仪器:
计算中心201;
操作系统:
MicrosoftVisualC++;
软件平台:
MicrosoftVisualC++
四、实验方法、步骤
#include<
stdio.h>
stdlib.h>
conio.h>
#include<
windows.h>
voiddisplay();
//输出已知条件
inti=0,j=0,r;
//全局标志量
/***************************主函数*******************************/
voidmain()
{
Init();
display();
if(safe()==1)
for(i=0;
i<
n_pro;
)
bank();
}
/***********************************初始化**************************/
voidInit()
{
inti,j;
printf("
输入进程总数:
"
);
scanf("
%d"
&
n_pro);
输入资源种类数:
n_res);
输入Claim矩阵:
\n"
for(i=0;
i++)
for(j=0;
j<
n_res;
j++)
scanf("
%d"
Claim[i][j]);
//输入进程最大资源需求量
printf("
输入Allocation矩阵:
i++)
for(j=0;
scanf("
Allocation[i][j]);
//输入进程已分配的资源数
for(i=0;
for(j=0;
Need[i][j]=Claim[i][j]-Allocation[i][j];
//根据输入的两个数组计算出need矩阵的值
printf("
输入Available矩阵\n"
for(i=0;
scanf("
Available[i]);
//输入可用资源数
/************************安全算法函数***********************************/
intsafe()
intflag,v=0,i,j;
intwork[MAXRES],a[MAXPRO];
//数组a用于存放安全序列
boolfinish[MAXPRO];
//表示系统是否有足够的资源分配给进程
r=1;
finish[i]=false;
//初始化finish都是false
work[i]=Available[i];
//工作向量work[i]=available
{
if(finish[i]==false)
{
j++)
{
if(Need[i][j]>
work[j])
flag=0;
elseflag=1;
}
if(flag==1)//找到还没有完成且需求数小于可提供进程继续运行的资源数的进程
{
finish[i]=true;
a[v++]=i;
//记录安全序列号
for(j=0;
work[j]=work[j]+Allocation[i][j];
//释放该进程已分配的资源
i=-1;
//每完成一个进程分配,未完成的进程数就减1
}
}
}
i++)//判断是否所有的进程都完成
{
if(finish[i]==false)
flag=0;
//若有进程没完成,则为不安全状态
printf("
系统处在不安全状态!
r=0;
break;
}
else
\n系统当前为安全状态,安全序列为:
p%d"
a[i]);
//输出安全序列
r=1;
}
return(r);
}
/***********************************资源分配函数**************************************/
voidbank()
\n输入请求资源的进程号(0~4):
for(j=0;
=10;
scanf("
i);
if(i>
=n_pro)
输入错误,重新输入:
continue;
elsebreak;
\n输入该进程所请求的资源数request[i][j]:
Request[i][j]);
if(Request[i][j]>
Need[i][j])//判断请求是否超过该进程所需要的资源数
请求资源超过该进程资源需求量,资源浪费!
if(Request[i][j]>
Available[j])
printf("
没有足够的资源分配,请求失败!
exit(0);
else//请求满足条件
{
{
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];
//系统尝试把资源分配给请求的进程
safe();
//检测分配后的安全性
if(r==1)//如果分配后系统安全
for(j=0;
Available[j]=Available[j]+Request[i][j]+Allocation[i][j];
display();
}
if(r==0)//如果分配后系统不安全
j++)//还原已分配的资源数,仍需要的资源数和可用的资源数
{
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];
}
printf("
返回分配前资源数\n"
}
}
/************************************显示函数**********************************/
voiddisplay()
------------------此时刻资源分配情况-----------------\n"
进程名/号|Claim|Allocation|Need|\n"
for(i=0;
i<
n_pro;
p%d/%d"
i,i);
|"
for(j=0;
j<
n_res;
{
%d"
Claim[i][j]);
Allocation[i][j]);
Need[i][j]);
}
Available:
"
for(j=0;
%2d"
Available[j]);
请加上程序的源代码,需要有详细的注释。
五、实验过程原始记录(数据、图表、计算等)
T0时刻的资源分配表(各种资源的数量分别为:
10、5、5)如下:
资源情况
进程
Claim
ABC
Allocation
Need
Available
P0
753
010
743
332
P1
322
200
122
P2
902
302
600
P3
222
211
011
按上表输入各数:
1号进程请求资源、Request[i][j]<
Need[i][j]
1号进程再次请求资源、Request[i][j]=Need[i][j]、1号进程结束:
如上操作调度、直到最后所有进程结束:
如果在开始时1号进程请求资源、Request[i][j]>
当进程中有Need[i][j]>
Available[j]
程序的测试数据、运行截图
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。
其中,绘制曲线图时必须用计算纸)
对整个上机过程、上机结果进行总结、分析。
包括收获、存在问题、改进等方面。
银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程;
第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其他资源;
第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;
第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 银行家 算法 实验
![提示](https://static.bingdoc.com/images/bang_tan.gif)