银行家算法代码.docx
- 文档编号:3225351
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:15
- 大小:61.24KB
银行家算法代码.docx
《银行家算法代码.docx》由会员分享,可在线阅读,更多相关《银行家算法代码.docx(15页珍藏版)》请在冰点文库上搜索。
银行家算法代码
《操作系统原理》
实验报告
实验二银行家算法实验
专业:
计算机科学与技术
学号:
030840204
姓名:
简郸
实验日期:
2010-5-22
一、实验目的
通过银行家算法理解操作系统安全状态和不安全状态。
二、实验要求
根据课本第204页在T0时刻系统分配的资源,用银行家算法判断系统是否处于安全序列,它的安全序列怎样。
三、实验方法内容
1.算法设计思路
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
2.算法流程图
3.主要的常量变量
n:
系统中进程的总数
m:
资源类总数
Available:
ARRAY[1..m]ofinteger;
Max:
ARRAY[1..n,1..m]ofinteger;
Allocation:
ARRAY[1..n,1..m]ofinteger;
Need:
ARRAY[1..n,1..m]ofinteger;
Request:
ARRAY[1..n,1..m]ofinteger;
符号说明:
Available可用剩余资源
Max最大需求
Allocation已分配资源
Need需求资源
Request请求资源
4.主要模块
当进程pi提出资源申请时,系统执行下列
步骤:
(“=”为赋值符号,“==”为等号)
step
(1)若Request<=Need,gotostep
(2);否则错误返回
step
(2)若Request<=Available,gotostep(3);否则进程等待
step(3)假设系统分配了资源,则有:
Available=Available-Request;
Allocation=Allocation+Request;
Need=Need-Request
若系统新状态是安全的,则分配完成
若系统新状态是不安全的,则恢复原状态,进程等待
为进行安全性检查,定义数据结构:
Work:
ARRAY[1..m]ofinteger;
Finish:
ARRAY[1..n]ofBoolean;
安全性检查的步骤:
step
(1):
Work=Available;
Finish=false;
step
(2)寻找满足条件的i:
a.Finish==false;
b.Need<=Work;
如果不存在,gotostep(4)
step(3)
Work=Work+Allocation;
Finish=true;
gotostep
(2)
step(4)若对所有i,Finish=true,则系统处于安全状态,否则处于不安全状态
/*银行家算法,操作系统概念(OSconceptsSixEdition)
reeditbyJohnnyhagen,SCAU,runatvc6.0
*/
四、实验代码
#include"malloc.h"
#include"stdio.h"
#include"stdlib.h"
#definealloclensizeof(structallocation)
#definemaxlensizeof(structmax)
#defineavalensizeof(structavailable)
#defineneedlensizeof(structneed)
#definefinilensizeof(structfinish)
#definepathlensizeof(structpath)
structallocation
{
intvalue;
structallocation*next;
};
structmax
{
intvalue;
structmax*next;
};
structavailable/*可用资源数*/
{
intvalue;
structavailable*next;
};
structneed/*需求资源数*/
{
intvalue;
structneed*next;
};
structpath
{
intvalue;
structpath*next;
};
structfinish
{
intstat;
structfinish*next;
};
intmain()
{
introw,colum,status=0,i,j,t,temp,processtest;
structallocation*allochead,*alloc1,*alloc2,*alloctemp;
structmax*maxhead,*maxium1,*maxium2,*maxtemp;
structavailable*avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp,*worktemp1;
structneed*needhead,*need1,*need2,*needtemp;
structfinish*finihead,*finish1,*finish2,*finishtemp;
structpath*pathhead,*path1,*path2;
printf("\n请输入系统资源的种类数:
");
scanf("%d",&colum);
printf("请输入现时内存中的进程数:
");
scanf("%d",&row);
printf("请输入已分配资源矩阵:
\n");
for(i=0;i { for(j=0;j { printf("请输入已分配给进程p%d的%c种系统资源: ",i,'A'+j); if(status==0) { allochead=alloc1=alloc2=(structallocation*)malloc(alloclen); alloc1->next=alloc2->next=NULL; scanf("%d",&allochead->value); status++; } else { alloc2=(structallocation*)malloc(alloclen); scanf("%d,%d",&alloc2->value); if(status==1) { allochead->next=alloc2; status++; } alloc1->next=alloc2; alloc1=alloc2; } } } alloc2->next=NULL; status=0; printf("请输入最大需求矩阵: \n"); for(i=0;i { for(j=0;j { printf("请输入进程p%d种类%c系统资源最大需求: ",i,'A'+j); if(status==0) { maxhead=maxium1=maxium2=(structmax*)malloc(maxlen); maxium1->next=maxium2->next=NULL; scanf("%d",&maxium1->value); status++; } else { maxium2=(structmax*)malloc(maxlen); scanf("%d,%d",&maxium2->value); if(status==1) { maxhead->next=maxium2; status++; } maxium1->next=maxium2; maxium1=maxium2; } } } maxium2->next=NULL; status=0; printf("请输入现时系统剩余的资源矩阵: \n"); for(j=0;j { printf("种类%c的系统资源剩余: ",'A'+j); if(status==0) { avahead=available1=available2=(structavailable*)malloc(avalen); workhead=work1=work2=(structavailable*)malloc(avalen); available1->next=available2->next=NULL; work1->next=work2->next=NULL; scanf("%d",&available1->value); work1->value=available1->value; status++; } else { available2=(structavailable*)malloc(avalen); work2=(structavailable*)malloc(avalen); scanf("%d,%d",&available2->value); work2->value=available2->value; if(status==1) { avahead->next=available2; workhead->next=work2; status++; } available1->next=available2; available1=available2; work1->next=work2; work1=work2; } } available2->next=NULL; work2->next=NULL; status=0; alloctemp=allochead; maxtemp=maxhead; for(i=0;i for(j=0;j { if(status==0) { needhead=need1=need2=(structneed*)malloc(needlen); need1->next=need2->next=NULL; need1->value=maxtemp->value-alloctemp->value; status++; } else { need2=(structneed*)malloc(needlen); need2->value=(maxtemp->value)-(alloctemp->value); if(status==1) { needhead->next=need2; status++; } need1->next=need2; need1=need2; } maxtemp=maxtemp->next; alloctemp=alloctemp->next; } need2->next=NULL; status=0; for(i=0;i { if(status==0) { finihead=finish1=finish2=(structfinish*)malloc(finilen); finish1->next=finish2->next=NULL; finish1->stat=0; status++; } else { finish2=(structfinish*)malloc(finilen); finish2->stat=0; if(status==1) { finihead->next=finish2; status++; } finish1->next=finish2; finish1=finish2; } } finish2->next=NULL;/*Initializationcompleated*/ status=0; processtest=0; for(temp=0;temp { alloctemp=allochead; needtemp=needhead; finishtemp=finihead; worktemp=workhead; for(i=0;i { worktemp1=worktemp; if(finishtemp->stat==0) { for(j=0;j if(needtemp->value<=worktemp->value) processtest++; if(processtest==colum) { for(j=0;j { worktemp1->value+=alloctemp->value; worktemp1=worktemp1->next; alloctemp=alloctemp->next; } if(status==0) { pathhead=path1=path2=(structpath*)malloc(pathlen); path1->next=path2->next=NULL; path1->value=i; status++; } else { path2=(structpath*)malloc(pathlen); path2->value=i; if(status==1) { pathhead->next=path2; status++; } path1->next=path2; path1=path2; } finishtemp->stat=1; } else { for(t=0;t alloctemp=alloctemp->next; finishtemp->stat=0; } } else for(t=0;t { needtemp=needtemp->next; alloctemp=alloctemp->next; } processtest=0; worktemp=workhead; finishtemp=finishtemp->next; } } path2->next=NULL; finishtemp=finihead; for(temp=0;temp { if(finishtemp->stat==0) { printf("\n系统处于非安全状态! \n"); exit(0); } finishtemp=finishtemp->next; } printf("\n系统处于安全状态.\n"); printf("\n安全序列为: \n"); do { printf("p%d",pathhead->value); } while(pathhead=pathhead->next); printf("\n"); return0; } 五、实验结果 1.执行结果 果分析 现时系统剩余的资源矩阵能满足进程的请求,并且能使系统处于安全状态 六、实验总结 多个进程同时运行时,系统根据各类系统资源的最大需求和各类系统的剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法 代码
![提示](https://static.bingdoc.com/images/bang_tan.gif)