内存管理模型的设计与实现(操作系统)-其它文档类资源文档格式.doc
《内存管理模型的设计与实现(操作系统)-其它文档类资源文档格式.doc》由会员分享,可在线阅读,更多相关《内存管理模型的设计与实现(操作系统)-其它文档类资源文档格式.doc(9页珍藏版)》请在冰点文库上搜索。
内存分配方式内存分配方式有三种:
(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<
进程大小大于最大分区,无法分配"
}
心得体会
通过这次课程设计,让我更加深入的了解电脑内存的分配和管理过程,在这个过程中我经过了一翻努力,当然汗水还是留的很值,这次操作系统实习,不仅让我对操作系统这门课程有了更深入的研究、对很多重要的概念有了巩固和掌握,还给了我今后做事的启示。
做事要塌实,不能想着一步登天,要有计划,有目的的进行做事。
我们应该认真找到自己的缺点并且及时改正。
此时此刻,我心里多了些成就感。
这是我整个学习过程中的一次经验、一次总结,我相信它肯定会给我今后的学习有所启示和指导作用。