银行家算法.docx
- 文档编号:24258954
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:21
- 大小:166.56KB
银行家算法.docx
《银行家算法.docx》由会员分享,可在线阅读,更多相关《银行家算法.docx(21页珍藏版)》请在冰豆网上搜索。
银行家算法
石家庄经济学院
华信学院
《计算机操作系统》
课程设计报告
实验名称操作系统
学号
姓名
指导教师
日期
一实习内容
本实习中共有两个实习题,模拟实现资源分配。
二实习目的
多个进程动态地共享系统资源可能会产生死锁现象.死锁的产生,必须同时满足四个条件:
第一个条件是互斥条件,即一个资源每次只能由一个进程占用;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其它资源;第三个是非出让条件,任何一个进程不能抢占另一个进程已经获得且未释放的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源.防止死锁的机构只需确保上述四个条件之一不出现,则系统就不会发生死锁.
在实习中假定系统中任一资源在每一时刻只能由一个进程使用,任何进程不能抢占其它进程正在使用的资源,当进程得不到资源时必须等待.因此只要资源分配策略能保证进程不出现循环等待,则系统就不会发生死锁.本实习要求学生编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁。
三实习题目
第一题:
用银行家算法实现资源分配。
要求:
(1)设计一个3个并发进程共享10个同类资源的系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。
(2)设计用银行家算法和随机分配算法,实现资源分配的两个资源分配程序,应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况。
(3)确定一组各进程依次申请资源数的序列,在相同的情况下分别运行上述两种资源分配程序,观察运行结果。
第二题:
用按序分配策略实现资源分配。
要求:
(1)设计一个3个进程共享10个资源的系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。
(2)设计用按序分配算法实现资源分配的资源分配程序,应具有显示或打印各进程依次要求申请的资源号以及依次分配资源地情况。
(3)确定两组各进程依次要求申请的资源号,要求其中的一组中各进程按序地申请资源,另一组中各进程申请资源不受序号限制,分别运行上述设计的资源分配程序,观察运行结果。
第一题:
用银行家算法实现资源分配。
1设计流程图
1.数据结构设计
本设计主要用到用到有数组、链表、结构体等详细描述如下:
银行家的进程结构体:
表1PCB格式
进程号
状态
当前申请量
资源需求总量
已占用资源量
尚需资源数
structpcb
{
charname;//进程号
charstatue;//状态r就绪f完成
intMax;//资源需求总量
intallocation;//已占用资源量
intNeed;//尚需资源数
structpcb*next;
};
2.算法设计
银行家算法:
1)该源程序分为以下几个模块:
银行家算法中分为四个模块:
(1)主函数模块
(2)初始化模块
(3)银行家模块
2)下面对各功能模块进行详细说明:
(1)函数:
主函数voidmain()
入口参数:
无
出口参数:
无
函数功能:
传入功能函数的参数
流程图如图1所示
(2)初始化函数模块函数pcb*create(structpcb*a,intn)
函数功能:
初始化进程链表,即创建n个进程,每次创建的进程都插到链表的末尾
入口参数:
结构体链表a,进程个数n
出口参数:
结构体链表
流程图如图2所示。
(3)银行家模块:
voidyinhang(structpcb*a,intn)
函数功能:
执行银行家算法,首先获取输入的要申请资源的进程名和申请量。
然后搜索链表查找到对应的进程并判断申请是否合理,合理的话进行试分配,更改链表中对应进程的参数。
然后进行安全型算法。
如果存在安全序列则保存试分配后的结果,否则恢复试分配之前的状态。
入口参数:
结构体链表a,进程的个数n
出口参数:
无
流程图如图3所示。
四运行效果图
第一题:
用银行家算法实现资源分配。
A.运行界面
图1打开后的界面
B.测试1
输入:
输入1进行初始化进程链表,输入进程个数3和3个进程的进程号,资源需求量,已占有的资源量
输出:
资源占用情况:
3个进程名、资源需求量、已占用资源量、尚需资源量、状态
结果:
初始化进程链表后的各个进程显示状况
图2初始化3个进程,及其显示情况
C.测试2
输入;输入2选择用银行家算法,输入要申请资源的进程名和申请资源个数
输出:
试分配后的结果、安全性算法、安全序列分配成功及分配后的资源占用情况
结果说明:
找到一个安全序列为安全状态一定是没有死锁发生,按abc顺序分配可以成功
图3用银行家算法试分配成功
d.测试3
输入;初始化进程链表、选择银行家算法、输入要申请资源的进程名和申请资源个数
输出:
试分配后的结果、安全性算法、没有找到安全序列说明资源分配不合理及分配后的资源占用情况
结果说明:
找不到一个安全序列,资源不能合理分配给各个进程,无法完成资源分配
图4试分配失败,没有找到安全序列
五设计总结
通过本次的课程设计学习,我学到了很多,银行家算法非常重要,通过本次实验,实现了避免死锁的银行家算法。
银行家算法是通过动态地检测系统中资源分配情况和进程对资源的需求情况,保证至少有一个进程能得到所需要的全部资源,从而能确保系统处于安全状态,才把资源分配给申请者,避免了进程共享资源时系统发生死锁。
银行家算法是一个分配资源的过程,是分配的序列不会产生死锁,此算法的中心思想是,按该法分配资源时,每次分配后总存在着一个进程,如果让它单独运行下去,必然可以获得它所需要的全部资源,也就是说,他能结束,而它结束后可以归还资源以满足其他申请者的需要。
这次实验我熟练地掌握了利用C++语言编写和调试动态资源的简单程序,加深了死锁产生的条件和原因,通过编程实现银行家算法来预防死锁,清楚地了解安全性算法的相关内容,加深了对课堂上所讲的内容的理解。
操作系统是一门重要的学科,通过这次课程设计我学会了很多知识,了解了很多有关编程时遇到的问题,并通过与同学和老师的沟通的交流,解决了问题,在实验中可能一个很小的问题就会影响到整个成程序无法运行下去,所以必须要认真仔细,耐心摸索,找到问题的关键。
附源程序代码
第一题:
用银行家算法实现资源分配。
#include"stdio.h"
#include"stdlib.h"
#include"iostream.h"
structpcb
{
charname;//进程号
charstatue;//状态r就绪f完成
intMax;//资源最大需求量
intallocation;//已占用资源量
intNeed;//尚需资源数
structpcb*next;
};
inte=10;
pcb*create(structpcb*a,intn)//初始化进程链表a表示队列n表示进程个数
{
structpcb*q,*s;
s=q=NULL;
s=a;
for(inti=1;i<=n;i++)
{
q=(structpcb*)malloc(sizeof(structpcb));
printf("请输入进程号资源总需求量已占资源量:
\n");
while
(1)
{
cin>>q->name>>q->Max>>q->allocation;
if(((q->Max)<=10)&&((q->allocation)<=10))
break;
else
printf("输入的有误,请重新输入:
\n");
}
q->statue='r';
e=e-(q->allocation);
q->next=NULL;
if(a==NULL)
{
a=s=q;
}
else
{
s->next=q;
s=s->next;
}
}
returna;
}
voidshow(structpcb*a)//打印进程情况
{
structpcb*p;
p=a;
printf("资源占用情况为:
\n");
printf("进程名资源最大需求总量已占用资源量尚需资源数状态:
\n");
while(p!
=NULL)
{
printf("%c\t%d\t%d\t%d\t%c\t\n",
p->name,p->Max,p->allocation,p->Max-p->allocation,p->statue);
p=p->next;
}
}
voidyinhang(structpcb*a,intn)//执行银行家算法a表示进程链表,n表示进程的个数
{
intw,Request,l,flag,r;//l是输出安全序列的下标,Request是进程申请的资源个数r记录试分配之前的系统资源个数
flag=0;
w=e;//w指代当前系统可以利用的资源
l=0;
structpcb*q,*x;//x用来申请资源的进程
chart;//记录要申请进程的资源名字
charm[20];
q=x=NULL;
q=x=a;
while
(1)
{
printf("请输入要申请资源的进程的进程名和要申请的资源个数:
\n");
cin>>t>>Request;
if(Request<=w)
break;
else
printf("输入的有误,请重新输入:
\n");
}
printf("试分配后的结果为:
\n");
printf("进程名资源需求总量已占用资源量状态系统可以利用的资源:
\n");
while(x!
=NULL)
{//把当前申请量付给进程
if(x->name!
=t)
x=x->next;
else
{
(x->allocation)=(x->allocation)+Request;
r=w=w-Request;//系统所剩资源
while(q!
=NULL)
{
printf("%c\t%d\t%d\t%c\t%d\t\n",
q->name,q->Max,q->allocation,q->statue,r);
q=q->next;
}
printf("-------------------------\n");
break;
}
}
printf("进行安全性算法\n");
for(inti=0;i { q=a; while(q! =NULL) { if((q->statue)! ='f') { if((q->allocation)==(q->Max)) { w=w+(q->allocation); q->statue='f'; printf("%c\t%d\t%d\t%c\t%d\t\n", q->name,q->Max,q->allocation,q->statue,w); m[l]=q->name; l=l+1; q=q->next; continue; } if(((q->Max)-(q->allocation))<=w) { q->statue='f'; m[l]=q->name; l=l+1; w=w+q->allocation; printf("%c\t%d\t%d\t%c\t%d\t\n", q->name,q->Max,q->allocation,q->statue,w); } q=q->next; } else q=q->next; } } q=a; while(q! =NULL)//判断状态 { if(q->statue! ='f') {flag=1; printf("找不到安全序列,资源分配不合理\n"); x=a; while(x! =NULL) {//把当前申请量付给进程 if(x->name! =t) x=x->next; else { (x->allocation)=(x->allocation)-Request; w=w+Request; break; } } show(a); return; } else { q=q->next; } } printf("安全序列为: \n");//输出安全序列 for(i=0;i { printf("%c",m[i]); } if(flag==0) { x=a; while(x! =NULL) {//把当前申请量付给进程 if(x->name! =t) x=x->next; else { //(x->allocation)=(x->allocation)-Request; if((x->allocation)==(x->Max)) { w=x->allocation; } break; } } printf("试分配成功! \n"); x=a; while(x! =NULL) { if((x->allocation)! =(x->Max)) { x->statue='r'; } x=x->next; } show(a); return; } cout< } voidmain() { intn,r,w;//w系统可以利用的资源,r创建进程个数 inte=10;//系统的资源总量 structpcb*a; a=NULL; while (1){ printf("----------------资源分配-----------------\n"); printf("****1.初始化进程链表****\n"); printf("****2.用银行家算法实现资源分配****\n"); //printf("****3.用随机分配算法实现资源分配****\n"); printf("请根据提示输入选择: \n"); scanf("%d",&n); switch(n) { case1: printf("请输入要创建进程的个数: \n"); scanf("%d",&r); e=10; a=NULL; a=create(a,r); show(a); printf("----------------------\n"); break; case2: yinhang(a,r); printf("----------------------\n"); break; /*case3: suiji(a); printf("----------------------\n"); break;*/ default: return; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)