VC++mfc 操作系统课程设计 页式存储管理 报告_第1页
VC++mfc 操作系统课程设计 页式存储管理 报告_第2页
VC++mfc 操作系统课程设计 页式存储管理 报告_第3页
VC++mfc 操作系统课程设计 页式存储管理 报告_第4页
VC++mfc 操作系统课程设计 页式存储管理 报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、青岛理工大学操作系统课程设计报告院(系): 计算机工程学院 专业: 计算机科学与技术专业 学生姓名: 胡松朝 班级: 计算073 学号: 200707046 题目:模拟页式存储管理方案中内存空间的管理和分配 起迄日期: 2010年7月5日2010年7月15日 设计地点: 计算机工程学院实验室 指 导 教 师: 李 兰 200920010年度 第 2 学期完成日期: 2010 年 7 月 15 日课程设计目的操作系统是一门重要的专业基础课,是涉及较多硬件知识的计算机系统软件课程。在计算机软硬件课程的设置上,它起着承上启下的作用。操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接

2、口,所有用户在使用计算机时都要得到操作系统提供的服务。操作系统课程设计的主要任务是研究计算机操作系统的基本原理和算法,掌握操作系统的进程管理、存储管理、文件管理和设备管理的基本原理与主要算法。目的是使学生掌握常用操作系统(如DOS、Windows或Linux)的一般管理方法,了解它是如何组织和运作的,对操作系统的核心概念和算法有一个透彻的理解,并对系统运行的机制有一个全面的掌握,从而充分理解系统调用与程序设计之间的关系。本题的目的是通过对页式存储管理方案中内存空间的管理和分配的模拟,了解和认识操作系统对资源的离散分配方法,它不要求作业或进程的和程序段和数据在内存中连续存放,从而有效地解决了碎片

3、问题。这既提高了内存的利用率,又有利于组织多道程序执行。课程设计内容 模拟页式存储管理方案中内存空间的管理和分配。(包括位示图法、空闲表法) 内存被划分成2048块(页)。用32位字长的字存放位示图,为0的位表示该块尚未分配,为1的位表示该块已分配。输出位示图和页表。系统分析与设计1、系统分析存储器是计算机系统的重要组成部分。近年来,存储器容量虽然一直在不断扩大,但仍不满足现代软件发展的需要,因此,存储器仍然是一种宝贵的而又紧俏的资源,如何对它加以有效地管理,不仅直接影响到存储器的利用率,而且还对系统性能有重大的影响。存储器管理的主要对象是内存。充分利用内存,为多道程序并发执行提供存储基础,尽

4、可能方便用户使用。采用基本也是存储管理方式为每道程序分配内存空间,提高存储器的利用率,以减少不可用的内存空间;允许正在运行的程序申请附加的内存空间,以适应程序和数据动态增长的需要。页式存储管理该技术近年来已广泛用于微机系统中,支持页式想念管理的硬件部件通常称不“存储管理部件”。逻辑地址:目标程序中的地址所形成的地址范围称为“地址空间”,其中的地址叫逻辑地址。物理地址:内存中的一系列单元所限定的地址范围称“内存空间”,其中的地址称为物理地址。地址映射:将地址空间中的逻辑地址转换为内存空间中与之对应的物理地址。基本原理:允许作业存放在若干个不相邻的分区中,既可免去移动内存信息而产生的工作量,又可充

5、分利用主存空间,尽量减少主存碎片。离散分配方式:将一个进程直接分散地分配到许多不相邻的分区中。离散分配三种方式:分页存储管理(考虑存储器利用率)分段存储管理(考虑用户要求)段页式存储管(考虑存储器利用率和用户要求)基本分页存储管理方式:在分页存储管理方式中,如果不具备页面对换功能,则是基本分页存储管理方式,或称为纯分页存储管理方式。存储管理部件首先把内存分成大小相等的许多区,把每个区称不“块”,块是进行主存空间分配的物理单位。同时,要求程序中的逻辑地址也进行分页,页的大小与块的大小一致辞。这样,就可把程序信息按页存放到块中。于是,页式存储品提供编程使用的逻辑地址由两部分组成:页号和页内地址。其

6、格式为页号页内地址页式存储的地址结构确定了内存分块的大小,也就决定了页面的大小。为了实现页式存储管理,系统要提供一对硬件的页表控制寄存器,即页表始址寄存器和页表长度寄存器,另外还需要高速缓冲存储器的支持。页表始址寄存器,用于保存正在运行进程的页表在内存的首地址,当进程被调度程序选中投入运行时,系统将其页表首地址从进程控制块中取出送入该寄存器。页表长度寄存器,用于保存正在运行进程的页表的长度,当进程被选中运行时,系统将它从进程控制块中取出送入该寄存器。页表指出该程序逻辑地址中的页号与所占用的主存块号之间的对应关系。页表的长度由程序拥有的页面数而定,故每个程序的页表长度可能不是不同的。页表又是硬件

7、进行地址转换的依据,每执行一条指令时按逻辑地址中的页号查页表。若页表中无此页号,则产生一个“地址错”的程序性中断事件。若页表中有此页号,则右得到对应的主存块号,按计算公式可转换成访问的主存的物理地。物理地址的计算公式为: 物理地址=内存块号*块长+页内地址快表只存放当前进程最活跃的少数几页,随着进程的推进,快表的内容动态进行更新。实际上,查找快表和查找内存页表是并行进行的,一旦发现快表中有与所查页号一致的逻辑页号就停止查找内存页表,而直接利用快表中的逻辑页号。采用快表后,地址转换的时间大大下降。假定访问主存的时间为200纳秒,访问高速缓冲存储器的时间为40纳秒,高速缓冲存储器为16个单元时,查

8、快表的命中率为90%。于是,按逻辑地址转换成约对地址进行存取的平均访问时间为:(200+40)*90%+(200+200)*10%=256(纳秒)不使用快表需两次访问主存的时间:200*2=7400纳秒。可见使用快表与不使用快表相比,访问时间下降了36%。特点:不具有支持实现虚拟存储器的功能;要求把每个作业全部装入内存后方能运行。2、系统设计:系统设计方案:1)建立一个数据结构,该数据结构用来表示一个进程的进程号,进程所需空间,进程占用的每个空间在内存中的位置,指向下一个进程的指针。2)添加进程,如果进程所申请的内存空间不大于空闲的内存,则可以为止分配资源,同时更改全局变量table的值,用来

9、标示内存空间已经被占用的位置,将已经分配的进程加入链表。3)查询进程,输入进程号,查找进程号是否在链表中,如果在则输出这个进程的相关信息,如进程表,进程所占空间。4)撤销进程,输入进程号,查找进程号是否在链表中,如果在,这删除这个进程节点,同时更改内存空闲空间,更改table表,来标示内存状态。5)增加功能,比如自动生成进程并为之分配内存,单步生成进程并为之分配内存。3、模块设计: 图1 主程序流程图类定义如下:CmyApp():class CMyApp : public CWinApppublic:CMyApp();CaboutDlg:class CAboutDlg : public CDi

10、alogpublic:CAboutDlg();CmyDlg:class CMyDlg : public CDialogpublic:void page_show(Pros *p);void CurrentWST();void InitWST();void OneStep();void process_show();int generating;CPAGE page;enum IDD = IDD_MY_DIALOG ;CEditm_result;CEditm_WST;CListCtrlm_List_Pinfo;CListCtrlm_List_Page;intm_JCH;intm_YS;prote

11、cted:virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnButtonStep();afx_msg void OnButtonReset();afx_msg void OnButtonAutorun();afx_msg void OnButtonStop();afx_msg void OnButtonBuild();afx_msg void O

12、nButtonInquiry();afx_msg void OnButtonRepeal();afx_msg void OnClickListPinfo(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnTimer(UINT nIDEvent);CPAGE:class CPAGE : public CDocumentpublic:void Init();node:typedef struct nodeint process_num;int process_space;int processPages;struct node *next;Pros;

13、图2 各函数间的调用关系4、数据结构说明:设计中所用到的数据结构或抽象数据类型的说明,以及在程序中的作用数据结构typedef struct nodeint process_num;int process_space;int processPages;struct node *next;Pros;分别表示进程号,进程所占空间,进程在内存中存在的位置,指向下一个节点的指针。一个节点包含了一个进程相应的信息,然后把节点连接起来,形成线性链表,便于在进程添加、查找和撤销的操作。5、算法流程图: 图3 程序模块及函数调用关系 图4 进程连接和内存分配关系四、模块调试与系统测试1、模块调试1)新建进程模

14、块输入的形式和输入值的范围如果要新建进程,本程序需用户在主窗体的编辑框中输入进程号和进程申请的内存空间大小,进程号和内存空间都是整形。进程号不允许与已知的进程号重复,所申请的内存空间不允许为0。输出的形式主窗体的进程列表显示出新建的进程信息,位视图的编辑框中更新位视图,把最新的内存占用情况标示出来。进程号重复,输出相关提示。程序所能达到的功能由用户指定进程号和进程申请的内存空间,来创建响应进程,进程信息会显示在进程列表中,以便用户查看。同时,位视图也及时更新,标示内存占用情况。2)查询进程模块输入形式和输入值的范围在主窗体的进程号编辑框中输入要查询的进程号,进程号位整形数据。输出的形式如果进程

15、存在,则会在页表列表中显示出进程的页表,同时,进程信息编辑框中会显示出进程号和进程占用的内存空间大小。如果进程不存在,系统会提示没有相关进程。程序所能达到的功能输入进程号,系统会查询该进程的相关信息。如果进程存在,则输入进程页表,和相关信息,否则,输出没有该进程的提示。3)撤销进程模块输入的形式和输入值的范围在主窗体的进程号编辑框中输入要撤销的进程的进程号,进程号为整形数据。输出的形式如果撤销成功,则更新进程列表,清空页表列表,同时更新位视图。如果没有该进程,则弹出对话框,提示没有该进程。程序所能达到的功能可以撤销已经分配了资源的进程,释放和回收内存,同时更新显示的相关信息。2、系统测试测试方

16、法 分别在三个模块中输入数据,进行一一测试。测试数据及测试报告: 图5 输入非法数据时的处理截图图6 创建及查询正确结果截图图7 创建进程时进程大小输入错误截图图8 创建进程时进程号重复提示截图 图9 撤销 图6 中创建的进程正确结果截图图10 撤销不存在的进程提示截图3、调试分析:1)显示位视图时对编辑框的操作错误。开始用初始化位视图编辑框的方法进程一次替换来更新位视图,这样会出现闪屏,要闪1024次才能更新一次,效果很不好。后来改用每个位逐个查看替换的方法,虽然消除了闪屏现象,但对每行32个数据的换行操作没有成功。最后使用把行作为一个整体,逐行替换的方法,这样消除了闪屏现象,也正确换行了,

17、执行的速度大大提高了。m_WST.SetSel(r*WordLength+r,r*WordLength+WordLength+r+1);注意在计算一行的起始地址时,要把“n”考虑到,作为一个字符。2)在OneStep()函数里,用到三重for循环结构,但忽视了内存空闲大小是否满足分配新进程所申请的内存空间,出现错误。最后在最外层for循环外加if判断结构,判断p-process_space 点击创建;查询进程信息:输入进程号点击查询;撤销正在运行的进程:输入进程号点击查询;单步随机生成进程:点击STEPRUN;自动生成进程并演示运行状态:点击AUTORUN;停止自动运行:点击STOP;复位:点

18、击RESET;本程序制作信息:点击ABOUT退出本模拟程序:点击QUIT;六、程序清单void CMyDlg:OnButtonReset() /清空所有page.Init();m_List_Page.DeleteAllItems();m_List_Pinfo.DeleteAllItems(); m_result.SetWindowText();CurrentWST();m_JCH=0;m_YS=0;UpdateData(false);void CMyDlg:OnButtonAutorun() /自动产生进程并分配内存,直到内存已满 SetTimer(1,1000,NULL);/将间隔时间设为1

19、svoid CMyDlg:OnButtonStop() /终止自动运行KillTimer(1); void CMyDlg:OnButtonBuild() /响应“创建”按钮,按用户要求添加进程并为之分配内训存int p_sp;int p_num;int i,j;int ans=1;Pros *p=0;Pros *w=0;w=new Pros;p=new Pros;int ready=0; UpdateData();if(m_YSnext;while(w!=NULL)if(w-process_num=m_JCH)MessageBox(进程号重复,请更改后重试!);ans=0;break;else

20、w=w-next;if(ans)p_sp=m_YS;p_num=m_JCH;if(p_spprocess_num=p_num;p-process_space=p_sp;for(int k=0;kprocess_space;k+)i=0;j=0;for(i=0;iWordNum;i+)for(j=0;jprocessk=i*WordLength+j;tableij=1;/记录进程在内存中的位置,修改位视图表/把节点加入线性链表的表头后面p-next=head-next;head-next=p;m_List_Pinfo.DeleteAllItems();process_show();elseMes

21、sageBox(发生越界中断,请检查输入数据的合法性!);void CMyDlg:OnButtonInquiry() /查询指定进程,显示出相关信息:进程号,所占内存空间,页表Pros *p;int p_num;p=new Pros;p=head-next;CString str;char temp_num15;char temp_sp15;UpdateData(true);p_num=m_JCH;while(p!=NULL)if(p-process_num=p_num)/将进程号,进程所占页数,首页位置显示在编辑框中,itoa(p-process_num,temp_num,10);itoa(

22、p-process_space,temp_sp,10);str=进程号:rn;str+=temp_num;str+=rn进程所占页数:rn;str+=temp_sp;m_result.SetWindowText(str);goto S;elsep=p-next;if(p=NULL)m_result.SetWindowText(没有查询到该进程的相关信息!);else/将页表显示页表列表中S:page_show(p);void CMyDlg:OnButtonRepeal() /销毁进程,即删除相关进程的节点,清空位视图表相关位置/ TODO: Add your control notificat

23、ion handler code herePros *p,*q;int n,i,j,k;int p_num;int p_sp;p=new Pros;q=new Pros;UpdateData(true);p_num=m_JCH;p=head-next ;q=head;while(p!=NULL)if(p-process_num=p_num)goto U;elsep=p-next;q=q-next;if(p=NULL)MessageBox(没有该进程,删除失败!);elseU:p_sp=p-process_space;for(k=0;kprocess_space;k+)n=p-processk;

24、i=n/WordLength;j=n%WordLength;tableij=0;Free+=p_sp;/释放内存空间q-next=p-next;delete p;/更新相关视图/先清空以前的数据m_List_Pinfo.DeleteAllItems();/清空进程信息列表m_List_Page.DeleteAllItems();/清空页表列表m_result.SetWindowText();/清空编辑框process_show();void CMyDlg:OnClickListPinfo(NMHDR* pNMHDR, LRESULT* pResult) / TODO: Add your con

25、trol notification handler code herePOSITION iPos = m_List_Pinfo.GetFirstSelectedItemPosition(); int nItem = m_List_Pinfo.GetNextSelectedItem(iPos);*pResult = 0;void CMyDlg:process_show()/显示进程信息:进程号 所占空间Pros *p1=0;p1=new Pros;p1=head-next;int i=0;char temp115;char temp215;while(p1!=NULL)itoa(p1-proce

26、ss_num,temp1,10);itoa(p1-process_space,temp2,10);m_List_Pinfo.InsertItem(i,temp1);m_List_Pinfo.SetItemText(i,1,temp2);p1=p1-next;i+; CurrentWST();/显示当前位视图void CMyDlg:OneStep()/随机生成进程并为之分配内存int i,j;int k;Pros *p=0;p=new Pros;int ready=0; srand(unsigned)time(NULL);p-process_space=rand()%50+1;/产生的进程的空间

27、大小限制在1-50页p-process_num=rand()%200;/随机产生进程号,限制在200以内while(!ready)if(p-process_space process_space;for(k=0;kprocess_space;k+)i=0;j=0;for(i=0;iWordNum;i+)for(j=0;jprocessk=WordLength*i+j;tableij=1;p-next=head-next;head-next=p;ready=1;m_List_Pinfo.DeleteAllItems();process_show();void CMyDlg:OnTimer(UIN

28、T nIDEvent) / TODO: Add your message handler code here and/or call defaultOneStep();CDialog:OnTimer(nIDEvent);void CMyDlg:InitWST()/初始化位视图,全为0CString strEdit;for(int r=0;rWordNum;r+)for(int c=0;cWordLength;c+)m_WST.GetWindowText(strEdit);m_WST.SetSel(0,-1);strEdit+=0;m_WST.ReplaceSel(strEdit);m_WST.

29、GetWindowText(strEdit);m_WST.SetSel(0,-1);strEdit+=n;m_WST.ReplaceSel(strEdit);void CMyDlg:CurrentWST()/显示当前的位视图到位视图编辑框中char bit1;CString strEdit;char wst_r135;char wst_r235;for(int r=0;rWordNum;r+)for(int c=0;cWordLength;c+)if(c=0)itoa(tablerc,bit,10);strEdit=bit;elseitoa(tablerc,bit,10);strEdit+=b

30、it;strEdit+=n;m_WST.SetSel(r*WordLength+r,r*WordLength+WordLength+r+1);/注意每行实际33个位,m_WST.GetLine(r,wst_r1);m_WST.ReplaceSel(strEdit);m_WST.GetLine(r,wst_r2);void CMyDlg:page_show(Pros *p)/显示页表信息int k,y;char yh10;char kh10;for(int g=0;gprocess_space;g+)k=p-processg;/块号y=p-processg/WordLength;/页号itoa(y,yh,10);itoa(k,kh,10);m_List_Page.InsertItem(g,yh,0);m_List_Page.SetItemText(g,1,kh);七、体会与自我评价通过这课程设计,提高了使用VC+编写成程序的能力,

温馨提示

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

评论

0/150

提交评论