模拟设计段式存储管理中地址转换.docx
- 文档编号:25097802
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:22
- 大小:535.73KB
模拟设计段式存储管理中地址转换.docx
《模拟设计段式存储管理中地址转换.docx》由会员分享,可在线阅读,更多相关《模拟设计段式存储管理中地址转换.docx(22页珍藏版)》请在冰豆网上搜索。
模拟设计段式存储管理中地址转换
学号:
课程设计
课程名称
计算机操作系统教程
设计题目
模拟设计段式存储管理中地址转换
学院
计算机科学与技术学院
专业
计算机科学与技术专业
班级
姓名
指导教师
2011
年
1
月
20
日
课程设计任务书
学生姓名:
专业班级:
计算机
指导教师:
工作单位:
计算机科学与技术学院
题目:
模拟设计段式存储管理中地址转换
初始条件:
1.预备内容:
阅读操作系统的内存管理章节内容,理解段式存储管理的思想及相应的分配主存的过程。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.实现段式存储管理中逻辑地址到物理地址的转换。
能够处理以下的情形:
指定内存的大小,进程的个数,每个进程的段数及段大小;能检查地址的合法性,如果合法进行转换,否则显示地址非法的原因。
2.设计报告内容应说明:
⑴课程设计目的与功能;
⑵需求分析,数据结构或模块说明(功能与框图);
⑶源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他的其他方法(如果有,简要说明该方法);
)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:
周1、周2:
完成程序分析及设计。
周2、周3:
完成程序调试及测试。
周4、周5:
验收、撰写课程设计报告。
(注意事项:
严禁抄袭,一旦发现,抄与被抄的一律按0分记)
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
模拟段式虚拟存储管理中
地址转换
1段式管理的功能
1.1段式管理的基本思想
把程序按内容或过程(函数)关系分成段,每段有自己的名字。
一个用户作业或进程所包含的段对应于一个二维线性虚拟空间,也就是一个二维虚拟存储器。
段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换成实际的内存物理地址。
和页式管理一样,段式管理也采用只把那些经常访问的段驻留内存,而把那些将来一段时间内不被访问的段放入外存,待需要时自动调入的方法实现二维虚拟存储器。
1.2段式存储的实现原理
1.2.1段式虚存空间
段式管理管理把一个进程的虚拟地址空间设计成二维结构,即短号s与段内相对地址w。
与页式管理时不一样的是,页式管理中,被划分的页号按顺序编号递增排列,属一维空间,而段式管理中的段号与段号之间无顺序关系。
另外,段的划分也不像页的划分那样具有相同的页长,段的长度的不固定的。
每个段定义一组逻辑上完整的程序或数据。
每个段是一个首地址为零、连续的一维线性空间。
根据需要,段长课动态增长。
对段式虚地址空间的访问包括两个部分:
段名和段内地址。
其中的段名经编译程序和链接程序编译链接后转换成机器内部可以识别的段号和段内单元号。
1.2.2段式管理的内存分配与释放
段式管理中以段为单位分配内存,每段分配一个连续的内存区。
由于各段长度不等,所以这些存储区的大小不一。
而且,同一进程所包含的各段之间不要求连续。
段式管理的内存分配与释放在作业或进程的执行过程中动态进行。
动态分配过程:
首先,段式管理为进程或作业分配部分内存,以作为该进程的工作区和放置即将执行的程序段。
随着进程的执行,进程根据需要随时申请调入新段和释放老段。
进程对内存区的申请和释放可分为两种情况:
一种是当进程要求调入某一段时,内存中有足够的空闲区满足该段的内存要求
另一种是内存中没有足够的空闲区满足该段的内存要求。
除了初始分配之外,段的动态分配是在CPU所要访问的指令和数据不在内存时产生缺段中断的情况下发生的。
因此,段的淘汰或置换算法实际上是缺段中断处理过程的一部分。
1.2.3段式管理的地址变换
(1)段表(segmentmappingtable)
和页式管理方案类似,段式管理程序在进行初始内存分配之前,首先根据用户要求的内存大小为一个作业或进程建立一个段表。
与页式管理时一样,段式管理也是通过段表来进行内存管理。
段号
始址
长度
存取方式
内外
访问位
(2)动态地址变换
一般在内存中给出一块固定的区域放置段表。
当某进程开始执行时,管理程序首先把该进程的段表始址放入段表地址寄存器。
通过访问段表寄存器,管理程序得到该进程的段表始址从而可开始访问段表。
然后,由虚地址中的段号s为索引,查段表。
若该段在内存,则判断其存取控制方式是否有错。
如果存取控制方式正确,则从段表相应表目中查出该段在内存的起始地址,并将其和段内相对地址w相加,从而得到实际内存地址。
如果该段不在内存,则产生缺段中断将CPU控制权交给内存分配程序。
内存分配程序首先检查空闲区链,以找到足够长度的空闲区来装入所需要的段。
如果内存中的可用空闲区总数小于所要求的段长时,则检查段表中访问位,以淘汰那些访问概率低的段并将需要段调入。
与页式管理时相同,段式管理时的地址变换过程也必须经过二次以上的内存访问。
首先访问段表以计算得到待访问指令或数据的物理地址。
然后才是对物理地址进行取数据或存数据操作。
为了提高访问速度,页式地址变换时使用的高速联想寄存器的方法也可以用在段式地址变换中。
如果在联想寄存器中找到了所需要的段,则可以大大加快地址变换速度。
1.2.4段的共享与保护
(1)段的共享
在多道环境下,常常有许多子程序和应用程序是被多个用户所使用的。
如果每个用户进程或作业都在内存保留它们共享程序和数据的副本,那就会极大地浪费内存空间。
最好的办法是内存中只保留一个副本,供多个用户使用,称为共享。
一段程序为多个进程共享时
(1)要求在执行过程中,该段程序的指令和数据不能被修改。
(2)在段表中设立相应的共享位来判别该段是否正被某个进程调用。
显然一个正在被某个进程使用或即将被某个进程使用的共享段是不应该调出内存的。
(2)段的保护
与页式管理时相同,段式管理的保护主要有两种:
地址越界保护法
存取方式控制保护法
2功能设计(数据结构及模块说明)
2.1存储结构说明
在此段页式存储管理系统中,我们采用以下数据结构来存储数据,存储结构用结构体和结构体数组来实现:
2.1.1段
段长
起始逻辑地址
实际起始地址
structduan
{
longcapacity;//该段的长度
longaddr;//起始逻辑地址
longrealaddr;//该段实际起始地址
};
2.1.2段表
段
进程名
调用情况
段数
该进程的总占用量
structduanbiao
{
duanduans[10];
charprocessname[20];//进程的名字
intIsdiaoyong;//是否被调用
intnum;//段的数目
longtotal;//该进程的总占用量
};
2.2程序流程图
3程序设计
3.1本程序平台
本实验使用VC++6.0平台,使用基本的控制台应用程序,单文档结构,主要数据结构是结构体间的关系。
打开VC++6.0建立一个空工程,然后简历C++源文件,根据数据结构编写代码。
3.2变量和函数说明
3.2.1变量说明
longneicun=0;//内存大小
intduanbiaonum=0;//段表的数目
longzhanyong=0;//占用的内存
longbaseaddr=0;//基地址
duanbiaoduanbiaos[10];//段表
3.2.2函数说明
voidapply();//申请进程
voidshow();//显示进程
voiddiaodu();//进程调度
voidzhuanhuan();//地址转换函数
3.2.3菜单设计
进入界面必须先对段表数据进行初始化,然后可以多次进行地址转换。
输入内存大小为200后:
4结果与运行情况分析
4.1申请进程:
4.1.1输入程序名称:
4.1.2输入进程的段数及每段大小:
4.2显示未调用的进程:
4.3调度进程:
4.4显示调用后的进程:
4.5地址转换:
4.5.1输入进程p1:
4.5.2输入段号:
4.5.3输入偏移地址(未超出范围):
4.5.4输入偏移地址(超出范围)的情况:
4.6结束:
5程序源代码:
#include
#include"stdlib.h"
#include"string.h"
#include"stdio.h"
#include
usingnamespacestd;
structduan
{
longcapacity;//该段的长度
longaddr;//起始逻辑地址
longrealaddr;//该段实际起始地址
};
structduanbiao
{
duanduans[10];
charprocessname[20];//进程的名字
intIsdiaoyong;//是否被调用
intnum;//段的数目
longtotal;//该进程的总占用量
};
longneicun=0;
intduanbiaonum=0;//段表的数目
longzhanyong=0;//占用的内存
longbaseaddr=0;
duanbiaoduanbiaos[10];
voidshow1(int);
voidshow();
voiddiaodu()
{
cout<<"您要调度的进程是:
p";
intn;
cin>>n;
if(n>duanbiaonum)
cout<<"段表不存在!
"< elseif(duanbiaos[n-1].Isdiaoyong==1) cout<<"操作错误,该进程已经被调入到内存! "< elseif(duanbiaos[n-1].total>neicun-zhanyong) cout<<"内存空间不足,调度不成功! "< else { cout<<"下面对进程"< "< for(intj=0;j { cout<<"正在进行第"< duanbiaos[n-1].duans[j].realaddr=duanbiaos[n-1].duans[j].addr+zhanyong; cout<<"第"< "< } zhanyong=zhanyong+duanbiaos[n-1].total; duanbiaos[n-1].Isdiaoyong=1; cout<<"调度后的结果是: "< show1(n-1); } } voidzhuanhuan() { intn,i,j; cout<<"请输入进程: p"; cin>>n; if(n>duanbiaonum) cout<<"进程不存在或没被调度! "< elseif(duanbiaos[n-1].Isdiaoyong==1) { cout<<"请输入段号: "< cin>>i; cout<<"输入偏移地址: "< cin>>j; if(i>duanbiaos[n-1].num) { cout<<"段号超出范围"< } elseif(j>duanbiaos[n-1].duans[i-1].capacity) { cout<<"段内偏移地址超出范围"< } else { cout<<"转换后的地址为"< cout< } } elsecout<<"该进程没有调入内存"< } voidapply() { printf("请输入进程的名字: "); cin>>duanbiaos[duanbiaonum].processname; printf("请输入该进程的段数: "); cin>>duanbiaos[duanbiaonum].num; intpaddr=0; for(intj=0;j { cout<<"进程第"< "; cin>>duanbiaos[duanbiaonum].duans[j].capacity; duanbiaos[duanbiaonum].duans[j].addr=paddr; paddr=paddr+duanbiaos[duanbiaonum].duans[j].capacity; } duanbiaos[duanbiaonum].Isdiaoyong=0; duanbiaos[duanbiaonum].total=paddr; duanbiaonum++; } voidshow1(inti) { cout<<"进程p"< "< cout<<"名字: "< cout<<"该进程所占用的存储空间: "< if(duanbiaos[i].Isdiaoyong==0) cout<<"进程状态: 未调用"< else cout<<"进程状态: 已调用"< cout<<"____________________________________________"< cout<<"段号始址内存始址大小"< for(intj=0;j { cout<<""< if(duanbiaos[i].Isdiaoyong==0) cout<<""; else cout< cout< } cout<<"____________________________________________"< } voidshow() { for(inti=0;i show1(i); } intmain(intargc,char*argv[]) { charc; cout<<"请输入内存的大小: "; cin>>neicun; cout<<"*******************************************************************************"< cout<<"1: 申请进程(a)2: 显示进程(s)3: 调度进程(d)4.地址转换(z)5: 退出(e)"< cout<<"********************************************************************************"< while (1) { cout<<"请选择服务种类(a/s/d/z/e): "; cin>>c; if(c=='e') { cout<<"服务完毕! "< break; } elseif(c=='a') apply(); elseif(c=='s') show(); elseif(c=='d') diaodu(); elseif(c=='z') zhuanhuan(); else cout<<"error! 请重新输入! "< } return0; } 6自我评价与总结: 本次系统中,主要是利用简单的数据结构和VC的简单的控制台程序,采用自己定义数据模拟段页式存储管理的方式,简单明快的是给用户一个功能菜单,然后只要不退出就可以进行各种地址转化测试而数据结构部分,采用结构体数组比较容易掌握的格式,是的查询过程简单化。 总的来说,利用简单的思想较为完整的模拟了段式存储的各个步骤。 通过这次课程设计,不仅让我了解了段式存储管理中的地址转换,更重要的还让我学会了、或者说是验证了“做事一定要有次序和对事物的总体把握”这句话。 开始我一味的进行调试,急切的想侥幸调试出来,但由于没有进行深入的考虑,我调试了很久都没没有成功,我仔细的分析题目,分析材料,在原由的基础上我进行了改正,我最后还是调试成功了,虽然还是经过了一翻努力,当然汗水还是留的很值,这次操作系统实习,不仅让我对操作系统这门课程有了更深入的研究、对很多重要的概念有了巩固和掌握,还给了我今后做事的启示。 做事要塌实,不能想着一步登天,要有计划,有目的的进行做事。 盲目真的不应该再在我们新一代的大学生身上出现了,我们应该认真找到自己的缺点并且及时改正。 通过努力,三个周期性实时任务的最短松弛度优先调度算法程序都已经完成,我开始调试,居然一边就成功了,我开始不感相信,我找来沈老师来帮我看了一下做好的设计,结果真是另人开心。 此时此刻,我心里多了些成就感。 在这里,我如果不说感谢的话,不知道要说些什么好;首先感谢学校和父母,然后更重要的是感谢沈老师的教导。 “活到老,学到老”,这也是我整个学习过程中的一次经验、一次总结,我相信它肯定会给我今后的学习有所启示和指导作用。 本科生课程设计成绩评定表 班级: 计算机 姓名 学号: 序号 评分项目 满分 实得分 1 学习态度认真、遵守纪律 10 2 设计分析合理性 10 3 设计方案正确性、可行性、创造性 20 4 设计结果正确性 40 5 设计报告的规范性 10 6 设计验收 10 总得分/等级 评语: 注: 最终成绩以五级分制记。 优(90-100分)、良(80-89分)、中(70-79分)、 及格(60-69分)、60分以下为不及格
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 设计 段式 存储 管理 地址 转换