操作系统段表课程设计说明书_第1页
操作系统段表课程设计说明书_第2页
操作系统段表课程设计说明书_第3页
操作系统段表课程设计说明书_第4页
操作系统段表课程设计说明书_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、武汉理工大学操作系统课程设计说明书课程设计任务书学生姓名: 朱东各 专业班级: 计算机0604 指导教师: 蔡 菁 工作单位: 计算机科学与技术学院 题 目: 模拟设计段页式虚拟存储管理中地址转换初始条件:1预备内容:阅读操作系统的内存管理章节内容,理解段页式存储管理的思想及相应的分配主存的过程。2实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1实现段页式存储管理中逻辑地址到物理地址的转换。能够处理以下的情形: 能指定内存的大小,内存块的大小,进程的个数,每个进程的段数及段内页的个数; 能检查地址的合法性,如果合法进行

2、转换,否则显示地址非法的原因。2设计报告内容应说明: 需求分析; 功能设计(数据结构及模块说明); 开发平台及源程序的主要部分; 测试用例,运行结果与运行情况分析; 自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。时间安排:设计安排一周:周1、周2:完成程序分析及设计。周2、周3:完成程序调试及测试。周4、周5:验收、撰写课程设计报告。(注意事项:严禁抄袭,一旦发现

3、,一律按0分记)指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日模拟段页式虚拟存储管理中 地址转换1需求分析1.1段页式管理的基本思想1.1.1基本思想段式和页式存储管理各有优缺点,段页式存储管理系统,用分段的方法来分配和管理虚拟存储器,而用分页的方法来分配和管理主存。既有段式系统便于实现段的共享,段的保护,动态链接和段的动态增长等一系列优点,又能像页式系统那样,很好地解决内存的外碎片问题。具体来说,把整个内存分成大小相等内存块,内存块从0开始依次编号。把用户程序分成若干段,每段有个段名。页面的大小和内存块相同,每段的各个页面都分别从0开始依次编号。虚空间的最小单位是页而不是段

4、,内存就被分为若干个页,且每段所拥有的程序和数据在内存中可以分开存放,分段大小也不再受内存可用区的限制。1.2段页式存储的原理1.2.1虚地址的构成逻辑地址有三部分构成:V=(S,P,d)即段号s,页号p和页内相对地址d,如下所示:spd内存分配:以块为单位进行内存分配,为了实现从逻辑地址到物理地址的转换,为每个作业或进程建立一张段表:段表中的段长即是页表长度,段表中的段内始址即是页表地址,每个段拥有一张页表,段内的页号映射为物理地址中的物理块号。1.2.2段表和页表的构成 在段页式存储管理系统中,段表包含这样几个基本项:段号,状态,该段的页表长度,页表始址;页表包含的基本项是:页号,状态,块

5、号。段页式管理中段表,页表以及内存的关系如下图:1.2.3 动态地址变换过程在段页式存储管理系统中,要对内存中的指令或数据进行一次存取操作至少需要访问3次内存。第一次是由段表寄存器得到段表始址去访问段表,然后取出对应段的页表地址。第二次则是访问页表得到所要访问的物理地址。只有在访问了段表和页表之后,第三次才能访问真正要访问的物理单元。段页式存储管理系统地址变换如下所示:2 功能设计(数据结构及模块说明)2.1 存储结构说明在此段页式存储管理系统中,我们采用以下数据结构来存储数据,存储结构用结构体和结构体数组来实现:2.1.1段表段号s状态flag页表长度plen页表始址psta/段表typed

6、ef struct Stackint num;/段号int flag;/段状态int plen;/页表长度int psta;/页表始址Stack;其中状态为1代表在内存,为0代表不在内存。2.1.2 页表页号pnum状态位(是否在内存中)块号block/页表typedef struct Pageint num;/页号int flag;/页状态,即是否在内存。int block;/该页对应的块号Page;2.1.3 数据区块号block作业内容 简单起见,我们没有把内容初始化到每一个内存地址,只给出每个作业块的内容,并且用一串字符代替。typedef struct Dataint num;/内存

7、的块数string str;/对应数据块的作业内容,简化起见说明内容为一串字符。Data;2.1.4 快表段号段内页号块号/快表typedef struct Quickint qs;/快表段号int qp;/快表页号int qb;/快表段号Quick;2.1.5 段表寄存器段表始址段表长度/段表寄存器typedef struct Stareint ssta;/段表始址int slen;/段表长度Stare;2.2程序流程图3 程序设计3.1 本程序平台本实验使用VC+ 6.0平台,使用基本的控制台应用程序,单文档结构,主要数据结构是结构体间的关系。打开VC+6.0建立一个空工程,然后简历C+源

8、文件,根据数据结构编写代码。3.2变量和函数说明3.2.1 变量说明 Stack ss10;/全局变量,用来存放所有进程的段,数组下标就是段号。 Stare st;/全局变量,用来存放段表寄存器表。 Data work20;/全局变量,主存每一块的内容,下标是块号。Quick qu;/全局变量,存放快表。Page page55;/存放每个块对应的页表。bool menuflag=0;/菜单函数标志位,首次使用初始化表。int bbs;/内存块大小int bs;/内存大小3.2.2函数说明void menu();/为用户提供菜单,详情见第四部分截图。void start();/初始化表项。详情见

9、第四部分截图。函数实现部分见附录。void change();/地址转换函数。详情见第四部分截图。函数实现部分见附录。3.2.3 菜单设计进入界面必须先对段表数据进行初始化,然后可以多次进行地址转换。4 结果与运行情况分析运行程序,测试程序运行情况:本次程序设计中,进入界面必须先对段表数据进行初始化,然后可以多次进行地址转换,其中会出现段页越界,缺(段)页。其中有一点和实际并不相同:由于C+里面单限制,不能实现快表和段表的同时查询,故模拟时采用先查询快表然后再查询段表的模式,另外,为每一段创建的页表,直接有页表二维数组组成,第一纬代表段号,第二维代表段内页号。 整体数据和用例见下图:4.1 段

10、表初始化按照上图,进入程序后进行段表初始化4.2 段号越界中断测试从上图中可以看到段号只有5个,0-4,所以越界中断。逻辑地址不合法。4.3 缺段中断测试第二段不在内存,逻辑地址无法转化,需要把该段调入主存。4.4 缺页中断测试第三段第0页不在内存,逻辑地址无法转化,需要调入页面。4.5 页表越界测试第三段没有第五页,页表越界,访问非法。4.6 在段表中成功访问数据测试成功测试数据,第四段第0页对应块号为10,故物理地址是10*1024+500=10740第十块作业数据是:k5 自我评价与总结本次系统中,主要是利用简单的数据结构和VC的简单的控制台程序,采用自己定义数据模拟段页式存储管理的方式

11、,简单明快的是给用户一个功能菜单,进入菜单必须进行段表数据初始化,然后只要不退出就可以进行各种地址转化测试,也可以重新初始化段表。而数据结构部分,采用结构体数组比较容易掌握的格式,是的查询过程简单化。总的来说,利用简单的思想较为完整的模拟了段页式存储的各个步骤,甚至把快表也考虑了进去。对于各种非法访问非常直观的指出非法原因。为了体现数据访问的真实性,我还简单的为内存中每一个作业快初始化了作业数据,找到物理块号后可以直接读出块的作业内容。体现的本程序的根本目的。当然,程序也有很多不足,例如可以考虑采用MFC窗口应用程序,结合C+自带的内部模板函数MAP函数,这样也可以较好的模拟段页式系统,本程序

12、中对于段表的初始化过于繁琐,可以采取文本数据库的形式,利用读取TXT的方式给段表链表结构进行初始化,会增加程序的可视性,和简便性。本次实验中,总体还算比较顺利,但是测试过程中还是出现了一些问题,主要是对段页式存储的理解不够深入照成的,每一个段都有一个页表,而这些段和自己的页表是要靠段表里的页表始址定位的,这个在程序中没有完整的表现出来,另外第一次程序中没有考虑页表越界中断,这是没有完整的把握模拟系统中的各个环节造成的,为此要以自己写好的程序流程图为基础,考虑到每一步分支程序,尽量用简单的方式把系统的各种功能模拟出来。上图就是错把3 5 521当成缺页中断,应该是页表越界,这个在第四部分已经改正

13、。 当然,完成本题还有其他的方式,可以借用VC的内置数据结构和模板,可以使用结构体指针来存取段表,可以吧段表存到文本文件里,这些都是可行的。 通过本次课程设计,加深了自己对书本知识的理解,通过亲自把模拟系统做成数据结构,更加直观真切的体会到段页式存储的基本思想,当然同时也对其他的存储知识加深了理解,同时锻炼了自己把所学知识应用的实际视图里面的能力,做到学以致用,对计算机硬件里面的微观世界有了进一步的剖析。7附录完整的程序代码:#include<iostream>#include<string>using namespace std;/数据结构/快表typedef str

14、uct Quickint qs;/快表段号int qp;/快表页号int qb;/快表段号Quick;/数据区,简单起见,只为每一个内储块写入内容,不具体到每一物理地址。typedef struct Dataint num;/内存的块数string str;/对应数据块的作业内容,简化起见说明内容为一串字符。Data;/页表typedef struct Pageint num;/页号int flag;/页状态,即是否在内存。int block;/该页对应的块号Page;/段表typedef struct Stackint num;/段号int flag;/段状态int plen;/页表长度in

15、t psta;/页表始址Stack;/段表寄存器typedef struct Stareint ssta;/段表始址int slen;/段表长度Stare;Stack ss10;/全局变量 Stare st;/全局变量 Data work20;/全局变量Quick qu;/全局变量Page page55;bool menuflag=0;int bbs;/内存块大小int bs;/内存大小void menu();void start();void change();int main()menu();return 0;void menu() cout<<"*请选择*"

16、;<<endl;cout<<endl;cout<<"* 1、初始化表 *"<<endl;cout<<"* 2、物理地址转换 *"<<endl;cout<<"* 3、退出 *"<<endl;int menu1;cin>>menu1;if(menu1!=1&&menu1!=2&&menu1!=3)cout<<"请输入正确的选项"<<endl;menu();s

17、witch(menu1)case 1: menuflag=1; start(); break;case 2:if(menuflag=0) cout<<"请初始化表"<<endl;menu();change();break;case 3:return;/switch void start() cout<<"请输入内存大小(K)"<<endl; cin>>bs; cout<<"请输入内存块的大小(k)"<<endl; cin>>bbs; int

18、 blocknum; blocknum=bs/bbs; cout<<"内存一共被分为"<<blocknum<<"块,每块"<<bbs<<"k"<<"一共"<<bs<<"k"<<endl; cout<<"请输入进程个数"<<endl; int pn;cin>>pn; /下面求所有进程的总段数和段表,并为每段创建页表 int sums=0

19、; for (int pn1=0;pn1<pn;pn1+) cout<<"请输入第"<<pn1<<"个进程的段数"<<endl; int ppn;cin>>ppn; sums+=ppn; for(int ss1=0;ss1<sums;ss1+) cout<<"请输入第"<<ss1<<"个段表数据:段号,状态,页表长度,页表始址"<<endl; cin>>ssss1.num>>

20、;ssss1.flag>>ssss1.plen>>ssss1.psta; cout<<"请初始化第"<<ss1<<"段的页表,输入两个数据页表状态和对应块号"<<endl; for(int sss1=0;sss1<ssss1.plen;sss1+) pagess1sss1.num=sss1; cout<<"请输入该段第"<<sss1<<"个页表的页表状态和对应块号"<<endl; cin&g

21、t;>pagess1sss1.flag>>pagess1sss1.block; /初始化段表寄存器 cout<<"初始化段表寄存器的段表始址"<<endl; cin>>st.ssta; st.slen=sums; /初始化内存中物理地址每一块的数据区 cout<<"简单起见,我们对物理地址的每一块用字符串进行简单的初始化,没有具体到每一物理地址"<<endl; for (int bn=0;bn<blocknum;bn+) workbn.num=bn; cout<&l

22、t;"请输入第"<<bn<<"个内存块里的作业内容"<<endl; cin>>workbn.str; /初始化快表cout<<"简单起见,我们初始化快表只有一个"<<endl;cout<<"请输入要作为快表的段号和页号"<<endl;cin>>qu.qb>>qu.qp;while(ssqu.qb.flag!=1|pagequ.qbqu.qp.flag!=1)cout<<"该页

23、不在内存请输入一页在内存中的作为快表,请输入要作为快表的段号和页号"<<endl; cin>>qu.qb>>qu.qp;qu.qs=pagequ.qbqu.qp.block;menu();void change() cout<<"请输入要转化的逻辑地址,段号s,段内页号p,页内偏移地址d(B)"<<endl; int snum,pnum,dnum; cin>>snum>>pnum>>dnum; /首先查快表 if(snum=qu.qb&&pnum=qu.

24、qp) cout<<"快表命中"<<"对应块号是"<<qu.qs<<endl; cout<<"该块中作业数据是"<<workpagequ.qbqu.qp.block.str<<endl; cout<<"物理地址是"<<qu.qs*bbs*1024+dnum<<endl; menu(); /访问段表寄存器 else cout<<"快表没有命中,访问段表寄存器,段号等于段表始址加上偏移地址"<<endl; int ssnum; ss

温馨提示

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

评论

0/150

提交评论