《2022年《操作系统课程设计》报告 .pdf》由会员分享,可在线阅读,更多相关《2022年《操作系统课程设计》报告 .pdf(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、操作系统课程设计报告学号: 200803920 姓名:杨 浩班级:计科 10801 指导教师:冯 伟报告日期: 2010 年 12 月 31 日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 15 页 - - - - - - - - - 一、课设目的操作系统是计算机专业的一门专业课,也是计算机专业考研课程, 但操作系统比较抽象, 有的同学一学期完了都还很难理解进程、内存管理等一些概念和原理,操作系统课程设计的目的就是通过设计的实验,让同学们真正理解进程的实现,内存管理的机
2、制, 达到理解概念, 了解实现原理。 同时也进一步巩固程序设计与数据结构的实践技能,实现整个大学阶段实践技能不断线的目的。二、课设内容一个操作系统采用请求页式管理方式来管理内存。当一个进程在运行中, 随着进程的执行,它会不断的访问内存(代码执行、存取数据),这样就会提出内存访问请求。 操作系统会根据用户进程提出的访存请求,来做地址变换, 从而访问到用户进程想要访问的代码或数据。操作系统进行地址变换的过程中发现用户将要访问的地址所在的虚页还没有进入内存会自动将该虚页从磁盘中装入内存,再进行地址变换。 当然若新的页调入内存之前, 该进程所能使用的最大内存块数已经用完的话,操作系统就会从该进程已经在
3、内存的那些页中根据先进先出的原则来淘汰掉一个页, 腾出空间给将要正要请求访问的页。所以操作系统要记录每个进程的每个页面的状态, 记录这些调入内存的页面的顺序,还要记录内存中各个块的使用情况。 这些都是操作系统必需动态维护的数据,是操作系统的信息基础。现假设一个计算机系统有内存m KB,系统的页面大小为1KB ,假设操作系统占用内存低端的n 个块( nm/5) ,剩余的内存空间采用“随机+顺序”的方式来获取未用内存块,以分配给块请求程序。所谓“随机 +顺序”的内存块分配方式就是用随机数来确定一个起始探测的开始块号, 如果其已经被分配, 则向下一块探测, 如果还是已经分配, 则继续下探,直到找到可
4、用块,如果已经到内存的尾部则回到操作系统分界处继续下探。操作系统采用固定可用块数的方式给每个进程使用和分配内存块,并且规定最大内存块数为x,当某个进程已经用完了它的最大内存块数后就要淘汰页面了。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 15 页 - - - - - - - - - 模拟计算机系统允许最大并发进程数为y,假设目前进程数已经达到最大进程数。为了模拟某个进程,其所需的页面数z由随机数产生 (m/10 z m/4),页面推进的过程采用随机数方式给出访存地址a
5、, 逻辑地址 a应该在 0 到 zKB-1 之间,操作系统负责对逻辑地址a 进行地址变换,并维护整个系统内存管理的所有数据结构,保证进程的顺利推进,使内存得以共享,实现虚拟存储器的功能。要求课设实现的系统能够配置上述参数,并按照配置参数的规模来系统的模拟系统的运行过程。希望可以可视化的展示系统内部的变化。三、实现过程1.CPage类classCPage publicbool bInMemoryFlag;/ 该页是否在内存publicint nFrameNo; / 内存的块号publicint nDiskRelBlockNo;/ 磁盘的相对块号(可以随机给定)publicint nNextPag
6、eNo; / 下一调进内存页的页号publicbool bModifiedFlag;/ 修改位(可以随机给定)/ /逻辑页面 Cpage 的构造函public CPage() bInMemoryFlag = false ; / 该页是否在内存 nFrameNo = 0;/ 内存的块号Random ran = new Random (); / 伪随机生成数int num = ran.Next(0, 10000);/ 随机产生一个磁盘块号 nDiskRelBlockNo = num;/ 磁盘的相对块号(可以随机给定) nNextPageNo = 0;/ 下一调进内存页的页号 bModifiedFl
7、ag = false ; / 修改位(可以随机给定) 2.CProcess 类public class CProcess 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 15 页 - - - - - - - - - int nPID;/进程标识符string szProcessName;/ 进程名int nControlNo;/进程控制号int nStatus; /进程状态标志int nPageCountLogicalSpace;/ 逻辑地址空间的页数int nPageC
8、ountInMemory;/调入内存的页数int nRunTime;/运行时间(运行步数)int nPageNoHead;/ 调入内存的首页int nPageNoTail;/调入内存的末页CPage PageTable;/ 定义一个对象数组,用于存放当前进程的逻辑页信息/ 进程的构造函数public CProcess() nPID = 0; /进程标识符szProcessName = DateTime.Now.ToString();/以当前时间的字符串形式为进程nPageCountInMemory = 0; nStatus = 0; nPageNoHead = 0; nPageNoTail =
9、 0; / 初始化一个进程public void InitProcessParameter(int no, int pagetotal, int runtime) nControlNo = no;/进程控制号nPageCountLogicalSpace = pagetotal;/ 逻辑地址空间的页数nRunTime = runtime;/运行时间(运行步数)PageTable = new CPagenPageCountLogicalSpace;/ 根据实际需要创建页表for (int i = 0; i nPageCountLogicalSpace; i+)/初始化进程逻辑页表的各项PageTa
10、blei = new CPage(); public int GetOneLogicalAddress() Random ran = new Random(); int ran_num = ran.Next(1, nPageCountLogicalSpace); return ran_num; / 请求分页中的地址变换过程public string AddressMapping(int LogicalAddress, int MaxMem) int nIndexIn = LogicalAddress;/正在访问到的页的页号名师资料总结 - - -精品资料欢迎下载 - - - - - - - -
11、 - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 15 页 - - - - - - - - - int nIndexOut;/淘汰的页号int nFrameNoReused;/ 重复被使用的int MaxFrameCount = MaxMem; if (this.PageTablenIndexIn.bInMemoryFlag = false)/未装入内存 if (nPageCountInMemory MaxFrameCount)/本进程使用的内存块数未达最大块数 PageTablenIndexIn.nFrameNo=COSExamDlg.All
12、ocateMemoryFrame(nControlNo);/请求分配一块内存空间PageTablenIndexIn.bInMemoryFlag = true;/然后装入内存/维护链表if (nPageCountInMemory = 0)/第一个页面装入内存 PageTablenIndexIn.nNextPageNo = -1;/ 设置该页表项的下一个this.nPageNoHead = nIndexIn; this.nPageNoTail = nIndexIn; else PageTablenIndexIn.nNextPageNo = -1;/刚装入的页面的Next 指针设为-1(终点)Pag
13、eTablethis.nPageNoTail.nNextPageNo = nIndexIn; this.nPageNoTail = nIndexIn; nPageCountInMemory+; else /本进程使用的内存块数已达最大块数 /淘汰一页nIndexOut = this.nPageNoHead;/ 将调入内存中德首页淘汰出去nFrameNoReused = PageTablenIndexOut.nFrameNo;/ 暂存被重用的内存块的块号this.nPageNoHead = PageTablenIndexOut.nNextPageNo;/ 把首页设到原来的第二个顺序页PageTa
14、blenIndexOut.nFrameNo = -1;/ 原来的页设成不在内存PageTablenIndexOut.bInMemoryFlag = false; PageTablenIndexIn.nFrameNo = nFrameNoReused;/ 访问页装入腾出的块PageTablenIndexIn.bInMemoryFlag = true;/ 设为“已装入”PageTablenIndexIn.nNextPageNo = -1;/ 刚访问的页面的 Next指针设为 -1(终点)PageTablethis.nPageNoTail.nNextPageNo = nIndexIn;/ 附加到链表
15、名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 15 页 - - - - - - - - - this.nPageNoTail = nIndexIn;/设置为新的“链尾” else / 访问地址对应的页已在内存 /直接访问 /设置内存映像的显示串string OutputInfo = ; /循环检索页表的 bInMemoryFlag,确定个逻辑页面是否在内存for (int i = 0; i PageTable.Length; i+) if (PageTablei.bIn
16、MemoryFlag = true) OutputInfo = OutputInfo + 1|; else OutputInfo = OutputInfo + 0|; return OutputInfo; 3. COSExamDlg 类publicclassCOSExamDlg publicstaticint Mem_Arr = new int 60; /公共类的构造函数static COSExamDlg() for ( int i = 0; i 60; i+) Mem_Arri = -1; publicstaticintAllocateMemoryFrame( intnProcessNo)
17、名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 15 页 - - - - - - - - - int m_sOsFrameCount = 12; / 给OS 占用的内存块数int nFrameNoStart;/内存起始位置Random ran = new Random ();/定义一个随机计数器 nFrameNoStart = ran.Next(m_sOsFrameCount, 60); /nFrameNoStart 在(12,60 )可以随机取值while (Mem_A
18、rrnFrameNoStart != -1) /当内存其实指针在内存中时,取值 nFrameNoStart+; if (nFrameNoStart = 60) nFrameNoStart = m_sOsFrameCount; Mem_ArrnFrameNoStart = nProcessNo; return nFrameNoStart; 4. /进程 0的执行函数publicvoid CP0_function() CProcess CP0 = new CProcess(); / 新创建一进程string temp;/设置指针 temp CP0.InitProcessParameter(0, C
19、onvert .ToInt32(PageCount0.Text), Convert .ToInt32(RunTime0.Text); / 进程初始化for ( int i = 0; i Convert .ToInt32(RunTime0.Text); i+) Random ran = new Random (); int ran_num = ran.Next(0, Convert .ToInt32(PageCount0.Text); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7
20、 页,共 15 页 - - - - - - - - - temp=CP0.AddressMapping(ran_num, Convert .ToInt32(MaxProcessFrameCount.Text); / 内存请求页表变化过程 PageList0.Text = temp; / 将所得的字符串放赋到页表内容Thread .Sleep(2000); /进程 1的执行函数/ publicvoid CP1_function() CProcess CP1 = new CProcess(); CP1.InitProcessParameter(1, Convert .ToInt32(PageCou
21、nt1.Text), Convert .ToInt32(RunTime1.Text); for ( int i = 0; i Convert .ToInt32(RunTime1.Text); i+) Random ran = new Random (); int ran_num = ran.Next(0, Convert .ToInt32(PageCount1.Text) - 1); PageList1.Text = CP1.AddressMapping(ran_num, Convert .ToInt32(MaxProcessFrameCount.Text); Thread .Sleep(20
22、00); /进程 2的执行函数/ publicvoid CP2_function() CProcess CP2 = new CProcess(); CP2.InitProcessParameter(2, Convert .ToInt32(PageCount2.Text), Convert .ToInt32(RunTime2.Text); for ( int i = 0; i Convert .ToInt32(RunTime2.Text); i+) Random ran = new Random (); int ran_num = ran.Next(0, Convert .ToInt32(Pag
23、eCount2.Text) - 1); PageList2.Text = CP2.AddressMapping(ran_num, Convert .ToInt32(MaxProcessFrameCount.Text); Thread.Sleep(2000);/ 使线程休眠秒钟 /扫描内存的线程/summar 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 15 页 - - - - - - - - - publicvoid methodShow() Graphics g =
24、 this .CreateGraphics(); for ( int j = 0; j 150000; j+) / 可以在很大时间上进行循环for ( int i = Convert .ToInt32(OSFrameCount.Text); i Convert .ToInt32(MemeryFrameCount.Text); i+) if ( COSExamDlg .Mem_Arri = -1) / 内存未被使用 Brush brush = new SolidBrush ( Color .DarkGray); g.FillRectangle(brush, 32 + 10 * i, 390, 9
25、, 20); elseif ( COSExamDlg .Mem_Arri = 0) Brush brush = new SolidBrush ( Color .Magenta); g.FillRectangle(brush, 32 + 10 * i, 390, 9, 20); elseif ( COSExamDlg .Mem_Arri = 1) Brush brush = new SolidBrush ( Color .Orange); g.FillRectangle(brush, 32 + 10 * i, 390, 9, 20); else Brush brush = new SolidBr
26、ush ( Color .Blue); g.FillRectangle(brush, 32 + 10 * i, 390, 9, 20); /生效privatevoid button_ACCEPT_Click(object sender, EventArgs e) if ( Convert .ToInt32(ProcessCount.Text) = 2) PageCount2.Text = ; RunTime2.Text = ; Graphics g = this .CreateGraphics(); int j = 32; 名师资料总结 - - -精品资料欢迎下载 - - - - - - -
27、- - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 15 页 - - - - - - - - - for ( int i = 0; i Convert .ToInt32(OSFrameCount.Text); i+) j = j + 10; Brush brush = new SolidBrush ( Color .Red); g.FillRectangle(brush, j, 390, 9, 20); for ( int i = Convert .ToInt32(OSFrameCount.Text); i 60; i+) Pen pen =
28、new Pen( Color .Black, 1); g.DrawRectangle(pen, j, 390, 9, 20); j = j + 10; privatevoid COSExamForm_Load( object sender, EventArgs e) Control .CheckForIllegalCrossThreadCalls = false ; ProcessCount.Text = 3 ; MemeryFrameCount.Text = 60 ; RunTime0.Text = 12 ; RunTime1.Text = 12 ; RunTime2.Text = 12 ;
29、 PageCount0.Text = 12 ; PageCount1.Text = 8 ; PageCount2.Text = 16 ; MaxProcessFrameCount.Text = 4 ; OSFrameCount.Text = 10 ; privatevoid button_SIMU_Click(object sender, EventArgs e) for ( int i = 0; i Convert .ToInt32(ProcessCount.Text); i+) if (i = 0) Thread t0 = new Thread(CP0_function); t0.Star
30、t(); if (i = 1) Thread t1 = new Thread(CP1_function); t1.Start(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 15 页 - - - - - - - - - if (i = 2) Thread t2 = new Thread(CP2_function); t2.Start(); Thread t3 = new Thread(methodShow); / 扫描内存 t3.Start(); privatev
31、oid button3_Click(object sender, EventArgs e) Thread .CurrentThread.IsBackground = true ; Thread .CurrentThread.Abort(); 四、运行结果1. 生效名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 15 页 - - - - - - - - - 2. 模拟名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -
32、- - 名师精心整理 - - - - - - - 第 12 页,共 15 页 - - - - - - - - - 五、总结操作系统课程设计终于结束了,虽然验收的不是那么顺利,中间有几个地方实现的原理不是很明白, 但这次课设给了我很大的收获。使我对操作系统的基本知识有了进一步的了解,强化了将书中的理论知识通过编程应用于实践当中,从中深刻理解了进程,线程, 以及各种分配算法的含义和作用。在课设开始的时候,遇到了很多困难, 首先是用哪种语言实现其功能。很多语言可以实现该过程,但是要最方便而且要自己比较熟悉的一种语言做是最好的。我学过 C+,但是学的不好,所以没有把握用C+语言做出来。所以选择了C#语
33、言。其次是知识的应用上, 由于知识有限, 在设计有些功能的过程中,我并不清楚他们怎样实现的。许多想法不能很好的表达出来,这给了自己很大的压力。通过这次课设使我明白当面对实际问题时,如论多难只要善于思考就能从中找到了答案。当我们在完成一件东西不能满足于现状。我们要不断的用知识充实自己,努力做到让知识更加系统化、理论化。再次,通过这次课设使我明白无论事情有多难,只要努力去做,就会有好的结果。 因此无论以后遇到什么问题,我都一定会充满自信的面对,我相信只要努力,没有什么不可以。本系统实现的功能是用多线程模拟各个进程的运行,同时要有用户界面来反映内存中各进程的页面的装入与调出的变化情况,以及模拟的参数
34、要可以配置,模拟的各进程的参数也可以配置。 其中仍有许多的不足和缺陷,例如, 人机交互性不是很好,主要原因是在每次生效之后三个进程的对话框都同时出现了,而我想是要输入进程数,出现进程的对话框以及所各页面在内存中的情况。而我是直接在代码中输入了每个参数,运行之后就自动出现,因此人对系统的干预性能就降低了很多。用户界面对一个程序所要表达出的功能是很重要的,不过由于本人的局限性,以及对C#不是很熟练,对系统的界面设计不是很好,仍有很大改进的空间。在整个课程设计完后,我总的感觉是: 收获颇丰。 以前上课都是上一些最基本的东西而现在却可以将以前学的东西作出有实际价值的东西。在这个过程中, 我的确学得到很
35、多在书本上学不到的东西, 同时也巩固了以前的知识。比如用多线程模拟各个进程的运行过程中,就需要引用Thread类,当终止线程的时 public void Abort(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 15 页 - - - - - - - - - 进程名PageCountInMemory PageNoHead PageNoTail PageTable 进程0 3 0 5 A 进程1 4 1 3 B 进程2 5 2 4 C 页表A 页号0未装入内存1 装
36、入内存nFrameNo 物理地址NextPageNO 内存中下一个页的页号0 1 8 1 1 1 10 3 2 0 3 1 12 5 4 0 5 1 13 -1(结束) 块号内存0 OS 占用1 OS 占用2 OS 占用3 OS 占用4 OS 占用5 OS 占用6 OS 占用7 OS 占用8 A0 9 10 A1 11 12 A3 13 A5 14 B1 15 16 B3 17 C2 18 B0 19 20 C0 21 22 C4 23 页表B 页号0未装入内存1 装入内存nFrameNo 物理地址NextPageNO 内存中下一个页的页号0 1 18 3 1 1 14 0 2 0 3 1 1
37、6 -1 页表C 页号0未装入内存1 装入内存nFrameNo 物理地址NextPageNO 内存中下一个页的页号0 1 20 4 1 0 2 1 17 0 3 0 4 1 22 -1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 15 页 - - - - - - - - - 通过本次课程设计是我对以前学过的知识有了很好的复习,对于操作系统已经淡忘的部分通过这次课设得到了温习;虽然完成的很艰难,页出现过一段时间的迷茫,不知所为, 但对课设的完成特, 别要感谢我周围的同学和老师,给我提供了很大的帮助,在程序设计过程中也给我提出了很多宝贵的意见使我受益匪浅。课设老师让我知道了自己在知识方面存在的不足,在今后的学习中我一定会更加努力的。明确学习方向, 为将来的就业提前打了下坚实的专业基础。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 15 页 - - - - - - - - -