内存管理模型的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统课程实验报告

学生姓名:尹朋

班学号:111131

指导教师:袁国斌

中国地质大学信息工程学院

2015年1月4日

实习题目:内存管理模型的设计与实现

【需求规格说明】

对内存的可变分区申请采用链表法管理进行模拟实现。要求:

1.对于给定的一个存储空间自己设计数据结构进行管理,可以使用单个链

表,也可以使用多个链表,自己负责存储空间的所有管理组织,要求采用分页方式(指定单元大小为页,如4K,2K,进程申请以页为单位)来组织基本内容;

2.当进程对内存进行空间申请操作时,模型采用一定的策略(如:首先利用

可用的内存进行分配,如果空间不够时,进行内存紧缩或其他方案进行处理)对进程给予指定的内存分配;

3.从系统开始启动到多个进程参与申请和运行时,进程最少要有3个以上,

每个执行申请的时候都要能够对系统当前的内存情况进行查看的接口;

4.对内存的申请进行内存分配,对使用过的空间进行回收,对给定的某种页

面调度进行合理的页面分配。

5.利用不同的颜色代表不同的进程对内存的占用情况,动态更新这些信息。

【算法设计】

(1)设计思想:

通过建立一个链表,来描述已分配和空闲的内存分区。对于每一个分区,它可能存放了某个进程,也可能是两个进程间的空闲区。链表中的每一个结点,分别描述了一个内存分区,包括它的起始地址、长度、指向下一个结点的指针以及分区的当前状态。

在基于链表的存储管理中,当一个新的进程到来时,需要为它分配内存空间,即为它寻找某个空闲分区,该分区的大小必须大于或等于进程的大小.

最先匹配法:假设新进程的大小为M,那么从链表的首节点开始,将每一个空闲节点的大小与M相比较,直到找到合适的节点.这种算法查找的节点很少,因而速度很快.

最佳匹配算法:搜索整个链表,将能够装得下该进程的最小空闲区分配出去.

最坏匹配法:在每次分配的时候,总是将最大的那个空闲区切去一部分,分配给请求者.它的依据是当一个很大的空闲区被切割成一部分后,可能仍然是一个比较大的空闲区,从而避免了空闲区越分越小的问题.

(2)设计表示:

分区结点设计:

template

class ChainNode

{

friend Chain;

public:

char pro; //内存块存放的程序名"o" 代表操作系统‘’代表空闲区

T size; //内存块的大小

T begin; //内存块起始地址

ChainNode *link; //下一个内存块

};

template

分区链表设计:

class Chain

{

public:

Chain()

{first=NULL;}

~Chain();

int ff(int manage,char pro,int size);

void assign(ChainNode *q,char pro,int size);//动态分配内存

int bf(int manage,char pro,int size); //最佳适应法

int wf(int manage,char pro,int size); //最坏适应法

int delpro(int manage,char pro); //撤销进程,可能要进行内存块的合并

void del_pro(int manage);

void init(int manage); //内存的初始化

void assign_pro(int manage) ; // public:

ChainNode *first;

ChainNode *p;

};

(3)详细设计表示:

//给进程pro 根据选择情况分配内存

//最先适应法 //最佳适应法 //最坏适应法

【调试报告】

【附录】

#include #include

#include template class ChainNode

{

friend Chain;

public:

char pro; //内存块存放的程序名"o" 代表操作系统‘’代表空闲区

T size; //内存块的大小

T begin; //内存块起始地址

ChainNode *link; //下一个内存块

};

template

class Chain

{

public:

Chain()

{first=NULL;}

~Chain();

int ff(int manage,char pro,int size);

void assign(ChainNode *q,char pro,int size); //动态分配内存

int bf(int manage,char pro,int size); //最佳适应法

int wf(int manage,char pro,int size); //最坏适应法

int delpro(int manage,char pro); //撤销进程,可能要进行内存块的合并

void del_pro(int manage);

void init(int manage); //内存的初始化

void assign_pro(int manage) ; //

public:

ChainNode *first;

ChainNode *p;

};

memory *base; //代表内存,一个头指针,内存总大小为256k

//int snum[]={20,50,30,45,54,52};

//void assign(memory *q,char pro,int size);

void init(int manage) //内存的初始化

{

memory *p,*q;

if(base!=NULL) //这一块是释放链表

{

p=base;

while(p)

相关文档
最新文档