模拟设计动态分区存储管理中地址转换Word文档下载推荐.docx
- 文档编号:6748919
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:16
- 大小:400.15KB
模拟设计动态分区存储管理中地址转换Word文档下载推荐.docx
《模拟设计动态分区存储管理中地址转换Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《模拟设计动态分区存储管理中地址转换Word文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他的其他方法(如果有,简要说明该方法);
)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:
周1、周2:
完成程序分析及设计。
周2、周3:
完成程序调试及测试。
周4、周5:
验收、撰写课程设计报告。
(注意事项:
严禁抄袭,一旦发现,抄与被抄的一律按0分记)
指导教师签名:
年月日
系主任(或责任教师)签名:
一设计目的
(1)巩固及深入了解操作系统的基本概念与功能;
(2)理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源;
(3)深入了解动态分区存储管理方式的内存分配以及地址转换的实现;
(4)运用所学知识,实现最先适应法动态分区,实现对内存的保护、分配以及回收;
(5)进一步理解在计算机系统上运行的其它各类操作系统,并懂得在操作系统的支持下建立自己的应用系统。
二问题描述
要求首先采用动态分区方案,用最先适用算法对作业实施内存分配,然后把作业地址空间的某一逻辑地址转换成相应的物理地址。
如果不能计算出相应的物理地址,并说明原因。
三功能描述及分析
存储器是计算机系统的重要资源之一。
因为任何程序和数据以及各种控制用的数据结构都必须占用一定的存储空间,因此,存储管理直接影响系统性能。
存储器由内存(primarystorage)和外存(secondarystorage)组成。
内存由顺序编址的块组成,每块包含相应的物理单元。
内存的特点:
CPU能直接访问的存储器;
用来存放系统和用户的程序和数据,其特点是存取速度快,存储方式是以新换旧,断电信息丢失。
本设计要求模拟内存的动态分区管理。
系统对内存的管理和控制通过数据结构——分区说明表进行,分区说明表说明各分区号、分区大小、起始地址和是否是空闲区(分区状态)。
内存的分配释放、存储保护以及地址变换等都通过分区说明表进行。
并且把程序中的相对地址(或逻辑地址)转换为内存中的绝对地址(物理地址)。
四关键技术与方法
4.1动态分区分配
所谓存储分配,主要是讨论和解决共享主存空间的问题:
When,How,What(全部/部分信息分配在主存中)。
存储分配有三种方式:
直接分配、静态分配和动态分配。
下面具体介绍动态分配的内容。
4.1.1动态分区基本思想
在作业执行前并不直接建立分区,分区的建立是在作业的处理过程中进行的。
且其大小可随作业或进程对内存的要求而改变,从而内存的利用率得到提高。
在系统初启时,除了操作系统中常驻内存部分之外,只有一个空闲分区。
随后,分配程序将该区依次划分给调度选种的作业或进程。
图
(2)给出了FIFO调度方式时的内存初始分配情况。
随着进程的执行,会出现一系列的分配和释放。
比如在某一时刻,一进程执行结束并释放内存之后,管理程序又要为另两个进程分配内存。
如果分配的空闲区比所要求的大,则管理程序将该空闲区分为两个部分,其中一部分成为已分配区而另一部分成为一个新的小空闲区。
图(3)举例给出了最先优先适应算法(firstfit)内存分配的过程。
4.1.2分区分配中的数据结构
为了实现分区分配,系统中必须配置相应的数据结构,用来描述空闲分区和已分配分区的情况,为分配提供依据。
常用的数据结构有以下三种形式:
(a)空闲分区表:
在系统中设置一张空闲分区表,用于记录每个空闲分区的情况。
每个空闲分区占一个表目,表目中包括分区序号、分区始址及分区的大小等数据项。
(b)空闲分区链:
为了实现对空闲分区的分配和链接,在每个分区的起始部分,设置一些用于控制分区分配的信息,以及用于链接各分区所用的前向指针;
在分区尾部则设置一后向指针,通过前、后向链接指针,可将所有的空闲分区链接成一个双向链。
为了检索方便,在分区尾部重复设置状态位和分区大小表目。
当分区被分配出去以后,把状态位由“0”改为“1”,此时,前、后向指针已无意义。
(c)请求表:
描述请求内存资源的作业或进程号及所请求的内存大小。
4.1.3动态分区分配算法
动态分区分配算法的关键:
从空白区中寻找空闲空间是关键。
寻找空白区方法的不同:
分区分配是对可用表(或自由链)数据结构进行操作,空闲区表的组织有两种方法:
按空闲区大小的升序(降序)组织;
按空闲区首址升序组织。
动态分区时分配方法从可用表或自由链中寻找空闲区的常用方法有三种,分别是:
最先适应算法(firstfit)、最佳适应算法(bestfit)和最坏适应算法(worstfit)。
此处主要介绍最先适应算法。
最先适应算法FF算法要求空闲分区链以地址递增的次序链接。
在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;
然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。
若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。
该算法倾向于优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲区。
这给为以后到达的大作业分配大的内存空间创造了条件。
其缺点是低址部分不断被划分,会留下许多难以利用的、很小的空闲分区,而每次查找又都是从低址部分开始,这无疑会增加查找可用空闲分区时的开销。
4.1.4内存的回收
当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链(表)中找到相应的插入点,此时可能出现以下四种情况之一:
(1)该空闲区的上下两相邻分区都是空闲区:
将三个空闲区合并为一个空闲区。
新空闲区的起始地址为上空闲区的起始地址,大小为三个空闲区之和。
空闲区合并后,取消可用表或自由链中下空闲区的表目项或链指针,修改上空闲区的对应项。
(2)该空闲区的上相邻区是空闲区:
将释放区与上空闲区合并为一个空闲区,其起始地址为上空闲区的起始地址,大小为上空闲区与释放区之和。
合并后,修改上空闲区对应的可用表的表目项或自由链指针
(3)该空闲区的下相邻区是空闲区:
将释放区与下空闲区合并,并将释放区的起始地址作为合并区的起始地址。
合并区的长度为释放区与下空闲区之和。
同理,合并后修改可用表或自由链中相应的表目项或链指针。
(4)两相邻区都不是空闲区:
释放区作为一个新空闲可用区插入可用表或自由链。
4.2内存地址转换
4.2.1逻辑地址
逻辑地址又称为相对地址或者虚地址:
用户的程序经过汇编或编译后形成目标代码,目标代码通常采用相对地址的形式。
其首地址为0,其余指令中的地址都相对于首地址来编址。
不能用逻辑地址在内存中读取信息。
4.2.2物理地址
物理地址又称为绝对地址或者实地址:
内存中存储单元的地址。
把内存分成若干个大小相等的存储单元,每个单元占8位,即1字节(byte)。
每个存储单元给一个编号。
物理地址可直接寻址。
4.2.3地址映射
将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。
当程序装入内存时,操作系统为该程序分配一个内存空间,由于程序的逻辑地址与分配到的内存物理地址不一致,而CPU执行指令时,是按物理地址进行的,所以需要进行地址转换。
计算公式:
物理地址=逻辑地址+装入内存的首地址
5.1需求分析
本次课程设计编程使用的是MFC,用户可以将进程分配至内存之中,内存的分配采用的是最先适应法。
输入模拟的实际进程数目之后,系统随机产生进程的起始地址和申请空间的大小,输入要访问的进程号以及所要访问的逻辑地址,判断其是否超过进程大小。
如果超过,则说明输入越界,反之进行物理地址计算。
5.2数据结构
structtable{//已分配的或未分配的
intstart;
//进程起始地址
intlength;
//进程大小
inthao;
//进程号
table*next;
};
5.3主要算法框图
5.3.1最先适应法设计框图
5.3.2地址转换程序框图
否
六源程序的主要部分(伪代码)
#include<
iostream.h>
#include<
ctime>
cstdlib>
windows.h>
#defineN5//最大进程数
#definemax20//每个进程的最大容量
#definememory100//整个内存大小
intn;
//实际的进程数
table*head;
//head
voidfenpei(inta)
{
intsum=0;
table*p1,*p2;
p1=p2=newtable;
p1->
start=1;
hao=1;
srand(time(0));
//seed
Sleep(1000);
length=rand()%max+1;
//randomnumber1-20
next=NULL;
cout<
<
p1->
start<
"
"
length<
endl;
sum=p1->
length+sum;
for(intm=2;
m<
=a;
m++)
{
if(head==NULL)head=p1;
elsep2->
next=p1;
p2=p1;
p1=newtable;
start=sum+1;
hao=m;
Sleep(800);
}
p2->
-------------------------------------"
sum+1<
100-sum<
}
voidpanduan(intb,intc)
intma;
for(table*t=head;
t->
hao!
=b;
t=t->
next){}
if(c<
0)cout<
逻辑地址输入错误!
if(c>
length)cout<
VR越界!
else
ma=t->
start+c;
物理地址为:
ma<
}
intmain()
inti,j;
请输入实际进程数(1~5):
;
cin>
>
n;
if(n<
1||n>
5)return0;
各进程的起始地址和申请的空间大小为:
fenpei(n);
do
请输入要访问的进程号(1~5):
i;
if(i<
1||i>
n)return0;
请输入要访问的逻辑地址:
j;
panduan(i,j);
}while(i!
=0);
return0;
七测试用例、运行结果与运行情况分析
编译运行后,得到如下界面:
输入实际进程数假定为5:
假定访问进程3,则输入3:
假定要访问的逻辑地址是5,则输入5:
由于逻辑地址5已经超过申请的最大空间3,所以越界
重新访问进程3,逻辑地址改为2:
八自我评价与总结
本次操作系统课程设计的题目是模拟设计动态分区存储管理中地址转换。
设计要求我用最先适用算法对作业实施内存分配,然后把作业地址空间的某一逻辑地址转换成相应的物理地址。
这个设计题目的难度相对来说不是很大,通过复习课本和查阅其他资料,基本的设计方向非常明确。
通过这几天程序及报告编写,我发现了自己的很多问题,知识上有很多漏洞,实践经验比较缺乏,理论联系实际的能力还是比较薄弱。
期间遇到了很多以前没有想到的难点,经过同学之间的相互讨论,解决了许多问题。
通过此次实验,给我最大的体会是:
做实验一定要细心,必须亲自动手实践;
这样才能更好的体会实验的要领、原理。
也让我深深的体会到了,自己本身知识的不扎实,以前上课一些东西都没有很好的掌握,通过动手实践及和同学的讨论当中使我更一步熟悉了内存中地址的转换、内存分配等等相关的一些基本知识以及与此次实验所连接到有关编成的一些知识等等。
本次实验有很多方法可以实现,但是由于时间的限制都无法得到拓展,设计题目应该加上对内存的回收这一块,这样题目才会更加清晰明了,目的性更明确一些。
路漫漫其修远兮,虽然本学期操作系统的课程结束了,但仍觉得自己还有很多东西要学,我会在自己在以后的学习生活中不断努力、不断提高,争取更大的进步。
九参考文献
张尧学《计算机操作系统教程(第三版)》清华大学出版社
吴国伟《操作系统实验教程》大连理工大学出版社
闵联营何克右《C++程序设计教程》武汉理工大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 设计 动态 分区 存储 管理 地址 转换