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

上传人:wj 文档编号:238350 上传时间:2023-04-28 格式: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_第6页
第6页 / 共9页
内存管理模型的设计与实现(操作系统)-其它文档类资源文档格式.doc_第7页
第7页 / 共9页
内存管理模型的设计与实现(操作系统)-其它文档类资源文档格式.doc_第8页
第8页 / 共9页
内存管理模型的设计与实现(操作系统)-其它文档类资源文档格式.doc_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

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

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

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

(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;

进程的结构体:

byteprocessSize;

intsubareaIndex;

//保存分区号

//进程状态,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<

<

"

空闲链表不存在!

endl;

returnNULL;

}

else{

do{

if(p->

status==0&

&

p->

subarea.subareaSize>

=pro.processSize){

break;

}

p=p->

while(p!

=NULL);

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

returnhead;

returnp;

}

循环适度算法:

NodenestFit(LinkList&

head,Processpro,Nodeflag){//循环适应算法

Nodep=flag->

//遍历结点

while(p!

=NULL){

if(p->

break;

}

p=p->

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

p=head;

//从头开始遍历

while(p!

=flag){//标记结点

p=p->

if(p->

break;

}

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

returnhead;

}else{

returnp;

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

}else{

returnp;

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

最佳适度算法

NodebestFit(LinkList&

head,Processpro){//最佳适应算法

Nodep=head->

//遍历结点,返回结点,从第一个结点开始遍历

Nodeq;

//返回最佳空闲结点

intleave;

//剩余空间

intcount=0;

//计数器

if(p==NULL){

cout<

空闲链表不存在"

returnNULL;

do{

=pro.processSize){

count++;

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

leave=p->

subarea.subareaSize-pro.processSize;

q=p;

}elseif(count>

1){

if(p->

subarea.subareaSize-pro.processSize<

leave){//更适合的结点

leave=p->

q=p;

}

}

}while(p!

returnq;

最坏适度算法:

NodeworstFit(LinkList&

head,Processpro){//最坏适应算法

//返回最大空闲结点

}else{//开始遍历

status==0){

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

else{//非第一个空闲区

q->

subarea.subareaSize){//当前结点大于前面最大结点

if(q->

returnq;

cout<

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

}

心得体会

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

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

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

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

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

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

当前位置:首页 > 考试认证 > 财会金融考试

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2