下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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是安全
4、的,如果对于每一个进程 Pi(1 <i <n),它以后尚需要 的资源量不超过系统当前剩余资源量与所有进程 Pj (j < i ) 当前占有资源 量之和。安全状态:如果存在一个由系统中所有进程构成的安全序列P1,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。不安全状态:不存在一个安全序列。不安全状态不一定导致死锁。我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行 家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。为保证资金的安全,银行家规定:(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳 该顾客;(2) 顾客可以分期贷款,
5、但贷款的总数不能超过最大需求量;(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它 的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行 中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩 余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源, 否则也要推迟分配。六、实验环境:Win-系统Vi
6、sual C+ 6.0七、实验设计:1. 数据结构设计定义结构体:struct Process/ 进程属性构成Source claim; /进程最大需求量Source allocation;/ 进程占有量Source claim_allocati on;/进程需求量Source curre ntAvail;/进程可获得量;定义类对象:class Source /资源的基本构成以及功能private: public:int R1; 定义三类类资源int R2;int R3;Source(i nt r1 = 0,i nt r2 = 0,i nt r3 = 0)R仁 r1;R2=r2;R3=r3;S
7、ource(Source& s)R仁 s.R1;R2=s.R2;R3=s.R3;设置各类资源void setSource(i nt r1 = 0,i nt r2 = 0,i nt r3 = 0)/R仁 r1;R2=r2;R3=r3;void add(Source s)/ 加法R仁 R1+s.R1;R2二R2+s.R2;R3二R3+S.R3; void sub(Source s)/ 减法R仁 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
8、) retur n false;if(R3 > s.R3) retur n false;return true; ;class Data/圭寸装所有数据public:Process *p;进程指针Source sum;/总资源量Source available; / 可获得量Source ask;/ 请求量int pLength;/ 进程个数int * ruler;/ 逻辑尺清零void clearProcess() / 进程 currentAvailfor(i nt i=0;i<pLe ngth;i+) pi.curre ntAvail.setSource(0, 0, 0);cl
9、ass Datal nit/圭寸装初始化数据函数类private:public:Datal ni t()/构造函数 void in itLe ngth(Data *db)设置进程个数int n;cout«"输入进程数:";cin>>n;db->pLe ngth = n;db->p = new Process n;if(!db->p)cout«"error! no eno ugh memory space! "retur n;db->ruler = new in t n;if(!db->rule
10、r)cout<<"error! no eno ugh memory space! "retur n;2. 算法设计class Fin dSafeList/ 寻找安全序列private:public:Fin dSafeList() /构造函数bool checkList(Data *db)/ 检查一个序列安全性int i=0;/i用于循环/db->pdb->ruleri.curre ntAvail.add(db->available);将当前系统可用资源量赋给该序列的第一个进程if(!db->pdb->ruleri.claim_all
11、ocatio n.lower(db->pdb->ruleri.currentAvail)/若当前进程currentAvail小于该进程需求量(claim-allocation),返回 falsereturn false;for(i=1; i< db->pLe ngth; i+)/当前进程的可获得资源量currentAvail获得前一个进程的未释放资源前可获得资源量curre ntAvaildb->pdb->ruleri.curre ntAvail.add(db->pdb->ruleri-1.curren tAvail);/当前进程的可获得资源量c
12、urrentAvail获得前一个进程的释放的资源量db->pdb->ruleri.curre ntAvail.add(db->pdb->ruleri-1.all ocati on);/若当前进程currentAvail小于该进程需求量(claim-allocation),返回 falseif(!db->pdb->ruleri.claim_allocatio n.lower(db->pdb->ruleri.curre ntAvail) return false; /若当前进程currentAvail大于该进程总资源量,返回false if(!db-
13、>pdb->ruleri.curre ntAvail.lower(db->sum) return false; return true; /该序列进程安全。返回truebool exsitSafeList(Data *db)/判断是否存在安全序列int i = 0;for(i = 0; i < db->pLength; i+)/ 设置逻辑尺的刻度值 db->ruleri = i; while(1)/该循环将检测逻辑尺刻度值的全排列if(checkList(db)/找到一个安全序列,返回true return true; db->clearProcess
14、();/ 将所有进程的 currentAvailJ | A零if(! next_permutatio n(db->ruler,db->rule 叶db->pLe ngth)/所有排列完毕后退出生成排列库函数的调用 return false;return false;int fin dSafeList(Data *db, i nt i=0) /寻找安全序列/请求值大于系统当前可用资源值,返回0if(!db->asko wer(db->available)retur n 0;/请求值大于当前进程需求资源值,返回1if(!db->ask.lower(db->
15、pi.claim_allocatio n)retur n 1;Source s(db->pi.allocation);/ 根据请求,分配资源值db->available.sub(db->ask);db->pi.allocatio n. add(db->ask);db->pi.claim_allocati on. sub(db->ask);if(!exsitSafeList(db)/判断是否存在安全序列db->available.add(db->ask);/ 不存在安全序列,回滚,恢复分配前状态,并返回2db->pi.allocati
16、on. sub(db->ask);db->pi.claim_allocatio n.add(db->ask);return 2;db->ask.setSource(0,0,0);/找到安全序列,将请求资源置零,返回3return 3;;3. 功能模块设计class Data/圭寸装所有数据class DataI nit/ 圭寸装初始化数据函数类class Display/圭寸装显示方法class Fin dSafeList/ 寻找安全序列struct Process/进程属性构成void mai n() / 主函数八、实验运行结果:输入进程数,及相关资源数量分配选择算法
17、完成的操作:1查看进程情况2请求分配2.1分配失败2.2分配成功2.3继续分配失败,退出九、实验心得:通过此次实验,我能够更加深入的理解银行家算法的执行过程,也懂 得用银行家算法去防止发生死锁,有效地解决了资源利用率低的问题,保证 了系统的安全性。当然在实验过程中,我也遇到了一些困难,但是我通过及时请教同学, 查询相关资料,及时解决了问题,但仍有不足之处,我将会在今后学习中更 加努力。附录:源代码(部分)#in clude<iostream>#in clude<algorithm>using n amespace std;class Source /资源的基本构成以及功
18、能private:public:int R1;定义三类类资源int R2;int R3;Source(i nt r1 = 0,i nt r2 = 0,i nt r3 = 0) R仁 r1;R2=r2;R3=r3;Source(Source& s) R仁 s.R1;R2=s.R2;R3=s.R3;void setSource(i nt r1 = 0,i nt r2 = 0,i nt r3 = 0)/设置各类资源 R仁 r1;R2=r2;R3=r3;void add(Source s)加法R仁 R1+s.R1;R2二R2+s.R2;R3二R3+S.R3; void sub(Source s
19、)/ 减法R仁 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) retur n false;if(R3 > s.R3) retur n false;return true;struct Process/进程属性构成Source claim; /进程最大需求量Source allocation;/ 进程占有量Source claim_allocati on;/进程需求量Source curre ntAvail;/进程可获得量;class
20、Data/圭寸装所有数据 public:Process *p;进程指针Source sum;/总资源量Source available; / 可获得量Source ask;/ 请求量int pLength;/ 进程个数int * ruler;/ 逻辑尺清零void clearProcess() / 进程 currentAvailfor(i nt i=0;i<pLe ngth;i+) pi.curre ntAvail.setSource(0, 0, 0);class Datal nit/圭寸装初始化数据函数类private:public:Datal ni t()/构造函数 void in
21、itLe ngth(Data *db)设置进程个数int n;cout«"输入进程数:"cin>>n;db->pLe ngth = n;db->p = new Process n;if(!db->p)cout«"error! no eno ugh memory space ! "retur n;db->ruler = new in t n;if(!db->ruler)cout<<"error! no eno ugh memory space ! "retur n
22、;void setAsk(Data *db) /设置请求资源量in t r1,r2,r3;M=0;r2=0;r3=0;db->ask.setSource(r1,r2,r3);void initSum(Data *db)/ 设置总资源量in t r1,r2,r3;cout«"Available (R1,R2,R3):"db->sum.setSource(r1,r2,r3);void initAvail(Data *db)/ 设置可获得量in t r1,r2,r3;cout«"输入初始分配 Allocation:n"cout&
23、#171;"availableR1,R2,R3:n "cin> >r1>>r2>>r3;db->available.setSource(r1,r2,r3);void in itProcess(Data *db) /设置各进程属性值in t r1,r2,r3;cout«"输入 t0 时分配 Allocation:n"的 allocati on设置for(int i=0;i<db->pLength;i+)设置进程 picoutvv'p'vvivv" allocatio
24、n R1,R2,R3:"cin> >r1>>r2>>r3;db->pi.allocati on. setSource(r1,r2,r3);coutvv'p'vvivv" max allocatio n(claimR1,R2,R3):"进程pi 的claimdb->pi.claim.setSource(r1,r2,r3);r1二db->pi.claim.R1-db->pi.claim.R1;设置进程 pi 的claim_allocati onr2=db->pi.clai m.R 2-d
25、b->pi.clai m. R2;r3=db->pi.clai m.R 3-db->pi.clai m. R3; db->pi.claim_allocatio n.setSource(r1, r2, r3);class Display/圭寸装显示方法private:public:Display() /构造函数 void displaySource(Source s) /设置基本资源显示方式cout<<s.R1<<" "<<s .R 2<<" "<<s .R 3;displ
26、ayAvailable(Source s) / 显示可获得资源量displaySource(s);void displayProcess(Process *p,int length)/ 显示进程基本信for(i nt i=0; i<le ngth; i+)cout«" p"v<i<v"t"displaySource(pi.claim);cout<<"tt"displaySource(pi.allocati on); cout«e ndl;cout«e ndl;void dis
27、playSafeList(Data *db)/ 显示安全序列for(i nt i=0; i<db->pLe ngth; i+)cout«" p"<<db->ruleri<<""displaySource(db->pdb->ruleri.curre ntAvail);cout«""displaySource(db->pdb->ruleri.claim);cout«""displaySource(db->pdb->
28、;ruleri.allocatio n);cout«""displaySource(db->pdb->ruleri.claim_allocatio n);coutvv" true"cout«e ndl;void displayAskResult(Data *db,int n)/ 显示请求资源结果if(n=0)coutvv"不分配,请求量大于当前可获得量! n"return;if(n=1)coutvv"不分配,请求量大于当前可获得量!n"return;if(n=2)coutvv&quo
29、t;不分配,找不到安全序列! n"return;if(n=3)coutvv"存在安全序列:"for(i nt i=O;ivdb->pLe ngth;i+)coutvvdb->rulerivv" "coutvve ndl;char c='N'coutvv"查看安全序列详情?(Y/N)"cin> >c;if(c=' Y'|c='y')claimallocati oncout«"进程currentavailclaim-allocati on
30、 possible' n"displaySafeList(db);return;class Fin dSafeList/ 寻找安全序列private:public:Fin dSafeList() /构造函数bool checkList(Data *db)/ 检查一个序列安全性int i=0;/i用于循环db->pdb->ruleri.curre ntAvail.add(db->available);II将当前系统可用资源量赋给该序列的第一个进程if(!db->pdb->ruleri.claim_allocatio n.lower(db->p
31、db->ruleri.curre ntAvail)/若当前进程currentAvail小于该进程需求量(claim-allocation),返回 falsereturn false;for(i=1; i< db->pLe ngth; i+) /当前进程的可获得资源量currentAvail获得前一个进程的未释放资源前可获得资源量curre ntAvaildb->pdb->ruleri.curre ntAvail.add(db->pdb->ruleri-1.cur ren tAvail);/当前进程的可获得资源量currentAvail获得前一个进程的释
32、放的资源量db->pdb->ruleri.curre ntAvail.add(db->pdb->ruleri-1.allocati on);/若当§前进程currentAvail小于该进程需求量(claim-allocati on),返回falseif(!db->pdb->ruleri.claim_allocatio n.lower(db->pdb->ruler i.curre ntAvail) return false; /若当前进程currentAvail大于该进程总资源量,返回falseif(!db->pdb->rul
33、eri.curre ntAvail.lower(db->sum) return false; return true; /该序列进程安全。返回truebool exsitSafeList(Data *db)/判断是否存在安全序列int i = 0;for(i = 0; i < db->pLength; i+)/ 设置逻辑尺的刻度值 db->ruleri = i; while(1)/该循环将检测逻辑尺刻度值的全排列if(checkList(db)/找到一个安全序列,返回true return true; db->clearProcess();/ 将所有进程的 cur
34、rentAvailJ | A零if(! next_permutatio n(db->ruler,db->rule 叶db->pLe ngth)/所有排列完毕后退出生成排列库函数的调用 return false; return false;int fin dSafeList(Data *db, i nt i=0) /寻找安全序列/请求值大于系统当前可用资源值,返回0if(!db->asko wer(db->available)retur n 0;/请求值大于当前进程需求资源值,返回1if(!db->ask.lower(db->pi.claim_alloc
35、atio n)retur n 1;Source s(db->pi.allocation);/ 根据请求,分配资源值db->available.sub(db->ask);db->pi.allocatio n. add(db->ask);db->pi.claim_allocati on. sub(db->ask);if(!exsitSafeList(db)/判断是否存在安全序列db->available.add(db->ask);/ 不存在安全序列,回滚,恢复分配前状态,并返回2db->pi.allocati on. sub(db->ask);db->pi.claim_allocatio n.add(db->ask);return 2;db->ask.setSource(0,0,0);/找到安全序列,将请求资源置零,返回3return 3;;void mai n()Data *db
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 复合修复材料制备技术-洞察与解读
- 季度考核伤寒考试题
- 有机硅产品生产线项目环境影响报告书
- 房屋施工质量保障体系
- 2025年黑龙江省大兴安岭地区公开招聘消防员自考模拟笔试题含答案
- 路径规划安全性评估-洞察与解读
- 中医院土建施工质量保证方案
- 2025年人力资源管理师(三级)技能操作模拟试卷:招聘与培训管理实战技巧解析指导含答案
- 2025年初级保育员理论知识考试真题和参考答案
- 《消化和吸收(第1课时)》名师课件
- 基于 YOLO 算法的火灾检测识别系统
- 心内科常见急诊的诊断与处置
- 改良热钾碱法朱海燕87课件
- 医疗广告培训课件
- 高考数学总复习《数列求和(裂项相消法)》专项测试卷(带答案)
- 地理野外实践活动方案
- 园长给家长培训
- 售后服务方案(3篇)
- 2025年高等自学教育考试马克思主义基本原理概论全真模拟试卷及答案(共四套)
- 2024年高考英语课后续写重点话题突破 08 文化、艺术类(读后续写高频主题分类)(讲义)(解析版)
- 共管协议到期解除协议书
评论
0/150
提交评论