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