好文档 - 专业文书写作范文服务资料分享网站

实验 存储器管理(二)

天下 分享 时间: 加入收藏 我要投稿 点赞

存储器管理(二)

一、目的

本课题实验的目的是,使学生实验存储器管理系统的设计方法;加深对所学各种存储器管理方案的了解;要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行。

二、题目

存储器管理

三、要求及提示

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 #include #define TOTAL 5000

#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(totalfreesizenext; else {jobnumber=jobnumber+1; totalfree=totalfree-jl; jp2->name=jn; jp2->length=jl; jp2->address=freep->address; if(jobp==NULL) { jp2->next=NULL; jp2->back=NULL; jobp=jp2; } else { jp=jobp; while(jp!=NULL&&(jp2->addressaddress)) { jp1=jp; jp=jp->next; } jp2->next=jp; if(jp==NULL) { jp2->back=jp1; jp1->next=jp2; } else { jp2->back=jp->back; if(jp->back!=NULL) jp1->next=jp2; else jobp=jp2; jp->back=jp2;

} } if((fp->size-jl)next!=NULL) fp->next->back=fp->back; if(fp->back!=NULL) fp->back->next=fp->next; else freep=fp->next; /* return();*/ } else { fp->size=fp->size-jl; fp->address=fp->address+jl; } return(2); } if(totalfree>=jl) return(0); } }

/*********显示模块*********/ 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->addressaddress)) { fp1=fp; fp=fp->next; } if(fp!=NULL) { if((fp->next!=NULL)&&(fp->next->address=jp->address+jp->length)) f=f+1; if((fp->back!=NULL)&&(jp->address=fp1->address+fp1->size)) f=f+2; } else if((jp->address)=(fp1->address+fp1->size)) f=f+2; switch(f) { case 0: { fp2=(freeptr)malloc(sizeof(struct freearea)); fp2->address=jp->address; fp2->size=jp->length; fp2->next=fp; if(fp!=NULL) { fp2->back=fp->back; if(fp->back!=NULL) fp1->next=fp2; else freep=fp2; fp->back=fp2;

实验 存储器管理(二)

存储器管理(二)一、目的本课题实验的目的是,使学生实验存储器管理系统的设计方法;加深对所学各种存储器管理方案的了解;要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行。二、题目存储器管理三、要求及提示1、要求采用一种常用的存储器分配算法,设计一个存储器管理模拟系统。允许进行
推荐度:
点击下载文档文档为doc格式
0wnim6k79v1emx12t1jx
领取福利

微信扫码领取福利

微信扫码分享