《操作系统原理》实验报告六资料Word下载.docx
《《操作系统原理》实验报告六资料Word下载.docx》由会员分享,可在线阅读,更多相关《《操作系统原理》实验报告六资料Word下载.docx(11页珍藏版)》请在冰点文库上搜索。
![《操作系统原理》实验报告六资料Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-4/28/181000e6-5eed-4d32-81d1-ee194611f2c6/181000e6-5eed-4d32-81d1-ee194611f2c61.gif)
Available,则进程i进入等待资源状态,返回。
(3)假设进程i的申请已获批准,于是修改系统状态:
Available=Available-Request
Allocation=Allocation+Request
Need=Need-Request
(4)系统执行安全性检查,如安全,则分配成立;
否则试探险性分配作废,系统恢复原状,进程等待。
2.安全性检查
(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,则表示安全;
否则系统不安全。
实验内容和步骤
1、本试验设计的目的是通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。
要求如下:
(1)
模拟一个银行家算法;
(2)
初始化时让系统拥有一定的资源;
(3)
用键盘输入的方式申请资源;
(4)
如果预分配后,系统处于安全状态,则修改系统的资源分配情况;
(5)
如果预分配后,系统处于不安全状态,则提示不能满足请求。
以下提供了部分该实例的源代码,要求同学们根据理论基础部分内容分析该源代码,并将缺失的程序代码补充完整,然后调试这段程序,最终按要求给出相应的结论。
#include<
stdio.h>
stdlib.h>
string.h>
time.h>
#defineM3//资源种类m种
#defineN4//进程个数n
intneed[10][3];
//进程还需资源矩阵
intmax[10][3];
//进程最大需求矩阵
intallocation[10][3];
//已分配资源矩阵
intavailable[3];
//可用资源向量
intwork[3];
intfinish[10],finish1[10];
//记录进程申请的资源是否能分配
intpath[10]={0,1,2,3,4,5,6,7,8,9};
//记录安全序列
intis_save;
//是否产生安全序列
intmark[10];
//记录某进程是否已分配资源
voiddisplay(int*a,intn)//显示一维数组
{inti;
for(i=0;
i<
n;
i++)
printf("
%3d"
a[i]);
}
voiddisp()//显示资源列表
Nnumber\tMax\t\tneed\t\tallocation\tavalible\n"
);
N;
{printf("
p%d\t"
i);
//--分别显示P0,P1,P2的Max,Need,Allocation,Avalible
display(max[i],M);
\t"
display(need[i],M);
display(allocation[i],M);
if(i==0)
display(available,M);
\n"
}
voidinit(){
inti,j;
srand(time(NULL));
M;
for(j=0;
j<
j++)
{
allocation[i][j]=rand()%10;
need[i][j]=rand()%10;
max[i][j]=allocation[i][j]+need[i][j];
available[i]=rand()%12;
}
disp();
is_save=0;
voidshowMenu(){
puts("
\n*****************************************************"
*0.初始化数据1.安全性算法2.银行家算法3.退出*"
*******************************************************"
intsafe()//检查安全序列
inti,j,k=1;
//k用来结束安全序列的查找
intflag=1;
//flag=0表示当前可用资源<
进程申请资源数
intr=0,r1=0;
//记录所需资源能被满足的进程数;
for(j=0;
j<
M;
j++)//初始化work
work[j]=available[j];
现在进行安全性检查......\n"
for(i=0;
i<
N;
i++)//初始化finish[],1表示true,0表示false
{
finish[i]=-1;
finish1[i]=-1;
//请在此处插入完成安全性检查算法的代码!
if(r>
=4){
printf("
-----找到安全序列-----\n"
for(i=0;
{
if(i!
=N-1)
p%d->
"
path[i]);
else
p%d\n"
}
return1;
else{
进行安全性检查后.....\n"
当前状态不安全!
return0;
voidprint_sav_seq(){
安全序列如下:
j++){
printf(j?
"
-->
:
p%d"
path[j]);
*****************************************************************"
*WorkNeedAllocationWork+AllocationFinish*"
*ABCABCABCABC*"
inti=path[j];
*P%d"
i);
%3d%3d%3d"
work[0],work[1],work[2]);
need[i][0],need[i][1],need[i][2]);
allocation[i][0],allocation[i][1],allocation[i][2]);
work[0]+=allocation[i][0];
work[1]+=allocation[i][1];
work[2]+=allocation[i][2];
%3d%3d%3dtrue*\n"
可用资源:
A->
%d;
B->
C->
%d\n\n\n"
available[0],available[1],available[2]);
voidbanker(){
intoper,i,j,flag1=0,flag2=0;
//用来比较request[j]>
need[i][j]和request[j]>
available[j]
intrequest[3];
while
(1){
flag1=flag2=0;
请输入要操作的进程号:
scanf("
%d"
&
i);
if(i>
N||i<
0){
printf("
你输入的进程号不存在!
break;
请输入各类资源的请求数:
%d%d%d"
request[0],&
request[1],&
request[2]);
//请在此处插入银行家算法实现的代码!
puts("
1.继续操作2.退出"
oper);
if(oper==2){
intmain(){
intoper;
showMenu();
请选择接下来的操作:
switch(oper){
case0:
init();
break;
case1:
if(safe()==1)is_save=1;
if(is_save==1){
print_sav_seq();
}else{
puts("
无法找到安全序列,请重新生成数据再运行程序"
return0;
}
case2:
banker();
case3:
return0;
default:
puts("
输入有误,清重试"
2、运行示例及结果截图
假设TO时刻的系统资源分配情况,写出其执行安全性检查和银行家算法的结果,分多种情况说明。
实验总结