实验四主存空间的分配和回收
网络工程专业 姓名:蔡利聪 学号:201306114117
一、目的和要求
1. 实验目的
用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。
2.实验要求
采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法)。
(1)设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。
(2)或在程序运行过程,由用户指定申请与释放。
(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。把空闲区说明表的变化情况以及各作业的申请、释放情况显示。
二、实验内容
编写并调试一个模拟的内存分配与回收程序,使用首次适应算法、循环首次适应算法对内存空间的分配与回收。
三、实验方法、步骤及结果测试
1. 源程序名:a.cpp
可执行程序名:a.exe
2. 原理分析
(1)编写该程序首先要给定一个一定空间大小的内存,即申请空闲区空间最大值,并且要定义空间的各分区的作业标号、分区起始地址、分区长度,单位为字节、分区表的状态位、前向指针、后向指针、已分配分区表、空闲分区等。
(2)通过定义空间分区后,还要定义空间分区链表并对其进行初始化,对空闲分区和已分配分区进行链表访问,对于空闲分区可以分配给新进来的进程使用,对于已分配的分区,则等进程执行结束后在回收空间,恢复空闲区。通过链表的访问实现整个空间分区的分配与回收。
3. 主要程序段及其解释:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include <conio.h> 4 #define nil -1 5 #define NULL 0 6 #define maxisize 600 //用户的空闲区空间最大值 7 #define minisize 4 8 #define getspace(type) (type*)malloc(sizeof(type)) //分配空间 9 struct table{ 10 char job; //作业标号 11 float address; //分区起始地址 12 float length; //分区长度,单位为字节 13 int flag; //分区表的状态位 14 struct table *FRlink; //前向指针 15 struct table *RElink; //后向指针 16 }*free_table=NULL,*place; //已分配分区表,空闲分区表 17 typedef struct table FRtable; 18 //空间分区链表初始化 19 FRtable *init(FRtable *tb) 20 { 21 tb->FRlink=NULL; 22 tb->job=nil; 23 tb->address=1064; 24 tb->length=1664; 25 tb->flag=0; 26 tb->RElink=NULL; 27 return tb; 28 } 29 //主存分配函数,为作业job分配大小为xk的分区空间 30 void allocate(char job,float xk,int choice) 31 { 32 FRtable *tb,*link; 33 int k=0; 34 float temp=600; 35 if (free_table->FRlink==NULL&&free_table->RElink==NULL) 36 { //给首个作业分配空间,改写分区链表 37 free_table->job=job; 38 free_table->length=xk; 39 free_table->flag=1;