学号:课程设计题目模拟设计段式存储管理中地址转换学院计算机科学与技术学院专业班级姓名指导教师吴利军2013年1月15日课程设计任务书学生姓名:指导教师:吴利军工作单位:计算机科学与技术学院题目:模拟设计段式存储管理中地址转换初始条件:1.预备内容:阅读操作系统的内存管理章节内容,理解段式存储管理的思想及相应的分配主存的过程。2.实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.实现段式存储管理中逻辑地址到物理地址的转换。能够处理以下的情形:指定内存的大小,进程的个数,每个进程的段数及段大小;能检查地址的合法性,如果合法进行转换,否则显示地址非法的原因。2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。周2、周3:完成程序调试及测试。周4、周5:验收、撰写课程设计报告。(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日模拟设计段式存储管理中地址转换1.需求分析;内存的存储管理有两种主要的方法:连续分配存储管理和离散分配管理,离散分配方式又分为:分页式存储管理、分段式存储管理和段叶式存储管理。离散分配方式很好的解决了碎片问题。1.1分段式存储管理的优点:1.方便编程:按逻辑关系分为若干个段,每个段从0编址,并有名字和长度,访问的逻辑地2.址由段名和段内偏移量决定。3.信息共享:共享是以信息为逻辑单位,页是存储信息的物理单位,段却是信息的逻辑单位。4.信息保护:保护也是信息为逻辑单位。4.动态链接:动态链接以段为单位。5.动态增长:实际应用中,某些段(数据段)会不断增长,前面的存储管理方法均难以实现。1.2分段系统的基本原理---段表a段式管理把二维虚拟地址空间设计成段号S与段内相对地址W。b段式虚拟地址空间包括:段号S:段内地址Wc每个段定义一组逻辑上完整的程序或数据d段号之间无顺序关系,段长不固定(根据需要,段长可动态增长)e段表的基址及长度由段表寄存器给出访问一个字节的数据/指令需访问内存2次(段表一次,内存一次),f逻辑地址:段号段内地址与页式管理时相同,段式管理时的地址变换过程也必须经过二次以上的内存访问。首先访问段表以计算得到待访问指令或数据的物理地址。然后才是对物理地址进行取数据或存数据操作。为了提高访问速度,页式地址变换时使用的高速联想寄存器的方法也可以用在段式地址变换中。如果在联想寄存器中找到了所需要的段,则可以大大加快地址变换速度。2.功能设计(数据结构及模块说明);2.1数据结构:内存用一个数组表示intp[30];//程序物理内存的大小其中数组的一个单元表示1KB的内存大小,这样来模拟内存的存储空间。每个进程对应一个段表,为了实现多进程的存储的段式管理,自定义了一个结构体duan,该结构体包含的字段有:进程号,段号,段长,基址,其程序定义为structduan{intnumber;//段号intlength;//段长intbase;//该段在物理内存的基址intPID;//该段所属进程号};2.2此系统流程图以及三个功能:进入系统1-建立段表2-地址转换3-退出系统输入退出输入进程号,段号,段内位移判断是否合法否是输出对应物理地址退出系统,结束建立对应段表输出对应段表输入1输入2输入3选择1.建立段表;2.地址映射;3退出。现对三个模块的功能以及实现说明一下。1.建立段表刚建立段表菜单,让其选择1-输入;2-退出,因为一个进程可以有很多段,所以在这里用菜单的形式让其选择,当输入一个段号和段长后,就将该段映射到物理内存中了,并加入了段表。当选择退出后就相当于指定了该进程的所有段以及段长,然后打印出来。2.地址映射用户需输入逻辑段的进程号、段号和段内位移,系统先根据输入的进程号判断该进程是否是已经建立了段表的进程,然后检查段号是否是合法段,如果不合法系统则提示该段是非法段。最后根据段表的位移长度判断给定的位移长度是否是合法的,如果不合法给出提示;如果合法则根据段表直接给出其物理地址。3.退出用户选择退出操作,则释放内存空间,退出系统。3.开发平台及源程序的主要部分;此次开发采用的是visualstudio2010,用的是C++语言,因为其面向对象和其良好的继承多态,以及强大的类库,所以选择了C++。3.1源程序//duanManagement.cpp:定义控制台应用程序的入口点。//#includeiostreamusingnamespacestd;structduan{intnumber;//段号intlength;//段长intbase;//该段在物理内存的基址intPID;//该段所属进程号};intp[30];//程序物理内存的大小duand[10];//保存段表intnowbase=0;//保存当前内存的地址intPid=1001;//当前进程ID号intsize=0;//已分配空间的大小duancreateDuanTable(intnumber,intlength,intPID,intbase)//生成段表函数{duand1;d1.PID=-1;d1.number=-1;d1.length=0;d1.base=0;for(inti=0;i30;i++){if(d[i].PID==PID&&(d[i].number==number)){cout输入错误:同一进程的逻辑段号不可以重复endl;returnd1;}}if(30-sizelength){cout当前内存小于该段需要的空间,段表无法加入该段endl;returnd1;}d1.PID=PID;d1.number=number;d1.length=length;d1.base=base;nowbase=nowbase+length;size=size+length;cout段表成功加入该段endl;cout请注意:内存当前剩余空间30-sizeKBendl;returnd1;}intchange(intPID,intnumber,ints,duand[10])//地址转换函数{for(intj=0;j10;j++){if(d[j].PID==PID)break;if(j=9)return-1;//代表该进程号是非法的}for(intk=0;k10;k++){if((d[k].PID==PID)&&(d[k].number==number))break;if(k=9)return-2;}for(inti=0;i10;i++){if((d[i].PID==PID)&&(d[i].number==number)&&(s=d[i].length)){returnd[i].base+s;}elseif((d[i].PID==PID)&&(d[i].number==number)){if(d[i].lengths)return0;//代表超过段长}}}intmain()//intargc,char*argv[]{intinput1=0;intinput2;boolflag1=true;boolflag2=true;intnumber;intlength;intPID;ints1=0;duandin;intresualt;cout**********欢迎进入模拟设计段式存储管理中地址转换系统***********endl;cout***************************************************************endl;cout系统提示:指定内存为40KB,段表占用内存10KB,程序占有内存为30KBendl;cout***************************************************************endl;while(flag1){cout请选择操作:1-建立段表,2-地址转换,3-退出endl;cininput1;switch(input1){case1:{while(flag2){cout请选择建立段表的操作:1-输入,2-退出endl;cininput2;switch(input2){case1:cout请输入段号endl;cinnumber;cout请输入第number段的段长endl;cinlength;PID=Pid;din=createDuanTable(number,length,PID,nowbase);if(din.number!=-1){d[s1]=din;s1++;}break;case2:flag2=false;break;default:cout输入错误,请重新输入endl;break;}}cout进程号段号段长内存基址endl;for(inti=0;is1;i++){coutd[i].PIDd[i].numberd[i].lengthd[i].baseendl;}Pid++;flag2=true;break;}case2:cout请输入需要转换的进程号endl;cinPID;cout输入段号endl;cinnumber;cout请输入第number段的段内位移endl;cinlength;resualt=change(PID,number,length,d);if(resualt0)cout该段的逻辑地址对应的物理地址为:change(PID,number,length,d)endl;elseif(resualt==-2)cout进程号为PID的进程没有第number段,该段是非法段endl;elseif(resualt==0)cout该段的段内位移超过了其段长,该段是非法段endl;elseif(resualt==-1)cout段表内没有此进程endl;break;case3:flag1=false;break;default:cout输入错误,请重新输入endl;}}system(pause);return0;}4.测试用例,运行结果与运行情况分析;4.1测试用例进程号段号段长内存基址10011401001264100137101002111710021218100323204.2运行结果:系统登录界面选择1—建立段表的功能输入段号和段长打印进程1001的段表打印多个进程的段表地址转换进程错误报错地址转换段长越界报错地址转换正常输出其物理地址进程的段号非法错误选择3—退出操作5.自我评价与总结:此次的课程设计主要在三个方面实现了突破,第一实现了内存空间的多个进程段表的设定,第二实现了内存的实时剩余空间的提醒,第三地址转换时对非法进程,非法段号,非法段长都进行了检查,而且系统会进行相应的提示。当然此系统也存在一定的不足比如说内存是用的一维数组来模拟的,一个单元代表内存的1KB的大小,因为C++里不支持动态数组,因此我的系统每次都是指定好的内存大小,如果需要修改则需要在程序里面指定,造成了一点小不方便。我想如果可以的话可以用链表来解决动态指定内存大小的问题,这样就很方便解决。而且是这个系统的欢迎界面也是设计的很合理的,用户进入系统界面之后可以根据菜单进行相应的菜单选择功能,不同的输入会提示相应的操作,从而进行相应的处理功能