循环首次适应的动态分区分配算法模拟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
课程设计题目:循环首次适应的动态分区分配算法模拟
专业:计算机科学与技术
班级:10204102
姓名:谱
学号: 10204102
指导教师:高小辉
2013年1月11 日
目录
一.循环首次适应算法 (3)
1. 概述 (3)
2.需求分析 (3)
二.实验指导 (4)
1.基本思想 (4)
2.数据结构 (4)
三.运行环境 (6)
四.流程图 (6)
五.循环首次适应算法代码 (5)
六.调试结果 (11)
七、总结 (14)
八.参考文献 (14)
一.循环首次适应算法
1.概述:
该算法是由首次适应算法演变而成的。在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块的请求大小相等的内存空间分配给作业。为实现该算法,应设置一起始查找指针,用于指示下一次起始查询的空闲分区,并采用循环查找方式,即如果最后一个(链尾)空闲分区的大小仍不能满足要求,则返回到第一个空闲分区,比较大小是否满足,找到后,应调整起始查询指针。
2. 需求分析
了解动态分区分配中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。采用首次适应算法的动态分区分配过程alloc()和回收过程free()。
空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间,即每次分配内存空间是总是从低址部分开始进行循环,找到第一个合适的空间,便按作业所需分配的大小分配给作业。
作业完成时,需要释放作业所占空间,此时要考虑到四种情况:
(1)回收区与插入点的前一个空闲分区相邻接。此时将二者合并,修改前一
分区的大小。
(2)回收区与插入点的后一空闲分区相邻接,将二者合并,用回收区的首址
作为新空闲区的首址。
(3)回收区同时与插入点的前后两个空闲分区相邻接,三者合并,使用前一空
闲分区的表项和首址。
(4)回收区单独存在。
二、实验指导
1.基本思想
动态分区是指系统不预先划分固定分区,而是在装入程序的时候划分内存区域,使得为程序分配的分区大小恰好等于该程序的需求量,且分区的个数是动态的。显然动态分区有较大的灵活性,较之固定分区能获得好的内存利用率。
2.数据结构
动态分区管理可以用两种数据结构实现,一种是已分配区表和空闲区表,也就是用预先定义好的系统空间来存放空间分配信息。
另一种也是最常用的就是空闲链表,由于对分区的操作是动态的,所以很难估计数据结构所占用的空间,而且空闲区表会占用宝贵的系统空间,所以提出了空闲链表的概念。其特点是用于管理分区的信息动态生成并和该分区在物理地址上相邻。这样由于可以简单用两个空闲块之间的距离定位已分配空间,不仅节约了系统空间,而且不必维持已分配空间的信息。
本实验是要做一个模拟程序,来模拟动态分区算法的分配和回收过程,并不是真正的去分配和回收内存。基本的模拟方法有两种:
1、先从内存中申请一块存储区,对这块存储区进行模拟的分配和回收活动。
2、不申请存储区,自己定义一块虚拟的存储区,对这块存储区进行模拟的分配和回收活动,分配和回收仅仅是对数据结构的修改而已。
三.运行环境:
1.操作系统 WINDOWS XP
2.编译软件 Microsoft Visual C++
3.电脑配置:主频3.0GHz 内存512MB
四.流程图
1.程序结构如图:
2.首次适应算法的结构如图:
五.循环首次适应算法代码
#include
#include
#include
using namespace std;
struct memory
{
struct memory *former; //前向指针 int address;//地址
int num;//作业号
int size;//分配内存大小
int state;//状态0表示空闲1表示已分配
struct memory *next; //后向指针
};
typedef struct memory MEMORY;
MEMORY *mem;
const int size_min=10;//内存允许的最小空闲块的大小
void init(); //初始化内存块
void exec();//执行相应算法
void F_F(int); //依次初始化每个作业,并根据相应算法对作业分配内存void alloc(MEMORY *,MEMORY *);//分配内存算法(包括两种不同算法)void free(MEMORY *,int);//首次适应算法回收内存
void sort(MEMORY *);//对内存链进行排序
void insert(MEMORY *,MEMORY *); //按空间大小将作业顺序插入到内存链void print(MEMORY *);//打印内存链
void main()
{ //主函数
int i=0;
while(1)
{ //选择算法
cout<<("\n欢迎进入!");
cout<<("\nPlease select a number(1,0)");
cout<<("\n 循环首次适应算法");
cout<<" 0--中止程序"< cin>>i; if(i==1) { //首次适应算法 cout<<("\n以下为首次适应算法:\n"); init();exec(); } else exit(1); } } void init() { //初始化内存容量 mem=new MEMORY; mem->size=640; mem->former=0; mem->next=0; }