操作系统课程设计实验报告-用C++实现银行家算法_第1页
操作系统课程设计实验报告-用C++实现银行家算法_第2页
操作系统课程设计实验报告-用C++实现银行家算法_第3页
操作系统课程设计实验报告-用C++实现银行家算法_第4页
操作系统课程设计实验报告-用C++实现银行家算法_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操 作 系 统实验报告(2)学院:计算机科学与技术学院班级:计091学号:姓名:时间:2011/12/30目 录1. 实验名称32. 实验目的33. 实验内容34. 实验要求35. 实验原理36. 实验环境47. 实验设计47.1数据结构设计47.2算法设计67.3功能模块设计78. 实验运行结果89. 实验心得9附录:源代码(部分)9一、实验名称:用C+实现银行家算法二、实验目的:通过自己编程来实现银行家算法,进一步理解银行家算法的概念及含义,提高对银行家算法的认识,同时提高自己的动手实践能力。各种死锁防止方法能够阻止发生死锁,但必然会降低系统的并发性并导致低效的资源利用率。死锁避免却与此相

2、反,通过合适的资源分配算法确保不会出现进程循环等待链,从而避免死锁。本实验旨在了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生。三、实验内容:利用C+,实现银行家算法四、实验要求:1.完成银行家算法的设计2.设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。五、实验原理:系统中的所有进程放入进程集合,在安全状态下系统收到进程的资源请求后,先把资源试探性的分配给它。之后,系统将剩下的可用资源和进程集合中的其他进程还需要的资源数作比较,找出剩余资源能够满足的最大需求量的进程,从而保证进程运行完毕并归还全部资源。这时,把这个进程从进程集

3、合中删除,归还其所占用的所有资源,系统的剩余资源则更多,反复执行上述步骤。最后,检查进程集合,若为空则表明本次申请可行,系统处于安全状态,可以真正执行本次分配,否则,本次资源分配暂不实施,让申请资源的进程等待。银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。要解释银行家算法,必须先解释操作系统安全状态和不安全状态。安全序列是指一个进程序列P1,Pn是安全的,如果对于每一个进程Pi(1in),它以后尚需要的资源

4、量不超过系统当前剩余资源量与所有进程Pj (j s.R1) return false;if(R2 s.R2) return false;if(R3 s.R3) return false;return true;class Data/封装所有数据public:Process *p;/进程指针Source sum;/总资源量Source available;/可获得量Source ask;/请求量int pLength;/进程个数int * ruler;/逻辑尺void clearProcess()/进程currentAvail清零for(int i=0;ipLength;i+)pi.curren

5、tAvail.setSource(0, 0, 0);class DataInit/封装初始化数据函数类private:public:DataInit()/构造函数void initLength(Data *db)/设置进程个数int n;coutn;db-pLength = n;db-p = new Processn;if(!db-p)coutruler = new intn;if(!db-ruler)coutpdb-ruleri.currentAvail.add(db-available);/将当前系统可用资源量赋给该序列的第一个进程if(!db-pdb-ruleri.claim_alloc

6、ation.lower(db-pdb-ruleri.currentAvail)/若当前进程currentAvail小于该进程需求量(claim-allocation),返回falsereturn false;for(i=1; ipLength; i+)/当前进程的可获得资源量currentAvail获得前一个进程的未释放资源前可获得资源量currentAvaildb-pdb-ruleri.currentAvail.add(db-pdb-ruleri-1.currentAvail);/当前进程的可获得资源量currentAvail获得前一个进程的释放的资源量db-pdb-ruleri.curre

7、ntAvail.add(db-pdb-ruleri-1.allocation);/若当前进程currentAvail小于该进程需求量(claim-allocation),返回falseif(!db-pdb-ruleri.claim_allocation.lower(db-pdb-ruleri.currentAvail)return false;/若当前进程currentAvail大于该进程总资源量,返回falseif(!db-pdb-ruleri.currentAvail.lower(db-sum)return false;return true;/该序列进程安全。返回truebool exs

8、itSafeList(Data *db)/判断是否存在安全序列int i = 0;for(i = 0; i pLength; i+)/设置逻辑尺的刻度值db-ruleri = i;while(1) /该循环将检测逻辑尺刻度值的全排列 if(checkList(db)/找到一个安全序列,返回truereturn true;db-clearProcess();/将所有进程的currentAvail清零if(!next_permutation(db-ruler,db-ruler+db-pLength)/所有排列完毕后退出生成排列库函数的调用return false;return false;int

9、findSafeList(Data *db, int i=0)/寻找安全序列/请求值大于系统当前可用资源值,返回0if(!db-ask.lower(db-available)return 0;/请求值大于当前进程需求资源值,返回1if(!db-ask.lower(db-pi.claim_allocation)return 1;Source s(db-pi.allocation);/根据请求,分配资源值db-available.sub(db-ask);db-pi.allocation.add(db-ask);db-pi.claim_allocation.sub(db-ask);if(!exsit

10、SafeList(db)/判断是否存在安全序列db-available.add(db-ask);/不存在安全序列,回滚,恢复分配前状态,并返回2db-pi.allocation.sub(db-ask);db-pi.claim_allocation.add(db-ask);return 2;db-ask.setSource(0,0,0);/找到安全序列,将请求资源置零,返回3return 3;3.功能模块设计class Data/封装所有数据class DataInit/封装初始化数据函数类class Display/封装显示方法class FindSafeList/寻找安全序列struct P

11、rocess/进程属性构成void main() /主函数8、 实验运行结果:输入进程数,及相关资源数量分配选择算法完成的操作:1 查看进程情况2 请求分配 2.1分配失败2.2 分配成功2.3 继续分配失败,退出九、实验心得:通过此次实验,我能够更加深入的理解银行家算法的执行过程,也懂得用银行家算法去防止发生死锁,有效地解决了资源利用率低的问题,保证了系统的安全性。当然在实验过程中,我也遇到了一些困难,但是我通过及时请教同学,查询相关资料,及时解决了问题,但仍有不足之处,我将会在今后学习中更加努力。附录:源代码(部分)#include#include using namespace std;

12、class Source /资源的基本构成以及功能 private:public:int R1;/定义三类类资源int R2;int R3;Source(int r1 = 0,int r2 = 0,int r3 = 0)R1=r1;R2=r2;R3=r3;Source(Source& s)R1=s.R1;R2=s.R2;R3=s.R3;void setSource(int r1 = 0,int r2 = 0,int r3 = 0)/设置各类资源R1=r1;R2=r2;R3=r3;void add(Source s)/加法R1=R1+s.R1;R2=R2+s.R2;R3=R3+s.R3;void

13、 sub(Source s)/减法R1=R1-s.R1;R2=R2-s.R2;R3=R3-s.R3;bool lower(Source s)/比较if(R1 s.R1) return false;if(R2 s.R2) return false;if(R3 s.R3) return false;return true;struct Process/进程属性构成Source claim;/进程最大需求量Source allocation;/进程占有量Source claim_allocation;/进程需求量Source currentAvail;/进程可获得量;class Data/封装所有数

14、据public:Process *p;/进程指针Source sum;/总资源量Source available;/可获得量Source ask;/请求量int pLength;/进程个数int * ruler;/逻辑尺void clearProcess()/进程currentAvail清零for(int i=0;ipLength;i+)pi.currentAvail.setSource(0, 0, 0);class DataInit/封装初始化数据函数类private:public:DataInit()/构造函数void initLength(Data *db)/设置进程个数int n;co

15、utn;db-pLength = n;db-p = new Processn;if(!db-p)coutruler = new intn;if(!db-ruler)coutask.setSource(r1,r2,r3);void initSum(Data *db)/设置总资源量int r1,r2,r3;coutr1r2r3;db-sum.setSource(r1,r2,r3);void initAvail(Data *db)/设置可获得量int r1,r2,r3;cout输入初始分配 Allocation:n;coutr1r2r3;db-available.setSource(r1,r2,r3

16、);void initProcess(Data *db)/设置各进程属性值int r1,r2,r3;cout输入t0时分配 Allocation:n;for(int i=0;ipLength;i+)/设置进程pi 的 allocationcoutpir1r2r3;db-pi.allocation.setSource(r1,r2,r3); coutpir1r2r3;db-pi.claim.setSource(r1,r2,r3);r1=db-pi.claim.R1-db-pi.claim.R1;/设置进程pi 的 claim_allocationr2=db-pi.claim.R2-db-pi.cl

17、aim.R2;r3=db-pi.claim.R3-db-pi.claim.R3;db-pi.claim_allocation.setSource(r1, r2, r3);class Display/封装显示方法private:public:Display()/构造函数void displaySource(Source s)/设置基本资源显示方式couts.R1 s.R2 s.R3;displayAvailable(Source s)/显示可获得资源量displaySource(s);void displayProcess(Process *p,int length)/显示进程基本信息for(i

18、nt i=0; ilength; i+)cout pit;displaySource(pi.claim);couttt;displaySource(pi.allocation);coutendl;coutendl;void displaySafeList(Data *db)/显示安全序列for(int i=0; ipLength; i+)cout pruleripdb-ruleri.currentAvail);coutpdb-ruleri.claim);coutpdb-ruleri.allocation);coutpdb-ruleri.claim_allocation);cout true;c

19、outendl;void displayAskResult(Data *db,int n)/显示请求资源结果if(n=0)cout不分配,请求量大于当前可获得量! n;return;if(n=1)cout不分配,请求量大于当前可获得量!n;return;if(n=2)cout不分配,找不到安全序列! n;return;if(n=3)cout存在安全序列:;for(int i=0;ipLength;i+)coutruleri ;coutendl;char c=N;coutc;if(c=Y|c=y)coutpdb-ruleri.currentAvail.add(db-available);/将当前

20、系统可用资源量赋给该序列的第一个进程if(!db-pdb-ruleri.claim_allocation.lower(db-pdb-ruleri.currentAvail)/若当前进程currentAvail小于该进程需求量(claim-allocation),返回falsereturn false;for(i=1; ipLength; i+)/当前进程的可获得资源量currentAvail获得前一个进程的未释放资源前可获得资源量currentAvaildb-pdb-ruleri.currentAvail.add(db-pdb-ruleri-1.currentAvail);/当前进程的可获得资

21、源量currentAvail获得前一个进程的释放的资源量db-pdb-ruleri.currentAvail.add(db-pdb-ruleri-1.allocation);/若当前进程currentAvail小于该进程需求量(claim-allocation),返回falseif(!db-pdb-ruleri.claim_allocation.lower(db-pdb-ruleri.currentAvail)return false;/若当前进程currentAvail大于该进程总资源量,返回falseif(!db-pdb-ruleri.currentAvail.lower(db-sum)r

22、eturn false;return true;/该序列进程安全。返回truebool exsitSafeList(Data *db)/判断是否存在安全序列int i = 0;for(i = 0; i pLength; i+)/设置逻辑尺的刻度值db-ruleri = i;while(1) /该循环将检测逻辑尺刻度值的全排列 if(checkList(db)/找到一个安全序列,返回truereturn true;db-clearProcess();/将所有进程的currentAvail清零if(!next_permutation(db-ruler,db-ruler+db-pLength)/所有排列完毕后退出生成排列库函数的调用return false;return false;int findSafeList(Data *db, int i=0)/寻找安全序列/请求值大于系统当前可用资源值,返回0if(!db-ask.lower(db-available)return 0;/请求值大于当前进程需求资源值,返回1if(!db-ask.lower(db-pi.claim_allocation)return 1;Source s(db-pi.allocation);/根据请求,分配资源值db-available.sub(db-ask);d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论