内存管理模型的设计与实现(操作系统)-其它文档类资源.doc

上传人:wj 文档编号:83016 上传时间:2022-10-02 格式:DOC 页数:9 大小:162.50KB
下载 相关 举报
内存管理模型的设计与实现(操作系统)-其它文档类资源.doc_第1页
第1页 / 共9页
内存管理模型的设计与实现(操作系统)-其它文档类资源.doc_第2页
第2页 / 共9页
内存管理模型的设计与实现(操作系统)-其它文档类资源.doc_第3页
第3页 / 共9页
内存管理模型的设计与实现(操作系统)-其它文档类资源.doc_第4页
第4页 / 共9页
内存管理模型的设计与实现(操作系统)-其它文档类资源.doc_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

内存管理模型的设计与实现(操作系统)-其它文档类资源.doc

《内存管理模型的设计与实现(操作系统)-其它文档类资源.doc》由会员分享,可在线阅读,更多相关《内存管理模型的设计与实现(操作系统)-其它文档类资源.doc(9页珍藏版)》请在冰豆网上搜索。

内存管理模型的设计与实现(操作系统)-其它文档类资源.doc

操作系统实习报告

学生姓名:

班学号:

指导教师:

大学信息工程学院

年4月18日

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

【问题描述】

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

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

要求:

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

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

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

(3)从系统开始启动到多个进程参与申请和运行时,进程最少要有3个以上,每个执行申请的时候都要能够对系统当前的内存情况进行查看的接口;

(4)对内存的申请进行内存分配,对使用过的空间进行回收,对给定的某种页面调度进行合理的页面分配。

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

一、需求分析

内存分配方式内存分配方式有三种:

(1)从静态存储区域分配。

内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。

例如全局变量,static变量。

(2)在栈上创建。

在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。

栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3)从堆上分配,亦称动态内存分配。

程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。

动态内存的生存期由我们决定,使用非常灵活,但问题也最多;

要实现对内存的合理化分配和对闲置的进程占有的内存进行分配,需要有个很好的内存管理模型。

二、设计

1.设计思想

首次适度算法(FirstFit):

从内存的首地址出发,选择第一个能满足进程大小内存空闲块。

最佳适度算法(BestFit):

从内存的首地址出发,选择内存空闲块中最适合进程大小的块。

邻近适度算法(NextFit):

从上一次分配的地址开始查找第一个能满足进程大小的内存空闲块。

2.设计表示

(1)函数调用关系图

3.实现注释

(1),分区和节点都用结构体来表示;

(2),对链表的内存申请采用链表的方式存储;

(3),对内存的申请有四种可供选择的策略;

4.详细设计

分区表的结构体:

typedefstruct{

bytesubareaSize;//分区大小

intstartLoc;//起始地址

intindex;//分区号

}SubareaTable;//分区表

结点的结构体:

typedefstructnode{//结点

SubareaTablesubarea;//分区

structnode*next;

intstatus;//状态位0(空闲)1(使用)

}*Node,*LinkList;

进程的结构体:

typedefstruct{

byteprocessSize;

intsubareaIndex;//保存分区号

intstatus;//进程状态,0(新建)1(执行)-1(终止)-2(未绪。

申请但没有分配内存)2(就绪,已分配内存)

}Process;//进程

本程序运用到的变量有:

intsubareaSize[num]={8,12,16,32,24,16,64,128,40,64};//分区大小

Process*pro=NULL;//保持进程信息

intProcessNum=0;//进程数目

intapplyProcessNum=0;//每次申请进程数目

intmaxApplyNum=0;//最大可申请数目

int*applyIndex=NULL;//申请进程队列

inttotalApplyNum=0;//申请总数

int*assignPointer=NULL;//已分配内存的进程队列

intassignFlag=0;//分配索引,表示已申请队列已分配的进程数

intexeIndex;//执行的进程号

三、调试分析

遇到的问题:

在开始选择内存分配的时候总是出现调试中断的错误,后来在同学的帮助下调试了好半天才检查出来时内存分配的错误,我发现我经常犯这方面的错误,这次的实习给了我提示,以后碰到内存分配的时候一定会多加注意的。

五、运行结果

运行结果的部分截图如下:

创建进程:

进程信息:

进程申请:

分区创建:

内存分配:

六、源程序清单

本题中的主要代码如下:

首次适应算法:

NodefirstFit(LinkList&head,Processpro){Nodep=head->next;//遍历节点,返回节点,从第一个节点开始遍历

if(p==NULL){

cout<<"空闲链表不存在!

"<

returnNULL;

}

else{

do{

if(p->status==0&&p->subarea.subareaSize>=pro.processSize){

break;

}

p=p->next;

}

while(p!

=NULL);

if(p==NULL){//没有找到合适的节点

returnhead;

}

returnp;

}

循环适度算法:

NodenestFit(LinkList&head,Processpro,Nodeflag){//循环适应算法

Nodep=flag->next;//遍历结点

while(p!

=NULL){

if(p->status==0&&p->subarea.subareaSize>=pro.processSize){

break;

}

p=p->next;

}

if(p==NULL){//遍历到链表结尾

p=head;//从头开始遍历

while(p!

=flag){//标记结点

p=p->next;

if(p->status==0&&p->subarea.subareaSize>=pro.processSize){

break;

}

}

if(p==flag){//正常跳出循环,没有合适的结点可分配

returnhead;

}else{

returnp;//在flag结点前找到一合适的结点分配

}

}else{

returnp;//在flag结点后找到一合适的结点分配

}

最佳适度算法

NodebestFit(LinkList&head,Processpro){//最佳适应算法

Nodep=head->next;//遍历结点,返回结点,从第一个结点开始遍历

Nodeq;//返回最佳空闲结点

intleave;//剩余空间

intcount=0;//计数器

if(p==NULL){

cout<<"空闲链表不存在"<

returnNULL;

}else{

do{

if(p->status==0&&p->subarea.subareaSize>=pro.processSize){

count++;

if(count==1){//第一个可以分配的空闲分区

leave=p->subarea.subareaSize-pro.processSize;

q=p;

}elseif(count>1){

if(p->subarea.subareaSize-pro.processSize

leave=p->subarea.subareaSize-pro.processSize;

q=p;

}

}

}

p=p->next;

}while(p!

=NULL);

returnq;

}

最坏适度算法:

NodeworstFit(LinkList&head,Processpro){//最坏适应算法

Nodep=head->next;//遍历结点,返回结点,从第一个结点开始遍历

Nodeq;//返回最大空闲结点

intcount=0;//计数器

if(p==NULL){

cout<<"空闲链表不存在"<

returnNULL;

}else{//开始遍历

do{

if(p->status==0){

count++;

if(count==1){//第一个空闲区

q=p;

}

else{//非第一个空闲区

if(p->subarea.subareaSize>q->subarea.subareaSize){//当前结点大于前面最大结点

q=p;

}

}

}

p=p->next;

}while(p!

=NULL);

if(q->subarea.subareaSize>=pro.processSize){

returnq;

}else{

cout<<"进程大小大于最大分区,无法分配"<

returnhead;

}

}

}

心得体会

通过这次课程设计,让我更加深入的了解电脑内存的分配和管理过程,在这个过程中我经过了一翻努力,当然汗水还是留的很值,这次操作系统实习,不仅让我对操作系统这门课程有了更深入的研究、对很多重要的概念有了巩固和掌握,还给了我今后做事的启示。

做事要塌实,不能想着一步登天,要有计划,有目的的进行做事。

我们应该认真找到自己的缺点并且及时改正。

此时此刻,我心里多了些成就感。

这是我整个学习过程中的一次经验、一次总结,我相信它肯定会给我今后的学习有所启示和指导作用。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1