《操作系统课程设计》报告.doc_第1页
《操作系统课程设计》报告.doc_第2页
《操作系统课程设计》报告.doc_第3页
《操作系统课程设计》报告.doc_第4页
《操作系统课程设计》报告.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统课程设计报告学 号: 200803920 姓 名: 杨 浩 班 级: 计科10801 指导教师: 冯 伟 报告日期: 2010年12月31日 一、课设目的操作系统是计算机专业的一门专业课,也是计算机专业考研课程,但操作系统比较抽象,有的同学一学期完了都还很难理解进程、内存管理等一些概念和原理,操作系统课程设计的目的就是通过设计的实验,让同学们真正理解进程的实现,内存管理的机制,达到理解概念,了解实现原理。同时也进一步巩固程序设计与数据结构的实践技能,实现整个大学阶段实践技能不断线的目的。二、课设内容一个操作系统采用请求页式管理方式来管理内存。当一个进程在运行中,随着进程的执行,它会不断的访问内存(代码执行、存取数据),这样就会提出内存访问请求。操作系统会根据用户进程提出的访存请求,来做地址变换,从而访问到用户进程想要访问的代码或数据。操作系统进行地址变换的过程中发现用户将要访问的地址所在的虚页还没有进入内存会自动将该虚页从磁盘中装入内存,再进行地址变换。当然若新的页调入内存之前,该进程所能使用的最大内存块数已经用完的话,操作系统就会从该进程已经在内存的那些页中根据先进先出的原则来淘汰掉一个页,腾出空间给将要正要请求访问的页。所以操作系统要记录每个进程的每个页面的状态,记录这些调入内存的页面的顺序,还要记录内存中各个块的使用情况。这些都是操作系统必需动态维护的数据,是操作系统的信息基础。现假设一个计算机系统有内存m KB,系统的页面大小为1KB,假设操作系统占用内存低端的n个块(nm/5),剩余的内存空间采用“随机+顺序”的方式来获取未用内存块,以分配给块请求程序。所谓“随机+顺序”的内存块分配方式就是用随机数来确定一个起始探测的开始块号,如果其已经被分配,则向下一块探测,如果还是已经分配,则继续下探,直到找到可用块,如果已经到内存的尾部则回到操作系统分界处继续下探。操作系统采用固定可用块数的方式给每个进程使用和分配内存块,并且规定最大内存块数为x,当某个进程已经用完了它的最大内存块数后就要淘汰页面了。模拟计算机系统允许最大并发进程数为y,假设目前进程数已经达到最大进程数。为了模拟某个进程,其所需的页面数z由随机数产生(m/10 z m/4),页面推进的过程采用随机数方式给出访存地址a,逻辑地址a应该在0到zKB-1之间,操作系统负责对逻辑地址a进行地址变换,并维护整个系统内存管理的所有数据结构,保证进程的顺利推进,使内存得以共享,实现虚拟存储器的功能。要求课设实现的系统能够配置上述参数,并按照配置参数的规模来系统的模拟系统的运行过程。希望可以可视化的展示系统内部的变化。三、实现过程1.CPage类class CPage public bool bInMemoryFlag;/该页是否在内存 public int nFrameNo;/内存的块号 public int nDiskRelBlockNo;/磁盘的相对块号(可以随机给定) public int nNextPageNo;/下一调进内存页的页号 public bool bModifiedFlag;/修改位(可以随机给定) / / 逻辑页面Cpage的构造函 public CPage() bInMemoryFlag = false;/该页是否在内存 nFrameNo = 0;/内存的块号 Random ran = new Random();/伪随机生成数 int num = ran.Next(0, 10000);/随机产生一个磁盘块号 nDiskRelBlockNo = num;/磁盘的相对块号(可以随机给定) nNextPageNo = 0;/下一调进内存页的页号 bModifiedFlag = false;/修改位(可以随机给定) 2.CProcess类public class CProcess int nPID;/进程标识符 string szProcessName;/进程名 int nControlNo;/进程控制号 int nStatus; /进程状态标志 int nPageCountLogicalSpace;/逻辑地址空间的页数 int nPageCountInMemory;/调入内存的页数 int nRunTime;/运行时间(运行步数) int nPageNoHead;/调入内存的首页 int nPageNoTail;/调入内存的末页 CPage PageTable;/定义一个对象数组,用于存放当前进程的逻辑页信息 / 进程的构造函数 public CProcess() nPID = 0; /进程标识符 szProcessName = DateTime.Now.ToString();/以当前时间的字符串形式为进程 nPageCountInMemory = 0; nStatus = 0; nPageNoHead = 0; nPageNoTail = 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+)/初始化进程逻辑页表的各项 PageTablei = 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;/正在访问到的页的页号 int nIndexOut;/淘汰的页号 int nFrameNoReused;/重复被使用的 int MaxFrameCount = MaxMem; if (this.PageTablenIndexIn.bInMemoryFlag = false)/未装入内存 if (nPageCountInMemory MaxFrameCount)/本进程使用的内存块数未达最大块数 PageTablenIndexIn.nFrameNo=COSExamDlg.AllocateMemoryFrame(nControlNo);/请求分配一块内存空间PageTablenIndexIn.bInMemoryFlag = true;/然后装入内存 /维护链表 if (nPageCountInMemory = 0)/第一个页面装入内存 PageTablenIndexIn.nNextPageNo = -1;/设置该页表项的下一个 this.nPageNoHead = nIndexIn; this.nPageNoTail = nIndexIn; else PageTablenIndexIn.nNextPageNo = -1;/刚装入的页面的Next指针设为-1(终点) PageTablethis.nPageNoTail.nNextPageNo = nIndexIn; this.nPageNoTail = nIndexIn; nPageCountInMemory+; else /本进程使用的内存块数已达最大块数 /淘汰一页 nIndexOut = this.nPageNoHead;/将调入内存中德首页淘汰出去 nFrameNoReused = PageTablenIndexOut.nFrameNo;/暂存被重用的内存块的块号 this.nPageNoHead = PageTablenIndexOut.nNextPageNo;/把首页设到原来的第二个顺序页 PageTablenIndexOut.nFrameNo = -1;/原来的页设成不在内存 PageTablenIndexOut.bInMemoryFlag = false; PageTablenIndexIn.nFrameNo = nFrameNoReused;/访问页装入腾出的块 PageTablenIndexIn.bInMemoryFlag = true;/设为“已装入” PageTablenIndexIn.nNextPageNo = -1;/刚访问的页面的Next指针设为-1(终点) PageTablethis.nPageNoTail.nNextPageNo = nIndexIn;/附加到链表 this.nPageNoTail = nIndexIn;/设置为新的“链尾” else /访问地址对应的页已在内存 /直接访问 /设置内存映像的显示串 string OutputInfo = ;/循环检索页表的bInMemoryFlag,确定个逻辑页面是否在内存 for (int i = 0; i PageTable.Length; i+) if (PageTablei.bInMemoryFlag = true) OutputInfo = OutputInfo + 1|; else OutputInfo = OutputInfo + 0|; return OutputInfo; 3. COSExamDlg类public class COSExamDlg public static int Mem_Arr = new int60; / 公共类的构造函数 static COSExamDlg() for (int i = 0; i 60; i+) Mem_Arri = -1; public static int AllocateMemoryFrame(int nProcessNo) int m_sOsFrameCount = 12;/给OS占用的内存块数 int nFrameNoStart;/内存起始位置 Random ran = new Random();/定义一个随机计数器 nFrameNoStart = ran.Next(m_sOsFrameCount, 60);/nFrameNoStart在(12,60)可以随机取值 while (Mem_ArrnFrameNoStart != -1) /当内存其实指针在内存中时,取值 nFrameNoStart+; if (nFrameNoStart = 60) nFrameNoStart = m_sOsFrameCount; Mem_ArrnFrameNoStart = nProcessNo; return nFrameNoStart; 4. / 进程0的执行函数public void CP0_function() CProcess CP0 = new CProcess(); /新创建一进程 string temp;/设置指针temp CP0.InitProcessParameter(0, Convert.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); temp=CP0.AddressMapping(ran_num,Convert.ToInt32(MaxProcessFrameCount.Text); /内存请求页表变化过程 PageList0.Text = temp; /将所得的字符串放赋到页表内容 Thread.Sleep(2000); / 进程1的执行函数 / public void CP1_function() CProcess CP1 = new CProcess(); CP1.InitProcessParameter(1, Convert.ToInt32(PageCount1.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(2000); / 进程2的执行函数 / public void 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(PageCount2.Text) - 1); PageList2.Text = CP2.AddressMapping(ran_num, Convert.ToInt32(MaxProcessFrameCount.Text); Thread.Sleep(2000);/使线程休眠秒钟 / 扫描内存的线程 / /summar public void methodShow() Graphics g = 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, 20); else if (COSExamDlg.Mem_Arri = 0) Brush brush = new SolidBrush(Color.Magenta); g.FillRectangle(brush, 32 + 10 * i, 390, 9, 20); else if (COSExamDlg.Mem_Arri = 1) Brush brush = new SolidBrush(Color.Orange); g.FillRectangle(brush, 32 + 10 * i, 390, 9, 20); else Brush brush = new SolidBrush(Color.Blue); g.FillRectangle(brush, 32 + 10 * i, 390, 9, 20); / 生效 private void button_ACCEPT_Click(object sender, EventArgs e) if (Convert.ToInt32(ProcessCount.Text) = 2) PageCount2.Text = ; RunTime2.Text = ;Graphics g = this.CreateGraphics(); int j = 32; 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 = new Pen(Color.Black, 1); g.DrawRectangle(pen, j, 390, 9, 20); j = j + 10; private void COSExamForm_Load(object sender, EventArgs e) Control.CheckForIllegalCrossThreadCalls = false; ProcessCount.Text = 3; MemeryFrameCount.Text = 60; RunTime0.Text = 12; RunTime1.Text = 12; RunTime2.Text = 12; PageCount0.Text = 12; PageCount1.Text = 8; PageCount2.Text = 16; MaxProcessFrameCount.Text = 4;OSFrameCount.Text = 10; private void 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.Start(); if (i = 1) Thread t1 = new Thread(CP1_function); t1.Start(); if (i = 2) Thread t2 = new Thread(CP2_function); t2.Start(); Thread t3 = new Thread(methodShow); /扫描内存 t3.Start(); private void button3_Click(object sender, EventArgs e) Thread.CurrentThread.IsBackground = true; Thread.CurrentThread.Abort(); 四、运行结果1.生效2.模拟五、总结操作系统课程设计终于结束了,虽然验收的不是那么顺利,中间有几个地方实现的原理不是很明白,但这次课设给了我很大的收获。使我对操作系统的基本知识有了进一步的了解,强化了将书中的理论知识通过编程应用于实践当中,从中深刻理解了进程,线程,以及各种分配算法的含义和作用。在课设开始的时候,遇到了很多困难,首先是用哪种语言实现其功能。很多语言可以实现该过程,但是要最方便而且要自己比较熟悉的一种语言做是最好的。我学过C+,但是学的不好,所以没有把握用C+语言做出来。所以选择了C#语言。其次是知识的应用上,由于知识有限,在设计有些功能的过程中,我并不清楚他们怎样实现的。许多想法不能很好的表达出来,这给了自己很大的压力。通过这次课设使我明白当面对实际问题时,如论多难只要善于思考就能从中找到了答案。当我们在完成一件东西不能满足于现状。我们要不断的用知识充实自己,努力做到让知识更加系统化、理论化。再次,通过这次课设使我明白无论事情有多难,只要努力去做,就会有好的结果。因此无论以后遇到什么问题,我都一定会充满自信的面对,我相信只要努力,没有什么不可以。本系统实现的功能是用多线程模拟各个进程的运行,同时要有用户界面来反映内存中各进程的页面的装入与调出的变化情况,以及模拟的参数要可以配置,模拟的各进程的参数也

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论