操作系统实习报告.docx
- 文档编号:11405880
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:35
- 大小:535.60KB
操作系统实习报告.docx
《操作系统实习报告.docx》由会员分享,可在线阅读,更多相关《操作系统实习报告.docx(35页珍藏版)》请在冰豆网上搜索。
操作系统实习报告
操作系统课程实验报告
学生姓名:
班学号:
指导教师:
目录
一、银行家算法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
实习题目一:
银行家算法设计实现
【需求规格说明】
1、问题描述
对I/O系统的死锁资源的问题的解决主要的方法是银行家算法,单种资源的银行家算法和多种资源的银行家算法的解决思路一致,要求设计实现多种银行家算法,并要求所涉及的模型最少更够满足如下要求:
(1)程序能够根据进程的请求进行判断,给出系统是否安全的的提示,如果安全,要求能够显示一组进程执行的安全序列;
(2)能够根据需要,显示当前系统中各种资源的分配情况;
2、问题分析
死锁是多个进程在运行过程中因争夺资源而造成的一种僵局,若无外力作用它们都将无法再继续向前推进。
因此在实际操作过程中,我们应该要合理的分配系统资源避免系统进入死锁状态。
避免死锁的方式有很多,但其中以Dijkstra的银行家算法最为典型,它可以很好地进行资源的分配从而避免系统进入死锁状态。
【算法设计】
1、设计思想:
银行家算法是由Dijkstra提出最的有代表性的避免死锁的算法。
在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,所谓安全状态, 就是如果存在一个由系统中所有进程构成的安全序列(P1,…,Pn)则系统处于安全状态。
安全状态一定是没有死锁发生,它保证每个进程pi可顺利地完成。
如果系统无法找到这样一个安全序列,则称系统处于不安全状态.银行家算法的核心内容是判断资源试分配后系统是否处于安全状态,即是否可以找到一个进程安全序列.
主要设计思想:
在银行家算法中,为了决定是否对当前申请资源的进程进行资源分配,将系统状态划分成安全状态和不安全状态。
若当前申请资源的进程分配资源后资源进入安全状态,则正式接受当前进程请求为其分配资源,否则将拒绝资源请求。
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。
·从进程集合中找到一个能满足下述条件的进程:
2Finish[i]=false
3Need 如找到,执行步骤(3);否则,执行步骤(4)。 ·当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Available=Available+Allocation; Finish[i]=true; 转向步骤 (2)。 ·如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。 注明: 此处所提到的几个函数说明: Available: 表示系统可分配的资源数 Allocation: 表示系统当前分配资源数 Need: 表示进程所需的最大资源数 Request: 表示进程所申请的资源数 Finish: 表示该系统是否能为进程分配资源时期完成运行 3、详细设计表示: (1)银行家算法流程图 Y Y N Y N N Y (2)检查安全性流程图 N Y N Y 【调试报告】 **问题描述 由于MFC基础知识不扎实,导致编程屡屡出错,在调试的过程中,更是问题百出: (1)刚开始的时候由于对话框数量比较多显示调用的时候,记错了ID号,导致按钮操作和弹出的对话框总是不匹配。 (2)由于操作过程中每一个按钮都创建了一个类向导,但是由于编程初期没有规划好,所以代码有些杂乱无章,在编程的时候代码出现很多变量未定义或重复定义现象。 (3)对银行家算法还存在不理解的地方,安全性检测等许多地方,不懂得使用工作变量finish来进行判断,也为后来的编程引起了很大的不便。 (4)想为对话框添加背景图画,但是一直不能实现将普通图片转化为位图,导致图片不能显示,此功能现在还未实现,还在继续学习中。 (5)本系统还存在一个问题就是资源申请出错时,不能给用户提示,还在努力的修改中。 **调式结果截图 (1)初始界面 (2)运行界面 运行状态 (2) 【用户手册】 用户登录系统后,按照对话框提示进行操作,首先要创建进程,为进程进行分配内存,然后根据判断其是否属于安全状态,若为安全则输出安全序列,可对系统进行重置数据,再进行其他操作,安全序列及资源分配状况在对话框上的资源分配显示框可以进行查看。 【附录】 部分代码: voidCMy0Dlg: : fun() { CStringmax,allocation,need,n,x; for(inti=0;i { x.Format("%d",Available[i]);//将任意数据类型转换为字符串,此处返回的是: Available[i] if(i==0) m_available=x; else m_available=m_available+''+x; } m_display=""; for(intj=0;j { n.Format("%d",j+1); m_display=m_display+"PID: "+n+"\r\n"; for(inti=0;i { 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"; } } voidCMy0Dlg: : OnButton2()//添加进程 { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); count=Count(m_sum); if(count==0) MessageBox("请先输入总的资源数! ","提示",MB_OK); else { m_add_dlg.m_max=""; m_add_dlg.m_allocation=""; if(m_add_dlg.DoModal()==IDOK) update(); } UpdateData(FALSE); } voidCMy0Dlg: : update() { //TODO: Addyourcontrolnotificationhandlercodehere 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) { inta; 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(inti=0;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); } voidCMy0Dlg: : OnButton4()//请求分配资源 { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); count=Count(m_sum); if(count==0) MessageBox("请先输入总的资源数! ","提示",MB_OK); elseif(N==0) MessageBox("请先添加进程! ","提示"); else { m_request_dlg.m_request=""; if(m_request_dlg.DoModal()==IDOK) { update(); } } } voidCMy0Dlg: : OnButton1()//重置 { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); m_sum=""; m_available=""; count=0; N=0; m_display=""; UpdateData(FALSE); } voidCMy0Dlg: : OnButton3()//输出安全序列 { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); count=Count(m_sum); if(count==0) MessageBox("请先输入总的资源数! ","提示",MB_OK); elseif(N==0) MessageBox("请先添加进程! ","提示"); else { inta,i; a=cheak(list,Available,Finish); if(a==1) { CStringx,m_request; m_request="安全序列: "; for(i=0;i { x.Format("%d",xulie[i]); if(i==0) m_request=m_request+x; else m_request=m_request+"->"+x; } MessageBox(m_request,"安全序列"); } else MessageBox("系统处于不安全状态,无安全序列","警告"); } } 实习题目二: 内存管理模型的设计与实现 【需求规格说明】 1、问题描述 对内存的可变分区申请采用链表法管理进行模拟实现。 要求: (1)对于给定的一个存储空间自己设计数据结构进行管理,可以使用单个链表,也可以使用多个链表,自己负责存储空间的所有管理组织,要求采用分页方式(指定单元大小为页,如4K,2K,进程申请以页为单位)来组织基本内容; (2)当进程对内存进行空间申请操作时,模型采用一定的策略(如: 首先利用可用的内存进行分配,如果空间不够时,进行内存紧缩或其他方案进行处理)对进程给予指定的内存分配; (3)从系统开始启动到多个进程参与申请和运行时,进程最少要有3个以上,每个执行申请的时候都要能够对系统当前的内存情况进行查看的接口; (4)对内存的申请进行内存分配,对使用过的空间进行回收,对给定的某种页面调度进行合理的页面分配。 (5)利用不同的颜色代表不同的进程对内存的占用情况,动态更新这些信息。 2、问题分析 内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。 其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。 动态内存分配的算法有以下三种: (1)首次适应算法: 从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。 为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。 该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。 (2)最佳适应算法: 它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。 为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。 该算法保留大的空闲区,但造成许多小的空闲区。 (3)最坏适应算法: 最坏适应分配算法要扫描整个空闲分区或链表,总是挑选一个最大的空闲分区分割给作业使用。 该算法要求将所有的空闲分区按其容量从大到小的顺序形成一空闲分区链,查找时只要看第一个分区能否满足作业要求。 它可使剩下的空闲分区不至于太小,产生碎片的几率最小,对中、小作业有利,同时该算法查找效率很高。 不过它也能使存储器中缺乏大的空闲分区。 【算法设计】 1、设计思想: 动态内存分配,对于给定的一个存储空间设计一个单个链表进行管理,负责存储空间的所有管理组织,采用分页方式(指定单元大小为页,如4K,2K,进程申请以页为单位)来组织基本内容;当进程对内存进行空间申请操作时,采用首次适应法对进程给予指定的内存分配;对内存的申请进行内存分配,对使用过的空间进行回收,对给定的某种页面调度进行合理的页面分配。 还可以实现对系统数据的清空及重置操作,使得用户可以再同一对话框中多次进行内存分配操作。 最后,利用不同的颜色代表不同的进程对内存的占用情况,动态更新这些信息。 2、设计表示: (1)算法步骤 ●设计程序对话框,确定功能实现模块; ●实现功能一: 申请分配内存,确定内存分配大小; 功能二: 在内存分配具体情况中显示内存分配情况 功能三: 实现回收资源,确定回收资源大小; 功能四: 重置: 将系统数据资源清空,允许用户再次使用; ●实现利用不同的颜色代表不同的进程对内存的占用情况,并动态更新这些信息。 (设计过程中,阴影部分代表内存空间被占用;空白表示内存空间空闲。 ) 3、详细设计表示: ***主要算法设计 N Y N Y 【调试报告】 **问题描述 (1)有了银行家算法作为实验一,在实现第二个题时相对较简单,很多功能在银行家算法中已经实现,但是本题中多了一个用不同颜色来标记内存的使用情况。 这个问题在刚开始的时候觉得很纠结,不知道怎么下手,后来通过网上代码,以及学长指导之下慢慢实现了此项功能,但是目前为止还没有对界面进行美化。 (2)动态分配内存的算法书上总共介绍了三种,我采取的是首次适应法,在起初编码时有想过把三种算法都编进去,让用户选择采用哪种算法,后来发现实现起来有一定的困难,目前还没完成,不过仍在继续实验。 **调试结果截图 (1)初始界面 (2)运行界面 运行状态 (2) 【用户手册】 用户可根据对话框提示进行操作,首先进行内存分配,并确定分配内存大小,在左边存储空间分配情况会将内存块使用情况显示出来;其次使用回收内存,再次分配内存,可发现本系统采用的分配算法是说首次适应法。 【附录】 部分代码: #include"iostream" usingnamespacestd; structlist{ intflag;//0表示未分配,1表示已分配 intPID; intstart;//起始位置 intlength;//分区大小 list*next; }; externlist*head; externintcount; voidCMy2Dlg: : OnPaint()//用不同的颜色标记内存空间使用情况 { if(IsIconic()) { CPaintDCdc(this);//devicecontextforpainting SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0); //Centericoninclientrectangle intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //Drawtheicon dc.DrawIcon(x,y,m_hIcon); } else { CDialog: : OnPaint(); } list*p=head; HDChdc=: : GetDC(m_hWnd); HPENhp; HBRUSHhbr; HFONThf; TEXTMETRICtm; CStringx; intcount=0; SelectObject(hdc,hp); SelectObject(hdc,hf); GetTextMetrics(hdc,&tm); hbr=(HBRUSH)GetStockObject(LTGRAY_BRUSH); SelectObject(hdc,hbr); Rectangle(hdc,100,20,130,340); while(p! =NULL) { if(p->flag==0) hbr=(HBRUSH)GetStockObject(WHITE_BRUSH); else { if(count%2==0) hbr=CreateHatchBrush(HS_BDIAGONAL,RGB(0,0,0)); else hbr=CreateHatchBrush(HS_FDIAGONAL,RGB(0,0,0)); count++; } SelectObject(hdc,hbr); Rectangle(hdc,20,20+p->start/2,100,20+(p->length+p->start)/2); x.Format("%d",p->start); TextOut(hdc,110,p->start/2+20-tm.tmHeight/2,x,strlen(x)); x.Format("%d",p->start+p->length); TextOut(hdc,110,(p->start+p->length)/2+20-tm.tmHeight/2,x,strlen(x)); p=p->next; } p=head; CStrings="注: 状态为0表示为空闲分区,\r\n1表示为进程使用分区\r\n----------------------\r\n"; m_edit=""; sum=0; while(p! =NULL) { if(p->PID! =0) { x.Format("%d",p->PID); s=s+"使用进程PID: "+x+"\r\n"; sum=sum+p->length; } x.Format("%d",p->flag); s=s+"状态: "+x+"\r\n"; x.Format("%d",p->start); s=s+"起始位置: "+x+"\r\n"; x.Format("%d",p->length); s=s+"空间大小: "+x+"\r\n"; x.Format("%d",p->length+p->start); s=s+"结束位置: "+x+"\r\n"; s=s+"-------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实习 报告