操作系统银行家算法课设Word格式.docx
- 文档编号:17059811
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:18
- 大小:183.01KB
操作系统银行家算法课设Word格式.docx
《操作系统银行家算法课设Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统银行家算法课设Word格式.docx(18页珍藏版)》请在冰豆网上搜索。
(1)逻辑结构与存储结构
均使用数组连续存储。
其中,已分配资源数矩阵Allocation、最大需求矩阵Max、各类资源All使用以矩阵的形式存储在磁盘上的txt文件中。
(2)主要算法基本思想
①主要算法
显示出已知的各类资源量,包括已分配资源数矩阵Allocation、最大需求矩阵Max、各个进程还需要的资源量Need、可用的资源量Available等。
读入这些数据,利用数组的结构,以银行家算法的思想,按照输入申请分配的资源量进行分配,其间是进行了数组元素之间的加减运算,代表着一定的现实含义。
然后进行安全性检测,如果能够找到安全序列则直接输出,若不能找到安全序列则重置资源量,询问是否再次分配,或进行下一次分配。
②程序流程图
6.详细设计
(1)部分函数
①voidChangeData(intk)//系统对进程请求响应,资源向量改变
{
intj;
for(j=0;
j<
N;
j++)
{
Available[j]=Available[j]-Request[j];
//响应请求,可用资源量减去请求资源量
Allocation[k][j]=Allocation[k][j]+Request[j];
//已分配资源量加请求资源量
Need[k][j]=Need[k][j]-Request[j];
//仍需要资源量减请求资源量
}
}
②voidResetData(intk)//未通过安全性检测后重置资源量
Available[j]=Available[j]+Request[j];
//恢复到假定分配以前
Allocation[k][j]=Allocation[k][j]-Request[j];
Need[k][j]=Need[k][j]+Request[j];
③intCheckSafe()//安全性检查函数:
在假定分配资源的情况下检查系统的安全性
intWork[N],Finish[M],temp[M];
//temp[]用来记录进程安全执行的顺序,以便输出安全序列
inti,j,m,k=0,count;
for(i=0;
i<
M;
i++)
Finish[i]=FALSE;
//作为标志
Work[j]=Available[j];
//把可利用资源数赋给Work[]:
待进程使用完资源后,可用于此后其它进程
i++)//对于M个进程中的第i个
count=0;
//计数器
for(j=0;
if(Finish[i]==FALSE&
&
Need[i][j]<
=Work[j])//当第i个进程第j类类资源满足Need<
=Work时
count++;
//计数器加1
if(count==N)//如果第i个进程各类资源都满足
{
for(m=0;
m<
m++)
Work[m]=Work[m]+Allocation[i][m];
//进程使用完资源后释放
Finish[i]=TRUE;
//说明该进程可以进行
temp[k]=i;
//记录下满足条件的进程号
k++;
i=-1;
}
if(Finish[i]==FALSE)//如果存在着不能顺利进行的进程,说明无法找到安全序列;
printf_s("
系统不安全本次资源申请不成功\n"
);
return1;
printf_s("
\n"
经安全性检查,系统安全,本次分配成功。
本次安全序列:
"
i++)//打印安全序列
printf_s("
进程"
%d"
temp[i]);
if(i<
M-1)
->
return0;
(2)源程序清单
//bankcalculater.cpp:
此文件包含"
main"
函数。
程序执行将在此处开始并结束。
//
#include"
pch.h"
#include<
iostream>
#include<
stdio.h>
string.h>
#defineM5//进程数
#defineN4//资源数
#defineFALSE0
#defineTRUE1
FILE*fp[4];
//定义文件指针数组
intAvailable[N];
//可用的资源量
intAll[N];
//各类资源总量
intAllocation[M][N];
//M个进程已经分配到的N类资源的资源量
intMax[M][N];
//初始最大需求资源量
intNeed[M][N];
//M个进程还需要N类资源的资源量
intRequest[N]={0,0,0,0};
//voidReadM()
//{fopen_s(&
fp[0],"
C:
\\Users\\14143\\Documents\\作业\\操作系统原理\\end\\M.txt"
"
r+"
//if(fp[0]==NULL)//读入(或写入)进程数量,如果无法读入则报错;
//{
//printf_s("
文件读取错误!
//exit
(1);
//}
//fscanf_s(fp[0],"
M);
//if(fclose(fp[0])==0)printf_s("
文件关闭失败!
//检测是否关闭成功
//}
voidReadAvailable()
fopen_s(&
\\Users\\14143\\Documents\\作业\\操作系统原理\\end\\Available.txt"
r"
//打开可使用资源量文件
if(fp[0]==NULL)
exit
(1);
inti=0;
i++)//读入矩阵
fscanf_s(fp[0],"
&
Available[i]);
if(fclose(fp[0]))printf_s("
//检测是否关闭成功(成功返回0,失败返回-1)
voidReadAllocation()
fp[1],"
\\Users\\14143\\Documents\\作业\\操作系统原理\\end\\Allocation.txt"
//打开分配资源量文件
if(fp[1]==NULL)
inti,j=0;
fscanf_s(fp[1],"
Allocation[i][j]);
//读入矩阵
if(fclose(fp[1]))printf_s("
voidReadMax()
fp[2],"
\\Users\\14143\\Documents\\作业\\操作系统原理\\end\\Max.txt"
//打开最大需求资源量文件
if(fp[2]==NULL)
}
inti,j=0;
fscanf_s(fp[2],"
Max[i][j]);
if(fclose(fp[2]))printf_s("
voidReadAll()
fp[3],"
\\Users\\14143\\Documents\\作业\\操作系统原理\\end\\All.txt"
fscanf_s(fp[3],"
All[i]);
if(fclose(fp[3]))printf_s("
voidShowdata()//显示数组(矩阵)
inti,j;
=======================================================================================================================\n"
================================================各类资源总数:
========================================================\n"
//显示可用资源量
****************************************************All************************************************************\n"
资源类别:
ABCD\n"
资源数目:
"
%d"
All[j]);
================================================系统可用资源量:
**************************************************Available************************************************************\n"
Available[j]);
=============================================各进程已经得到的资源量:
===================================================\n"
*************************************************Allocation************************************************************\n"
i);
号进程:
Allocation[i][j]);
==============================================各进程还需要的资源量:
====================================================\n"
*****************************************************Need**************************************************************\n"
Need[i][j]);
voidChangeData(intk)//系统对进程请求响应,资源向量改变
//响应请求,可用资源量减少
//已分配资源量增加
//仍需要资源量减少
voidResetData(intk)//未通过安全性检测后重置资源量
intCheckSafe()//安全性检查函数:
//temp[]用来记录进程安全执行的顺序
//把可利用资源数赋给Work[]
=Work[j])
if(count==N)//当进程各类资源都满足Need<
if(Finish[i]==FALSE)
i++)//打印安全系统的进程调用顺序
intmain()
inti=0,j=0;
intflag=1;
ReadMax();
ReadAvailable();
ReadAllocation();
ReadAll();
for(i=0;
i<
i++)
for(j=0;
j<
N;
{
Need[i][j]=Max[i][j];
Showdata();
//显示各类资源量
while(flag)
enter:
请输入需申请资源的进程号(从0到"
M-1);
):
scanf_s("
i);
if(i<
0||i>
=M)
输入的进程号不存在,重新输入!
gotoenter;
err:
请输入进程"
申请的资源数\n"
类别:
ABCD\n"
scanf_s("
Request[j]);
if(Request[j]>
Need[i][j])
{
printf_s("
号进程"
申请的资源数>
//申请的资源量超过所需要的资源量
还需要"
j);
类资源的资源量!
申请不合理,出错!
请重新选择!
gotoerr;
}
else
if(Request[j]>
Available[j])//申请的资源量超过可用资源量
{
printf_s("
申请的资源数大于系统可用"
gotoerr;
}
ChangeData(i);
//系统响应请求,满足需求量;
if(CheckSafe())
ResetData(i);
//未通过安全性检测后重置资源量
Showdata();
else
//通过后仍显示当前各类资源量
==============================================
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 银行家 算法