- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验7 可变分区
实验7 可变分区管理
实验内容
内存是中央处理机能直接存取指令和数据的存储器。能否合理而有效的使用内存,在很大程度上将影响到整个计算机系统的性能。本实验实现内存空间的分配与回收 。
实验目的
本实验主要让大家熟悉内存的各种分配和回收。所谓分配,就是解决多道作业或多个进程如何共享内存空间的问题。所谓回收,就是当作业运行完成时,将作业或进程所占用的内存空间归还给系统。内存的分配与回收的实现是与内存的管理方式有关的。通过本实验,帮助大家理解不同的存储管理方式下,如何实现内存空间的分配与回收。
实验题目 采用可变式分区管理,使用首次适应算法实现内存的分配与回收
要求采用分区说明表进行实验。
提示:
(1) 可变式分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需要,并且分区个数可以调整。当要装入一个作业时,根据作业需要的内存量,查看是否有足够的空闲空间,若有,则按需求量分割一部分给作业;若没有,则作业等待。随着作业的装入、完成,内存空间被分割成许多大大小小的分区。有的分区被作业占用,有的分区空闲。例如,某时刻内存空间占用情况如图1所示。
为了说明那些分区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,如表1所示。
表1 空闲区说明表
起始地址 长度 状态 45K 20K 未分配 110K 146K 未分配 空表目 空表目 空表目 …… …… ……
其中,起始地址指出个空闲区的内存起始地址,长度指出空闲区的大小。
状态(未分配:该栏目记录的是有效空闲区)
状态(空表目:没有登记信息)
由于分区个数不定,所以空闲区说明表中应该有足够的空表目项。否则造成溢出,无法登记。
同样,再设一个已分配表,记录作业或进程的内存占用情况。
(2) 当有一个新作业要求装入内存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需求量,这时应将空闲区一分为二。一个分给作业,另外一个作为空闲区留在空闲区表中。为了尽量减少由于分割造成的碎片,尽可能分配低地址部分的空闲区,将较大空闲区留在高地址端,以利于大作业的装入。为此在空闲区表中,按空闲区首地址从低到高进行登记。为了便于快速查找,要不断地对表格进行紧缩,即让“空表目”项留在表的后部。其分配框图如图2所示。
(3) 当一个作业执行完成时,作业所占用的分区应归还给系统。在归还时要考虑相邻空闲区合并的问题。作业的释放区与空闲区的邻接分以下4种情况考虑:
释放区下邻(低地址邻接)空闲区;
释放区上邻(高地址邻接)空闲区;
释放区上下都与空闲区邻接;
释放区与空闲区不邻接。
首次适应算法回收框图如图3所示。
(4) 请按首次适应算法设计内存分配和回收程序。以表2当前使用的基础,初始化空闲区和已分配区说明表值。设计一个作业申请队列以及作业完成后的释放顺序,实现内存的分配与回收。把空闲区说明表的变化情况以及各作业的申请、释放情况显示或打印出来。
表2 空闲区说明表
起始地址 长度 状态 20K 20KB 1 80K 50KB 1 150K 100KB 1 300K 30KB 0(空表目) 600K 100KB 1 …… …… 空表目 …… …… …… 参考程序
#include stdio.h
#define N 5
struct freearea /*定义一个空闲区说明表结构,并初始化变量*/
{
int startaddress; /*空闲区始址*/
int size; /*空闲区大小*/
int state; /*空闲区状态:0表示空表目,1为可用空闲块*/
}freeblock[N]={{20,20,1},{80,50,1},{150,100,1},{300,30,0},{600,100,1}};
/*定义为作业分配主存空间的函数alloc()*/
int alloc(int applyarea) /*applyarea为作业申请量*/
{
int i,tag=0; /*tag为检查是否有满足作业需要的空闲区的标志*/
for(i=0;iN;i++) /*检查空闲区说明表是否有满足作业要求的空闲区*/
if(freeblock[i].state==1 freeblock[i].sizeapplyarea)( 为两个)
{
freeblock[i].startaddress=freeblock[i].startaddress+applyarea;
freeblock[i].size=freeblock[i].size-applyarea;
tag=1; /*有满足条件的空闲区时,tag置为1*/
return freeblock[i].st
文档评论(0)