一实验目的Word下载.docx
- 文档编号:14843932
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:31
- 大小:453.73KB
一实验目的Word下载.docx
《一实验目的Word下载.docx》由会员分享,可在线阅读,更多相关《一实验目的Word下载.docx(31页珍藏版)》请在冰豆网上搜索。
VC++6.0
四、实验原理及设计分析
某系统采用可变分区存储管理.在系统运行当然开始.假设初始状态下.可用的内存空间为640KB.存储器区被分为操作系统分区(40KB)和可给用户的空间区(600KB)。
(作业1申请130KB、作业2申请60KB、作业3申请100KB、作业2释放60KB、
作业4申请200KB、作业3释放100KB、作业1释放130KB、作业5申请140KB、
作业6申请60KB、作业7申请50KB)
当作业1进入内存后.分给作业1(130KB).随着作业1、2、3的进入.分别分配60KB、100KB.经过一段时间的运行后.作业2运行完毕.释放所占内存。
此时.作业4进入系统.要求分配200KB内存。
作业3、1运行完毕.释放所占内存。
此时又有作业5申请140KB.作业6申请60KB.作业7申请50KB。
为它们进行主存分配和回收。
1、采用可变分区存储管理.使用空闲分区链实现主存分配和回收。
空闲分区链:
使用链指针把所有的空闲分区链成一条链.为了实现对空闲分区的分配和链接.在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针.由状态位指示该分区是否分配出去了;
同时.在分区尾部还设置有一后向指针.用来链接后面的分区;
分区中间部分是用来存放作业的空闲内存空间.当该分区分配出去后.状态位就由“0”置为“1”。
设置一个内存空闲分区链.内存空间分区通过空闲分区链来管理.在进行内存分配时.系统优先使用空闲低端的空间。
设计一个空闲分区说明链.设计一个某时刻主存空间占用情况表.作为主存当前使用基础。
初始化空间区和已分配区说明链的值.设计作业申请队列以及作业完成后释放顺序.实现主存的分配和回收。
要求每次分配和回收后显示出空闲内存分区链的情况。
把空闲区说明链的变化情况以及各作业的申请、释放情况显示打印出来。
2.采用可变分区存储管理.分别采用首次适应算法、最佳适应算法和最坏适应算法实现主存分配和回收。
3、主存空间分配
(1)首次适应算法
在该算法中.把主存中所有空闲区按其起始地址递增的次序排列。
在为作业分配存储空间时.从上次找到的空闲分区的下一个空闲分区开始查找.直到找到第一个能满足要求的空闲区.从中划出与请求的大小相等的存储空间分配给作业.余下的空闲区仍留在空闲区链中。
(2)最佳适应算法
在为作业分配存储空间时.从上次找到的空闲分区的下一个空闲分区开始查找.直到找到一个能满足要求的空闲区且该空闲区的大小比其他满足要求的空闲区都小.从中划出与请求的大小相等的存储空间分配给作业.余下的空闲区仍留在空闲区链中
(3)最坏适应算法
在为作业分配存储空间时.从上次找到的空闲分区的下一个空闲分区开始查找.直到找到一个能满足要求的空闲区且该空闲区的大小比其他满足要求的空闲区都大.从中划出与请求的大小相等的存储空间分配给作业.余下的空闲区仍留在空闲区链中。
4、主存空间回收
当一个作业执行完成撤离时.作业所占的分区应该归还给系统。
归还的分区如果与其它空闲区相邻.则应合成一个较大的空闲区.登记在空闲区说明链中.此时.相邻空闲区的合并问题.要求考虑四种情况:
(1)释放区下邻空闲区(低地址邻接)
(2)释放区上邻空闲区(高地址邻接)
(3)释放区上下都与空闲区邻接
(4)释放区上下邻都与空闲区不邻接
五、程序流程图
main函数里的流程图
分配空间里的流程图
回收空间里的流程图
p的状态改为空闲
回收p,p的前一个为first
p的后一个是end
p的后一个状态空
与后面空闲块相连
将p的状态改为空闲
回收空间函数
Y
N
p的前一个状态空
与前面空闲块相连
返回到整理分区序号
六、相关数据结构及关键函数说明
本程序采用了一个structfree_table数据结构.里面包含分区序号(num)、起始地址(address)、分区长度(length)和分区状态(state)。
还用了线性表的双性链表存储结构(structNode).里面包含前区指针(prior)和后继指针(next)。
一开始定义一条(含有first和end)的链.用开始指针和尾指针开创空间链表。
然后分别按三种算法进行分配和回收。
在该程序中关键函数有.sort()、allocation()、recovery()、和First_fit()、Best_fit()、Worst_fit();
其中sort()函数是用来整理分区序号的.如在删序号3时.她与前面序号2相连在一起了.然后序号2中的长度总满足申请的内存大小.就会在序号2中分配.然后序号在2的基础上加1.一直加.加到与原本序号3的下一个序号也就是4相等.这时sort()就开始有明显的工作了;
allocation()是分配空间的.也是过渡到三个算法中的.当三个算法中满足或者不满足分配请求.都会又返回值给allocation();
recovery()是用来回收内存的.里面包含了四种情况相连结果.即释放区上与空闲区邻接、释放区下与空闲区邻接、释放区上下都与空闲区邻接、释放区上下都与空闲区不邻接这四种情况的结果。
七、源代码
#include<
stdio.h>
stdlib.h>
#defineOK1//完成
#defineERROR0//出错
typedefintStatus;
typedefstructfree_table//定义一个空闲区说明表结构
{
intnum;
//分区序号
longaddress;
//起始地址
longlength;
//分区大小
intstate;
//分区状态
}ElemType;
typedefstructNode//线性表的双向链表存储结构
ElemTypedata;
structNode*prior;
//前趋指针
structNode*next;
//后继指针
}Node,*LinkList;
LinkListfirst;
//头结点
LinkListend;
//尾结点
intflag;
//记录要删除的分区序号
StatusInitblock()//开创带头结点的内存空间链表
{
first=(LinkList)malloc(sizeof(Node));
end=(LinkList)malloc(sizeof(Node));
first->
prior=NULL;
next=end;
end->
prior=first;
next=NULL;
data.num=1;
data.address=40;
data.length=600;
data.state=0;
returnOK;
}
voidsort()//分区序号重新排序
Node*p=first->
next,*q;
q=p->
next;
for(;
p!
=NULL;
p=p->
next)
{
for(q=p->
q;
q=q->
{
if(p->
data.num>
=q->
data.num)
q->
data.num+=1;
}
}
//显示主存分配情况
voidshow()
{intflag=0;
//用来记录分区序号
Node*p=first;
p->
data.num=0;
data.address=0;
data.length=40;
data.state=1;
sort();
printf("
\n\t\t》主存空间分配情况《\n"
);
**********************************************************\n\n"
分区序号\t起始地址\t分区大小\t分区状态\n\n"
while(p)
%d\t\t%d\t\t%d"
p->
data.num,p->
data.address,p->
data.length);
if(p->
data.state==0)printf("
\t\t空闲\n\n"
elseprintf("
\t\t已分配\n\n"
p=p->
//首次适应算法
StatusFirst_fit(intrequest)
//为申请作业开辟新空间且初始化
LinkListtemp=(LinkList)malloc(sizeof(Node));
temp->
data.length=request;
if((p->
data.state==0)&
&
(p->
data.length==request))
{//有大小恰好合适的空闲块
break;
elseif((p->
data.state==0)&
(p->
data.length>
request))
{//有空闲块能满足需求且有剩余
prior=p->
prior;
next=p;
data.address=p->
data.address;
data.num=p->
data.num;
prior->
next=temp;
prior=temp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 目的