- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
x.Format("%d",list[j].Max[i]); if(i==0) max=x; else max=max+' '+x; x.Format("%d",list[j].Allocation[i]); if(i==0) allocation=x; else allocation=allocation+' '+x; x.Format("%d",list[j].Need[i]); if(i==0) need=x; else need=need+' '+x; } m_display=m_display+" 最大需求矩阵:"+max+"\r\n"; m_display=m_display+" 分配矩阵:"+allocation+"\r\n"; m_display=m_display+" 需求矩阵:"+need+"\r\n"; } } void CMy0Dlg::OnButton2() //添加进程 { // TODO: Add your control notification handler code here UpdateData(TRUE); count=Count(m_sum); if(count==0) MessageBox("请先输入总的资源数!","提示",MB_OK);
count=Count(m_sum); if(count==0) MessageBox("请先输入总的资源数!","提示",MB_OK); else if(N==0) MessageBox("请先添加进程!","提示"); else { m_request_dlg.m_request=""; if(m_request_dlg.DoModal()==IDOK) { update(); } } } void CMy0Dlg::OnButton1() //重置 { // TODO: Add your control notification handler code here UpdateData(TRUE); m_sum=""; m_available=""; count=0; N=0; m_display=""; UpdateData(FALSE); } void CMy0Dlg::OnButton3() //输出安全序列 { // TODO: Add your control notification handler code here
N
Finish[1:all]==true
Y N
系统不安全 Available[i]= Available[i]+Allocation[i]
Y
系统安全
Finish=true
【调试报告】 ** 问题描述
由于MFC基础知识不扎实,导致编程屡屡出错,在调试的过程 中,更是问题百出: (1) 刚开始的时候由于对话框数量比较多显示调用的时候,记 错了ID号,导致按钮操作和弹出的对话框总是不匹配。 (2) 由于操作过程中每一个按钮都创建了一个类向导,但是由 于编程初期没有规划好,所以代码有些杂乱无章,在编程 的时候代码出现很多变量未定义或重复定义现象。 (3) 对银行家算法还存在不理解的地方,安全性检测等许多地 方,不懂得使用工作变量finish来进行判断,也为后来的 编程引起了很大的不便。 (4) 想为对话框添加背景图画,但是一直不能实现将普通图片 转化为位图,导致图片不能显示,此功能现在还未实现, 还在继续学习中。 (5) 本系统还存在一个问题就是资源申请出错时,不能给用户 提示,还在努力的修改中。
【算法设计】
1、设计思想: 银行家算法是由Dijkstra 提出最的有代表性的避免死锁的算法。 在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之 前,应先计算此次分配资源的安全性,所谓安全状态, 就是如果存在 一个由系统中所有进程构成的安全序列(P1,…,Pn)则系统处于安 全状态。安全状态一定是没有死锁发生,它保证每个进程pi 可顺利地 完成。 如果系统无法找到这样一个安全序列, 则称系统处于不安全状 态.银行家算法的核心内容是判断资源试分配后系统是否处于安全状态, 即是否可以找到一个进程安全序列. 主要设计思想:在银行家算法中,为了决定是否对当前申请资源 的进程进行资源分配,将系统状态划分成安全状态和不安全状态。若当 前申请资源的进程分配资源后资源进入安全状态,则正式接受当前进程 请求为其分配资源,否则将拒绝资源请求。
实习题目一:银行家算法设计实现
【需求规格说明】
1、问题描述 对I/O系统的死锁资源的问题的解决主要的方法是银行家算法,单 种资源的银行家算法和多种资源的银行家算法的解决思路一致,要求设 计实现多种银行家算法,并要求所涉及的模型最少更够满足如下要求: (1) 程序能够根据进程的请求进行判断,给出系统是否安全的的提 示,如果安全,要求能够显示一组进程执行的安全序列; (2) 能够根据需要,显示当前系统中各种资源的分配情况; 2、问题分析 死锁是多个进程在运行过程中因争夺资源而造成的一种僵局,若无 外力作用它们都将无法再继续向前推进。因此在实际操作过程中,我们 应该要合理的分配系统资源避免系统进入死锁状态。避免死锁的方式有 很多,但其中以Dijkstra的银行家算法最为典型,它可以很好地进行资源 的分配从而避免系统进入死锁状态。
else { m_add_dlg.m_max=""; m_add_dlg.m_allocation=""; if(m_add_dlg.DoModal()==IDOK) update(); } UpdateData(FALSE); } void CMy0Dlg::update() { // TODO: Add your control notification handler code here UpdateData(TRUE); count=Count(m_sum); if(N==0) { change(m_sum,Sum); } change(m_available,Available); if(m_request_dlg.flag==1) { if(strlen(m_request_dlg.m_request)!=0) { int a; change(m_request_dlg.m_request,Request); a=Req(list,Available,m_request_dlg.m_m,Request,Finish); if(a==1) MessageBox("系统已分配该进程资源!");
else MessageBox("系统未分配该进程资源!"); fun(); m_request_dlg.flag=0; } } if(m_add_dlg.flag==1) { if(strlen(m_add_dlg.m_max)!=0) { N++; change(m_add_dlg.m_max,list[N-1].Max); change(m_add_dlg.m_allocation,list[N-1].Allocation); for(int i=0;i<count;i++) { list[N-1].Need[i]=list[N-1].Max[i]-list[N-1].Allocation[i]; Available[i]=Available[i]-list[N-1].Allocation[i]; } fun(); } m_add_dlg.flag=0; } UpdateData(FALSE); } void CMy0Dlg::OnButton4() //请求分配资源 { // TODO: Add your control notification handler code here UpdateData(TRUE);
转向步骤(2)。 ·如果所有进程的Finish[i]=true,则表示系统处于安全状态;否 则,系统处于不安全状态。 注明:此处所提到的几个函数说明: Available:表示系统可分配的资源数 Allocation:表示系统当前分配资源数 Need:表示进程所需的最大资源数 Request:表示进程所申请的资源数 Finish:表示该系统是否能为进程分配资源时期完成运行 3、详细设计表示: (1)银行家算法流程图 进入系统 进行初始化 添加进程并提出申请资源请求
Y
Request[i]>Need[i]
YFra Baidu bibliotek
系统为不安全状态是否继续测试 Y:继续 N:退出
N
Request[i]>Available[i]
Y N
预分配
Request[i]>Available[i]
N Y
退出系统
(2)检查安全性流程图 初始化 工作向量Available Finish[i]=Flase Need[i]<=Available&&(!finish[i])
** 调式结果截图
(1) 初始界面
(2)运行界面
运行状态(2)
【用户手册】 用户登录系统后,按照对话框提示进行操作,首先要创建 进程,为进程进行分配内存,然后根据判断其是否属于安全状 态,若为安全则输出安全序列,可对系统进行重置数据,再进 行其他操作,安全序列及资源分配状况在对话框上的资源分配 显示框可以进行查看。 【附录】 部分代码:
操作系统课程实验报告
学生姓名: 班 学 号: 指导教师:
目录
一、银行家算法 2 【需求规格说明】 2 ** 问题描述 3 ** 问题分析 3 【算法分析】 3 ** 设计思想 3 ** 设计表示 5 【调试报告】 7 ** 问题描述 7 ** 问题分析 7 【用户手册】 9 【附录】 9 ** 源代码(部分) 9 二、内存管理模型 15 【需求规格说明】 15 ** 问题描述 15 ** 问题分析 16 【算法分析】 16 ** 设计思想 16 ** 设计表示 17 *** 算法步骤 17 【调试报告】 18 ** 问题描述 18 **调试结果截图 18 【用户手册】 19 【附录】 19 ** 源代码(部分) 20 三、实习总结 28
2、设计表示: (1)算法步骤: ① 如果Request小于或等于Need,则转向步骤(2);否则,认为出 错,因为它所需要的资源数已超过它所宣布的最大值。 ② 如果Request<or=Available,则转向步骤(3);否则,表示系 统中尚无足够的资源,进程必须等待。 ③ 系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的 数值: Available=Available-Request[i]; Allocation=Allocation+Request; Need=Need-Request; ④ 系统执行安全性算法,检查此次资源分配后,系统是否处于安全 状态。 (2)安全性检查步骤 ·设置两个向量Available和Finish 1 向量Available,它表示系统可提供进程继续运行所需要的各类 资源数目,执行安全算法开始时,Available=Allocation; 2 尔向量Finish,它表示系统是否有足够的资源分配给进程,使 之运行完成,开始时先令Finish[i]=false,当有足够资源分配 给进程时,令Finish[i]=true。 ·从进程集合中找到一个能满足下述条件的进程: 2 Finish[i]=false 3 Need<or=Available 如找到,执行步骤(3);否则,执行步骤(4)。 ·当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的 资源,故应执行: Available=Available+Allocation; Finish[i]=true;
void CMy0Dlg::fun() { CString max,allocation,need,n,x; for(int i=0;i<count;i++) { x.Format("%d",Available[i]); //将任意数据类型转换为字符 串,此处返回的是:Available[i] if(i==0) m_available=x; else m_available=m_available+' '+x; } m_display=""; for(int j=0;j<N;j++) { n.Format("%d",j+1); m_display=m_display+"PID:"+n+"\r\n"; for(int i=0;i<count;i++) {