动态分区分配存储管理系统
- 格式:doc
- 大小:291.08 KB
- 文档页数:18
动态分区分配存储管理系统
一、设计目的与内容
用高级语言编写和调试一个动态分区内存分配程序,演示实现下列两种动态分区分配算
法
1)首次适应算法
2)循环首次适应算法
1. 内存中有0-100M 的空间为用户程序空间,最开始用户空间是空闲的。
2. 作业数量、作业大小、进入内存时间、运行时间需要通过界面进行输入。
3. 可读取样例数据(要求存放在外部文件中)进行作业数量、作业大小、进入内存时间、
运行时间的初始化。
4. 根据作业进入内存的时间,采用简单的先进先出原则进行从外存到内存的调度,作业具
有等待(从外存进入内存执行)、装入(在内存可执行)、结束(运行结束,退出内存)三种状态。
5. 能够自动进行内存分配与回收,可根据需要自动进行紧凑与拼接操作。
二、算法的基本思想
1、定义基本结构:
1作业结构:
typedef struct JOB
{
int num; //作业号
int size; //作业大小
int ctime; //作业进入时间
int rtime; //作业运行时间
int state; //作业状态
}Job
;
2)分区结构:
typedef struct DuLNode
{
int ID; //分区号
int start; //开始地址
int size; //大小
int state; //0=尚未使用1=使用2=释放
struct DuLNode *prior;//前驱指针
struct DuLNode *next; //后即指针
}DuLNode, * DuLinkList;
2、基本操作:
int Firstfit(int);//首次适应算法
int Next_fit(int); //循环首次适应算法
void showJob(int); //显示作业表
void showPartiton(DuLinkList);//显示分区表
DuLinkList InitpartitionList(DuLinkList &p);//初始化
void huishou(DuLinkList pl3,DuLinkList &pl);//回收函数
int Putin(int &n);//输入函数,输入作业相关信息
3、首次适应算法
空闲分区链以地址递增的次序链接,分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,取消的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。
4、循环首次适应算法
在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。
三、主要功能模块流程图
主函数:
首次适应算法:循环首次适应算法
四、系统测试
程序运行实例如下:
1、输入界面,按要求输入:
2、选择算法及分区首地址:
3、运行结束后显示,并继续选择:
4、退出:
五、结论
作业采用数组形式进行存储,起初想用数组模拟分区,但划分记录比较不易,时间空间复杂度较大,容易混乱,遂决定用链表形式模拟分区情况。基本能运行符合要求,能模拟出动态分区过程及最终结果。
六、源程序及系统文件使用说明
#include
#include
#include
#include
#define Free 0
#define Use 1
#define MAX_length 100 //最大内存空间为100MB
//--------------作业结构体数组----------------------------
typedef struct JOB
{
int num; //作业号
int size; //作业大小
int ctime; //作业进入时间
int rtime; //作业运行时间
int state; //作业状态
}Job;
typedef struct DuLNode
{
int ID; //分区号
int start; //开始地址
int size; //大小
int state; //0=尚未使用1=使用2=释放
struct DuLNode *prior;//前驱指针
struct DuLNode *next; //后即指针
}DuLNode, * DuLinkList;
//-------------------------------------------------------------------------------
int Firstfit(int);//首次适应算法
int Next_fit(int); //循环首次适应算法
void showJob(int); //显示作业表
void showPartiton(DuLinkList);//显示分区表
//-----------------------------------------------------------------------------
//---------------------------全局变量-------------------------------------------
int f;