存储器管理(二)
一、目的
本课题实验的目的是,使学生实验存储器管理系统的设计方法;加深对所学各种存储器管理方案的了解;要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行。
二、题目
存储器管理
三、要求及提示
1、要求采用一种常用的存储器分配算法,设计一个存储器管理模拟系统。允许进行
多次的分配和释放,并可向用户反馈分配和释放情况及当前内存的情况;采用“命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。 2、编程实现。
3、工具:C语言或其它高级语言 4、实验时间:3学时
四、实验报告
1、写出存储器管理的思想。
2、画出算法流程图和设置的数据结构。 3、写出调试程序出现的问题及解决的方法。 4、打印实验报告及程序清单。 5、报告给出测试的结果。
五、范例
采用可变分区存储器管理方案的模拟系统。 1、问题描述
该模拟系统的外部特性与真实系统基本一样。存储分配算法采用首次适应法。用“拼,接”和“紧凑”技术来处理存储器碎片。 2、算法
存储分配算法采用首次适应(FF)法。根据指针freep查找自由链,当找到第一块可满足分配请求的空闲区时便分配之。当某空闲区被分配后的剩余空闲区空间大于规定的碎片最小容量min时,则形成一个较小的空闲区留在自由链中。
回收时,根据MAT将指定分区链入自由链。若该分区有前邻或后邻空闲分区,则将他们拼接成一块加大的空闲区。
当某个分配请求不能被满足,但此时系统中所有碎片总量满足分配请求的容量时,系统立即进入内存“紧凑”以消除碎片。即将各作业占用区集中下移到用户内存区的下部(高地址部分),形成一片连接的作业区,而在用户内存区的上部形成一块较大的空闲区。然后再进行分配。
本系统的主要程序模块包括:分配模块ffallocation,回收模块ffcolection,紧凑模块coalesce及命令处理模块menu。Menu用以模拟系统的输入,采用“命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。 系统的主流程如图3所示。 3、数据结构
(1) 自由链与区头。内存空闲区采用自由链结构。链首由freep指向,链中各个空
闲区按地址递增次序排列。初启时整个用户内存区为一个空闲区。在每个空闲区首部设置一个区头(freearca)结构。区头信息包括:
size 空闲区大小(以字节计),包括区头所占空间; next 前向链指针,指向下一个空闲区; back 反向链指针,指向上一个空闲区; address 本空闲区首地址。 (2) 内存分配表MAT。系统设置一个MAT,每个运行作业都在MAT中占有一个表目,
回收分区时清除相应表目。表目信息包括:
name 用户作业名; length 作业区大小; addr 作业区首地址;
4、程序清单 #include
#define SETADDRESS 2000 #define MIN 100 #define MAX 10
typedef struct freearea { int address; int size; struct freearea *next; struct freearea *back; }*freeptr;
typedef struct mat { char name; int address; int length; struct mat *next; struct mat *back; }*jobptr;
char string[10]; long totalfree; char jobnumber; freeptr freep; jobptr jobp;
/********初始化**********/ init() { freep=(freeptr)malloc(sizeof(struct freearea)); freep->size=TOTAL; freep->address=SETADDRESS; freep->next=NULL; freep->back=NULL;
}
totalfree=TOTAL; jobp=NULL; jobnumber=0; return(0);
/******分配模块*******/ fengpei(int jl,char jn) {freeptr fp;
jobptr jp,jp1,jp2; jp2=(jobptr)malloc(sizeof(struct mat)); if(totalfree
} } if((fp->size-jl)
/*********显示模块*********/ xianshi() {jobptr jp;
/****清屏****/ if(jobnumber<=0) printf(\ else { printf(\ jp=jobp; while(jp!=NULL) { printf(\ jp=jp->next; } } printf(\}
/******回收模块********/ huishou(char jn) {
freeptr fp,fp1,fp2; jobptr jp; int f=0;
jp=jobp;
while((jp!=NULL)&&(jp->name!=jn)) jp=jp->next; if(jp!=NULL) { jobnumber=jobnumber-1; totalfree=totalfree+jp->length; if(freep==NULL) { freep=(freeptr)malloc(sizeof(struct freearea)); freep->address=jp->address; freep->size=jp->address; freep->next=NULL; freep->back=NULL; } else { fp=freep; while((fp!=NULL)&&(fp->address