操作系统银行家算法.docx
- 文档编号:7723529
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:13
- 大小:381.76KB
操作系统银行家算法.docx
《操作系统银行家算法.docx》由会员分享,可在线阅读,更多相关《操作系统银行家算法.docx(13页珍藏版)》请在冰豆网上搜索。
操作系统银行家算法
广州大学学生实验报告
开课学院及实验室:
计算机科学与工程实验室2015年11月29日
实验课程名称
操作系统实验
成绩
实验项目名称
实验2银行家算法
指导老师
一、实验目的
1. 理解银行家算法。
2. 掌握进程安全性检查的方法及资源分配的方法。
3. 加深了解有关资源申请、避免死锁等概念。
4.体会和了解死锁和避免死锁的具体实施方法。
二、实验内容
(1) 设计进程对各类资源最大申请表示及初值确定。
(2) 设定系统提供资源初始状况。
(3) 设定每次某个进程对各类资源的申请表示。
(4) 编制程序,依据银行家算法,决定其申请是否得到满足。
三、实验原理
整体流程:
算法设计:
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请求资源
当进程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,则系统处于安全状态,否则处于不安全状态
四、实验设备
Win7下虚拟机VMware-workstation-11.0.0及CentOS-5.8-i386
五、实验要求
1.输入系统进程数量n和资源类型数量m。
2.输入每类资源的数量。
3.输入每个进程每类资源的最大需求量和已获资源量。
检验系统的安全系。
六、实验程序
#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("请输入系统资源的种类数:
");
scanf("%d",&colum);
printf("请输入现时内存中的进程数:
");
scanf("%d",&row);
printf("请输入已分配资源矩阵:
\n");
for(i=0;i {for(j=0;j {printf("请输入已分配给进程p%d的%c种系统资源: ",i+1,'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+1,'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"); do {printf("p%d",pathhead->value+1); } while(pathhead=pathhead->next); printf("\n"); return0;} 七、总结心得 (一)实验分析 设系统中有三种类型的资源(A、B、C)和五个进程(P1、P2、P3、P4、P5),A资源的数量为17,B资源的数量为5,C资源的数量为20。 在T0时刻系统状态如下表所求。 (二)实验心得总结 1、本次实验让我对银行家算法和死锁都有了一定的理解,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 2、操作系统的基本特征就是并发和共享,系统允许多个进程并发执行,并且共享系统的软、硬件资源。 为了最大限度的利用计算机资源,操作系统应采用动态分配的策略,但是这样就容易因资源不足、分配不当而引起“死锁”。 3、该算法就是一个资源分配过程,使分配序列不会产生死锁。 此算法的中心思想就是,每次分配后总存在着一个进程,如果让它单独的运行下去,必然可以获得它所需要的全部资源,而它结束后可以归还这类资源以满足其他申请者的需要。 4、只要现时内存中的进程数比系统资源最大需求数要高,那么,系统就会处于安全状态。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 银行家 算法