《操作系统课程设计》报告.docx
- 文档编号:4169682
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:26
- 大小:156.04KB
《操作系统课程设计》报告.docx
《《操作系统课程设计》报告.docx》由会员分享,可在线阅读,更多相关《《操作系统课程设计》报告.docx(26页珍藏版)》请在冰点文库上搜索。
《操作系统课程设计》报告
《操作系统课程设计》报告
学号:
姓名:
班级:
指导教师:
报告日期:
2010年12月31日
目录
一、课设目的1
二、课设内容1
三、实现过程2
1、可视化界面设计2
2、数据结构分析构造3
3、程序流程图5
4、主要算法分析5
5、程序主要部分清单7
四、运行结果14
五、总结15
一、课设目的
操作系统是计算机专业的一门专业课,也是计算机专业考研课程,但操作系统比较抽象,有的同学一学期完了都还很难理解进程、内存管理等一些概念和原理,操作系统课程设计的目的就是通过设计的实验,让同学们真正理解进程的实现,内存管理的机制,达到理解概念,了解实现原理。
同时也进一步巩固程序设计与数据结构的实践技能,实现整个大学阶段实践技能不断线的目的。
二、课设内容
一个操作系统采用请求页式管理方式来管理内存。
当一个进程在运行中,随着进程的执行,它会不断的访问内存(代码执行、存取数据),这样就会提出内存访问请求。
操作系统会根据用户进程提出的访存请求,来做地址变换,从而访问到用户进程想要访问的代码或数据。
操作系统进行地址变换的过程中发现用户将要访问的地址所在的虚页还没有进入内存会自动将该虚页从磁盘中装入内存,再进行地址变换。
当然若新的页调入内存之前,该进程所能使用的最大内存块数已经用完的话,操作系统就会从该进程已经在内存的那些页中根据先进先出的原则来淘汰掉一个页,腾出空间给将要正要请求访问的页。
所以操作系统要记录每个进程的每个页面的状态,记录这些调入内存的页面的顺序,还要记录内存中各个块的使用情况。
这些都是操作系统必需动态维护的数据,是操作系统的信息基础。
现假设一个计算机系统有内存mKB,系统的页面大小为1KB,假设操作系统占用内存低端的n个块(n 所谓“随机+顺序”的内存块分配方式就是用随机数来确定一个起始探测的开始块号,如果其已经被分配,则向下一块探测,如果还是已经分配,则继续下探,直到找到可用块,如果已经到内存的尾部则回到操作系统分界处继续下探。 操作系统采用固定可用块数的方式给每个进程使用和分配内存块,并且规定最大内存块数为x,当某个进程已经用完了它的最大内存块数后就要淘汰页面了。 模拟计算机系统允许最大并发进程数为y,假设目前进程数已经达到最大进程数。 为了模拟某个进程,其所需的页面数z由随机数产生(m/10 要求课设实现的系统能够配置上述参数,并按照配置参数的规模来系统的模拟系统的运行过程。 希望可以可视化的展示系统内部的变化。 三、实现过程 1、可视化界面设计 根据课设内容及其要求,模拟程序需要配置以下参数设置选项: 系统参数设置 内存大小(KB): 表示模拟计算机系统的内存总大小,以KB为最小单位。 其中包括模拟系统占用的及模拟程序可用的内存大小。 系统占用(KB): 模拟系统占用的内存大小,内存大小减去系统占用大小,剩下的即为模拟可分配的内存空间大小。 为了使模拟效果更加逼真,本课设要求系统占用空间不大于内存总空间大小的五分之一。 进程数: 运行的模拟进程数。 进程最大可用块数: 每个进程可以使用的最大内存块数。 模拟系统采用固定可用块数的方式给每个进程分配和使用内存块,当某个进程已经用完了它的最大内存块数后就要淘汰页面了。 此处为了防止进程申请系统分配内存时产生死锁,要求进程最大可用块数满足以下条件: 进程最大可用块数≤(内存大小—系统占用)/进程数 进程参数设置 逻辑地址空间页数: 进程实际的逻辑地址页数,其大小决定了其逻辑页表的长度。 进程运行时间: 进程实际要运行的步数,其大小决定了进程运行时访问页表的页数(重复计数)。 根据以上设置的参数,模拟程序将给出以下可视化信息: 内存状态: 反映内存使用的动态变化情况。 B页表内容: 进程页表内容更新状况。 综上所诉,设计出如图3.1所示的可视化界面。 图3.1可视化界面 2、数据结构分析构造 逻辑页 进程的逻辑页信息。 需要给出以下三个信息: 该页是否已在内存(bInMemoryFlag) 该页在页表的页号(nPageNo) 该页在内存的块号(nFrameNo) 实现代码如下: publicclassLogicPage { publicboolbInMemoryFlag;//是否已在内存 publicintnFrameNo;//内存块号 publicintnPageNo;//页号 publicLogicPage(intpageNo,intframeNo) { bInMemoryFlag=true; nFrameNo=frameNo; nPageNo=pageNo; } } 进程类 模拟的进程类。 利用C#中的线程类Thread构造线程对象来模拟进程。 该进程类主要包括以下数据成员信息: 进程标识号(PID) 进程逻辑地址空间页数(Pages) 进程运行时间(RunTime) 进程已加载到内存的页数(InMemoryPages) 进程页表(pageTable) 模拟进程的线程对象(Process) 其他一些数据成员信息见实现代码: publicclassImitateProcess//模拟进程类 { publicreadonlyintPID; publicreadonlyThreadProcess; publicLabellblProcessName; publicMyTextBoxtxtPages; publicMyTextBoxtxtRunTime; publicPictureBoxpicBox; publicBitmapbmp; publicintPages;//进程总共页数 publicintRunTime;//进程运行步数 privateintInMemoryPages;//已加载到内存的页数 privatereadonlyFrmMainfrmMain; privatereadonlyintIndexMax; privateList privatereadonlyRandomrand; publicImitateProcess(intpid,FrmMainfrm) { PID=pid; frmMain=frm; Pages=0; RunTime=0; InMemoryPages=0; IndexMax=frmMain.nMemorySize-frmMain.nOSMemorySize; pageTable=newList rand=newRandom(); Process=newThread(newThreadStart( ImitateProcessProc)); } } 3、程序流程图 图3.2程序流程图 4、主要算法分析 本程序主要涉及以下两个算法: 内存分配算法和地址映射算法。 内存分配算法 模拟计算机系统有内存mKB,系统的页面大小为1KB,假设操作系统占用内存低端的n个块(n 所谓“随机+顺序”的内存块分配方式就是用随机数来确定一个起始探测的开始块号,如果其已经被分配,则向下一块探测,如果还是已经分配,则继续下探,直到找到可用块,如果已经到内存的尾部则回到操作系统分界处继续下探。 程序中实现该算法的函数的参数为某个进程页表的页号pageNo,返回值为一个初始化好了的逻辑页。 其实现过程如下: 获得一个随机分配块号No; 利用lock语句对MemoryMap加锁,防止多线程同时访问修改其值; 从No开始循环检测MemoryMap,如果当前块已经被分配,则向下一块探测,如果还是已经分配,则继续下探,直到找到一个当前未使用的块(frameNo)为止。 如果已经到内存的尾部则回到操作系统分界处继续下探。 置第 步找到的块为已分配; 对MemoryMap加锁; InMemoryPages加一; 返回一个页号为pageNo,块号为frameNo,bInMemoryFlag为true的逻辑页。 其代码如下: privateLogicPageGetLogicPage(intpageNo)//获取内存上新载入一个逻辑页 {//该页的块号: 随机+顺序分配获取 intNo; No=rand.Next(MaxIndex); intindex=No; lock(frmMain.MemoryMap) { while(frmMain.MemoryMap[index]) { index++; if(MaxIndex==index) index=0; } frmMain.MemoryMap[index]=true; } InMemoryPages++; returnnewLogicPage(pageNo,index+frmMain.nOSMemorySize); } 地址映射算法 为了模拟某个进程,其所当前所要访问的页面由随机数产生即页面推进的过程采用随机数方式给出访存逻辑地址a(逻辑页表页号),逻辑地址a应该在0到Z-1(Z为该进程的逻辑空间页数)之间,操作系统负责对逻辑地址a进行地址变换,并维护整个系统内存管理的所有数据结构,保证进程的顺利推进,使内存得以共享,实现虚拟存储器的功能。 由于本程序只是模拟操作系统的内存管理,故地址映射部分也即进程页表变化与内存变化部分,其中更新显示界面的操作也在其中。 其实现代码如下: privatevoidAddressMapping(intpageNo) { LogicPageLP; if(! IsInMemory(pageNo))//不在内存 { if(InMemoryPages==frmMain.nMaxPages)//此时已达到最大块数 { LogicPageswapOutPage=SwapOutFirstInPage();//换出 swapOutPage.bInMemoryFlag=false; LP=newLogicPage(pageNo, swapOutPage.nFrameNo); frmMain.UpdatePageTableStatue_Swap(PID, swapOutPage.nPageNo,swapOutPage.nFrameNo,LP.nPageNo,LP.nFrameNo); } else { LP=GetLogicPage(pageNo); frmMain.UpdateMemoryMapPageTableStatus(PID,pageNo,LP.nFrameNo,true); } pageTable.Add(LP); } //否则该页已在内存中,直接访问不需更新 } 5、程序主要部分清单 主界面部分(FrmMain.cs) publicpartialclassFrmMain: Form { publicintnMemorySize;//内存大小 publicintnOSMemorySize;//操作系统占用内存大小 publicintnMaxPages;//每个进程最大页数 publicbool[]MemoryMap;//内存位图使用情况 privateintnProcessNum;//进程数 privateBitmapbmpMemoryMap;//内存位图 privateList publicFrmMain() { InitializeComponent(); IProcessList=newList UPPTMM=newUpdatePPTMMHandler(UpdatePPTMM); UPPTSwap=newUpdatePPT_SwapHandler(UpdatePPT_Swap); ProcessAbortDelegate=newMethodInvoker(ProcessAbort); } privatevoidbtnOK_Click(objectsender,EventArgse) {//生效按钮 try { nMemorySize=txtMemorySize.Value; nOSMemorySize=txtOSMemSize.Value; nProcessNum=txtProcessNum.Value; nMaxPages=txtMaxPages.Value; if(nMemorySize<5) thrownewException("内存大小设置过小,请输入一个较大的正整数。 "); inttemp=nMemorySize/5; if(nOSMemorySize>temp)//系统占用大于m/5 { MessageBox.Show("系统内存设置过大,将其设为总内存大小的五分之一。 ","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning); nOSMemorySize=temp; txtOSMemSize.Value=temp; txtOSMemSize.Text=temp.ToString(); } temp=(nMemorySize-nOSMemorySize)/nProcessNum; if(nMaxPages>temp)//进程最大使用块数过大,可能产生死锁 { MessageBox.Show("进程最大使用块数过大,可能产生死锁。 将其设为安全使用值。 ","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning); nMaxPages=temp; txtMaxPages.Value=temp; txtMaxPages.Text=temp.ToString(); } for(inti=0;i NewProcessControls(i); btnBegin.Enabled=true; gbOSParam.Enabled=false; } catch(Exceptionex) { IProcessList.Clear(); MessageBox.Show(ex.Message,"错误",MessageBoxButtons.OK, MessageBoxIcon.Error); } } privatevoidbtnBegin_Click(objectsender,EventArgse) {//开始模拟 MemoryMap=newbool[nMemorySize-nOSMemorySize]; Array.Clear(MemoryMap,0,MemoryMap.Length); DrawMemoryMap();//初始化内存状态显示图 foreach(ImitateProcessIProcessinIProcessList) { IProcess.txtPages.Enabled=false; IProcess.txtRunTime.Enabled=false; IProcess.Pages=IProcess.txtPages.Value; IProcess.RunTime=IProcess.txtRunTime.Value; IProcess.bmp=newBitmap(25*IProcess.Pages,20); Graphicsg=Graphics.FromImage(IProcess.bmp); for(inti=0;i g.FillRectangle(Brushes.Green,newRectangle( i*25,0,24,20)); g.Save(); IProcess.picBox.Image=IProcess.bmp; g.Dispose(); IProcess.Process.Start(); } btnBegin.Enabled=false; } privatevoidFrmMain_Shown(objectsender,EventArgse) { Graphicsg=panelDisplay.CreateGraphics(); g.DrawString("内存状态: ",lblTip.Font,Brushes.Black,50,5); g.FillRectangle(Brushes.Red,110,5,10,10); g.DrawString("该块已占用",lblTip.Font,Brushes.Black,125,5); g.FillRectangle(Brushes.Green,200,5,10,10); g.DrawString("该块未占用",lblTip.Font,Brushes.Black,215,5); g.FillRectangle(Brushes.Blue,290,5,10,10); g.DrawString("操作系统占用",lblTip.Font,Brushes.Black,310,5); g.DrawString("页表状态: ",lblTip.Font,Brushes.Black,50,30); g.FillRectangle(Brushes.Red,110,25,20,20); g.DrawString("66",lblTip.Font,Brushes.Black,112,28); g.DrawString("该页在内存且块号为66",lblTip.Font,Brushes.Black,135,30); g.FillRectangle(Brushes.Green,270,25,20,20); g.DrawString("66",lblTip.Font,Brushes.Black,272,28); g.DrawString("该页已被换出内存且换出前块号为66",lblTip.Font,Brushes.Black,295,30); g.FillRectangle(Brushes.Green,500,25,20,20); g.DrawString("该页还未载入过内存",lblTip.Font,Brushes.Black,525,30); g.Dispose(); } privatevoidNewProcessControls(intpid) {创建新进程的控件 ImitateProcessIProcess=newImitateProcess(pid,this); inttop=55+pid*30; LabellblProcessName=newLabel(); lblProcessName.Text="进程"+pid.ToString(); lblProcessName.Left=10; lblProcessName.Top=top; lblProcessName.Parent=this.panelProcessDisplay; IProcess.lblProcessName=lblProcessName; top-=5; MyTextBoxtxtPages=newMyTextBox(); txtPages.Width=65; txtPages.Height=40; txtPages.Left=120; txtPages.Top=top; txtPages.Parent=this.panelProcessDisplay; IProcess.txtPages=txtPages; MyTextBoxtxtRunTime=newMyTextBox(); txtRunTime.Width=65; txtRunTime.Height=40; txtRunTime.Left=200; txtRunTime.Top=top; txtRunTime.Parent=this.panelProcessDisplay; IProcess.txtRunTime=txtRunTime; PictureBoxpicBox=newPictureBox(); picBox.SizeMode=PictureBoxSizeMode.AutoSize; picBox.Left=280; picBox.Top=top; IProcess.picBox=picBox; picBox.Parent=this.panelProcessDisplay; IProcessList.Add(IProcess); } privatevoidProcessAbort() {//进程终止 nProcessNum--; if(nProcessNum==0) { if(DialogResult.Yes==MessageBox.Show("模拟进程结束,是否要从新开始? ", "完成提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question)) { ImitateProcessIProcess; for(inti=0;i { IProcess=IProcessList[i]; IProcess.txtRunTime.Dispose(); IProcess.txtPages.Dispose(); IProcess.picBox.Dispose(); IProcess.bmp.Dispose(); IProcess.lblProcessName.Dispose(); IProcess.Process.Abort(); } IProcessList.Clear(); picMemoryMap.Image=null; bmpMemoryMap.Dispose(); gbOSParam.Enabled=tr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统课程设计 操作系统 课程设计 报告