华信学院操作系统实习银行家解析Word下载.docx
《华信学院操作系统实习银行家解析Word下载.docx》由会员分享,可在线阅读,更多相关《华信学院操作系统实习银行家解析Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
![华信学院操作系统实习银行家解析Word下载.docx](https://file1.bdocx.com/fileroot1/2022-10/26/be16d889-a587-4520-9b04-804f71e05f95/be16d889-a587-4520-9b04-804f71e05f951.gif)
要求:
(1)设计一个3个并发进程共享10个同类资源的系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。
(2)设计用银行家算法和随机分配算法,实现资源分配的两个资源分配程序,应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况。
(3)确定一组各进程依次申请资源数的序列,在相同的情况下分别运行上述两种资源分配程序,观察运行结果。
二、实验目的
编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生.
多个进程动态地共享系统的资源可能会产生死锁现象。
死锁的产生,必须同时满足四个条件,第一个是互斥条件,即一个资源每次只能由一个进程占用;
第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其它资源;
第三个是非出让条件,任何一个进程不能抢占另一个进程已经获得且未释放的资源;
第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只须确保上述四个条件之一不出现,则系统就不会发生死锁。
在实习中假定系统中任一资源在每一时刻只能则由一个进程使用,任何进程不能抢占它进程正在使用的资源,当进程得不到资源时必须等待。
因此只要资源分配策略能保证进程不出现循环等待,则系统就不会发生死锁。
本实习要求学生编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。
三、实验过程
1.数据结构设计
随机算法和银行家算法中的进程的pcb
structpcb
{
charname;
//进程号
charstate;
//状态r就绪f完成
intapplyall;
//资源需求总量
intallocation;
//已占用资源量
structpcb*next;
};
按序分配中的进程的pcb
//状态r就绪f完成d表示申请资源不合法
intapplynow;
//当前申请的资源号
intapplylast;
//上次申请的资源号
intapply[10];
//进程总共需要申请的资源
2.算法设计
算法思想:
这个实验按照要求需要实现三种资源分配的算法,银行家算法、随机分配算法和按序分配算法。
银行家算法要求先判断申请的资源是否满足条件(小于进程所需求的资源个数同时还要小于系统可以利用的资源个数),如果满足条件就进行试分配,然后寻找安全序列;
如果存在安全序列则证明试分配可以采用,否则请求不合理。
随机分配的算法和银行家大体上差不多,也是想要判断申请的资源时候满足条件,如果满足的话就直接给进程分配资源。
随机分配与银行家算法的区别在于随机分配会出现死锁的情况。
最后是按序分配,按序分配采取的是摒弃环路等待的思想来避免死锁。
系统对资源进行编号,各个进程只能按照顺序从小到大的申请资源,如果某一个进程为按需申请资源,则它就不能得到申请的资源。
同时进程每次只能申请一个资源,申请到了新的资源就把上一次申请的资源释放;
如果进程申请的资源被占用,则不能申请该资源。
在银行家算法的程序中我一共编写了四个函数,pcb*create(structpcb*a,intn)是初始化进程链表,即创建n个进程,每次创建的进程都插到链表的末尾,传入的参数是结构体链表。
voidshow(structpcb*a)是打印进程的情况,传入的参数是结构体链表。
voidbank(structpcb*a,intn)是执行银行家算法,传入的参数是结构体链表,首先获取输入的要申请资源的进程名和申请量。
然后搜索链表查找到对应的进程并判断申请是否合理,合理的话进行试分配,更改链表中对应进程的参数。
然后进行安全型算法。
如果存在安全序列则保存试分配后的结果,否则恢复试分配之前的状态。
voidrandom(structpcb*a)是随机分配的函数,传入的参数是结构体链表。
也是先获取输入的要申请资源的进程名和申请量,然后搜索链表查找到对应的进程并判断申请是否合理,合理的话就给进程分配资源,否则不进行分配。
在按序分配算法的程序中我一共编写了四个函数,voidinit()是初始化系统的资源,系统的10类资源没有被占用,所以全部付0。
pcb*create(structpcb*a,intn)初始化进程链表同时进行第一次资源分配,传入的参数是结构体链表。
也是依次创建n个进程,每次插入到链表的末尾。
在申请资源时,如果当前申请的资源被占用则设进程当前申请的资源的值为11,否则设成申请的资源的序号。
voidradom(structpcb*a,intw)是实现按需分配的函数,传入的参数是结构体链表和进程的个数。
我设置了一个标志位来控制分配的过程,先判断标志位,然后在判断进程的状态,接着查找进程申请资源的数组,如果即将申请的资源未被占用则可以申请,并释放上次申请的资源,同时还要改变系统资源的状态和进程自己资源的状态;
否则不能申请,换下一进程在申请资源。
之后重复上面的操作。
具体的流程图如下:
1.创建流程图
2.显示流程图
3.安全算法
4.银行家算法
图3-2-5随机分配算法
3.程序实现及运行结果
图3-3-1初始化
根据提示首先选择1初始化进程链表,输入创建进程的个数3个。
分别按照提示输入a52、b63、c72。
图3-3-2a进程申请资源
程序会显示一下资源占用的情况。
选择2,用银行家算法实现资源分配。
输入申请资源的进程名为a,申请资源个数3个。
图3-3-3b进程申请资源
程序会先判断输入的数据是否正确,此时系统剩余资源为3个,a总共需要资源5个,已经有2个,剩余需要资源3个。
剩余需要资源小于等于系统剩余资源,输入正确,进行试分配。
试分配完毕,进行安全性算法,并输出安全序列。
a已达到资源需求总量,状态改为完成。
图3-3-4全部完成状态
依次输入b3、c5后,a、b、c全部为完成状态。
图3-3-5c进程申请资源
按照刚才重新初始化链表,输入c2。
此时系统剩余资源3个,c剩余需要资源5个,剩余需要资源大于系统剩余资源,取消分配。
图3-3-6安全序列检测
初始化链表,a先申请一个资源,成功。
b再申请一个资源,此时不成功,取消分配。
四、实验总结
此次实验由自己动手编写,实习针对于资源分配,通过对申请的响应,完成对资源分配。
每个进程所拥有的状态有、就绪、等待和完成,对于其进程的选择主要是判断其状态是否允许响应申请。
编写过程中,最初很简单,凭借对上课时对知识的掌握,很容易编写出了框架。
但知识的漏洞,使得程序的编写过程中出现了严重的错误。
比如,银行家算法编写过程中,最初认为进程尚需资源量即为其所申请的资源,其实不然。
此错误使得编写的函数实现功能仅为一次性完成,无法达到动态性。
在其基础上又无法简单更改,只好重新拟定流程,浪费了宝贵的实习时间。
再者,银行家算法中的安全性检查模块,当只有一个进程就绪,而且申请资源量使得系统不安全,此时,进程的安全标志位皆为0,因此无法跳出循环。
为此单独设置了一种情况,于是得以正确运行。
对于此次实习,对于操作系统的资源分配方面,有了进一步的认识。
对于语言的运用更加明细与熟练。
近两周的实习,在对调程序的耐心及对课本知识的运用能力,得以提升。
附代码:
#include"
stdio.h"
stdlib.h"
iostream.h"
inte;
//系统总共可以利用的资源
intw;
intz;
//显示系统资源剩余总量
//随机算法和银行家算法中的进程的pcb
//状态r就绪f完成
//资源需求总量
//已占用资源量
intpanduan;
//创建
pcb*create(structpcb*a,intn)//a表示队列n表示进程个数
{
structpcb*q,*s;
s=q=NULL;
s=a;
for(inti=0;
i<
n;
i++)
{
q=(structpcb*)malloc(sizeof(structpcb));
printf("
请前输入进程号资源总需求量已占资源量:
\n"
);
while
(1)
{
cin>
>
q->
name>
applyall>
allocation;
if(((q->
applyall)<
=10)&
&
((q->
allocation)<
=10))
break;
else
printf("
输入的有误,请重新输入:
}
q->
state='
r'
;
panduan=0;
e=e-(q->
allocation);
z=e;
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"
while(p!
=NULL)
{
%c\t%d\t%d\t%c\t\n"
p->
name,p->
applyall,p->
allocation,p->
state);
p=p->
系统资源剩余量为:
%d\n\n"
z);
/******************************************银行家算法******************************************/
voidbank(structpcb*a,intn)//a进程队列n进程的个数
intw,lastw,y,l,flag;
//l是输出安全序列的下标y是进程申请的资源个数r记录试分配之前的系统资源个数
flag=0;
w=e;
//指代当前系统可以利用的资源
l=0;
structpcb*q,*x;
//x用来申请资源的进程
chart;
//记录要申请进程的资源名字
charm[20