实验三模拟文件存储空间管理.docx
- 文档编号:6223603
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:11
- 大小:280.49KB
实验三模拟文件存储空间管理.docx
《实验三模拟文件存储空间管理.docx》由会员分享,可在线阅读,更多相关《实验三模拟文件存储空间管理.docx(11页珍藏版)》请在冰豆网上搜索。
实验三模拟文件存储空间管理
一、实验目的
掌握连续空间存储管理机制
熟练运用linux的编译器
二、实验内容
采用链表进行空闲区和已分配空间的管理
初始的内存大小为100000字节
采用最佳适应分配算法分配内存
功能键
a)0退出
b)1为作业分配内存
输入:
作业名要求的内存大小
执行逻辑:
若无满足要求大小的空闲区,则显示无法分配的消息并退出,否则依据最佳适应分配算法找到空闲区,分配给作业(有可能需要对空闲区进行切割),并在已分配链表中进行登记
c)2回收内存
输入:
作业名
执行逻辑:
在已分配链表中找到给定的作业名对应的项,将对应的内存回收,修改已分配链表和空闲区链表(有可能需要在空闲区链表中进行合并)
d)3显示内存分配情况
已分配内存空间情况(作业名,起始地址,长度)和空闲区情况(起始地址,长度)
三、实验步骤
#include
#include
usingnamespacestd;
structAllocatedSpace//已分配内存空间结构体
{
intstart_address;
intlength;
charjob;
structAllocatedSpace*next;
};
structFreeSpace//未分配内存空间结构体
{
intstart_address;
intlength;
structFreeSpace*next;
};
structAllocatedSpace*allocated_header;
structFreeSpace*free_header;
structFreeSpace*freenext;
voidallocatememory()//分配内存函数
{
charjobname;
intjoblength;
intmin,l=0;
cout<<"请输入作业名(一个字母):
\n";
cin>>jobname;
cout<<"请输入作业长度(整数):
\n";
cin>>joblength;
structFreeSpace*w=free_header;
structFreeSpace*p=free_header;//指向第一个可以分配的空闲结点
p=p->next;
structFreeSpace*s=free_header;//指向p的前一个结点
structAllocatedSpace*t=allocated_header;
while(p->length { p=p->next; if(p==NULL) break; } if(p==NULL) cout<<"无法分配! \n"; else { w=p; min=p->length-joblength; while(p! =NULL)//现在p指向当前要被切割的结点 { if(p->length>joblength) l=p->length-joblength; if(l { w=p; min=l; } p=p->next; } structAllocatedSpace*q=newAllocatedSpace; q->job=jobname; q->length=joblength; q->start_address=w->start_address; while(t->next! =NULL) t=t->next; q->next=t->next; t->next=q; while(s->next! =w) s=s->next; if(w->length==q->length) { s->next=w->next; deletew; } else { w->start_address=w->start_address+q->length; w->length=w->length-q->length; } } } voidreclaimmemory() { charjobname; cout<<"请输入要回收的作业名: \n"; cin>>jobname; structFreeSpace*p=newstructFreeSpace;//指向当前被创建的空闲结点 structFreeSpace*s=free_header;//指p的前一个结点 structFreeSpace*m=free_header;//指向s的前一个结点 structAllocatedSpace*q=allocated_header;//指向被回收的结点 structAllocatedSpace*t=allocated_header;//指向被回收的结点的前一个结点 while(q->job! =jobname)//找到被回收的结点 q=q->next; if(q==NULL) cout<<"回收错误,要回收的结点不存在! \n"; else { p->length=q->length; p->start_address=q->start_address; while(s->start_address s=s->next; while(m->next! =s) m=m->next; p->next=s; m->next=p; cout<<"回收成功! \n"; } while(t->next! =q) t=t->next; t->next=q->next; deleteq; s=free_header; m=free_header; s=s->next; m=m->next; while(m! =NULL) { m=m->next; if(m==NULL) break; if(s->start_address+s->length==m->start_address) { s->length=s->length+m->length; s->next=m->next; continue; } s=s->next; } } voidshowmemory() { structFreeSpace*s=free_header;//指向FreeSpace的头结点,开始往后遍历 s=s->next; structAllocatedSpace*q=allocated_header;//指向AllocatedSpace的头结点,开始往后遍历 q=q->next; cout<<"已分配区的情况如下: \n"; while(q! =NULL) { cout<<"作业名: "< "< "< q=q->next; } cout<<"空闲结点的情况如下: \n"; while(s! =NULL) { cout<<"开始地址: "< "< s=s->next; } } intmain() { intn; allocated_header=newstructAllocatedSpace; free_header=newstructFreeSpace; freenext=newstructFreeSpace; freenext->length=100000; freenext->start_address=0; freenext->next=NULL; free_header->next=freenext; allocated_header->next=NULL; while (1) { cout<<"请输入您要进行的操作: 0退出1分配内存2回收内存3显示内存状态\n"; cin>>n; switch(n) { case0: exit(0); case1: allocatememory();break; case2: reclaimmemory();break; case3: showmemory();break; } } } 四、结果分析 五、程序中的函数说明 1.Allocatememory();这个函数是用来分配内存的,输入为作业名和作业长度,其中涉及到最佳适应分配算法。 算法如下: while(p->length { p=p->next; if(p==NULL) break; } if(p==NULL) cout<<"无法分配! \n"; else { w=p; min=p->length-joblength; while(p! =NULL)//现在p指向当前要被切割的结点 { if(p->length>joblength) l=p->length-joblength; if(l { w=p; min=l; } p=p->next; } 2.reclaimmemory();这个函数是用来回收内存的,输入为作业名,其中涉及到内存的合并,代码如下: while(m! =NULL) { m=m->next; if(m==NULL) break; if(s->start_address+s->length==m->start_address) { s->length=s->length+m->length; s->next=m->next; continue; } s=s->next; } 六、实验总结 通过本次实验,我对linux有了更进一步的了解,知道了linux可以编译C++源文件。 另外,在写程序的过程中,我也遇到了一些问题,主要是bestfit算法的编写和内存回收的合并方面,还有,由于长时间没写C++的代码,导致我已开始都忘了怎么写,所以一开始花了一些时间在复习C++的语法以及数据结构的链表那一块的内容。 总之,整个程序我是完完全全自己写出来的,没有一句是荡的网上的,甚至从头到尾我没有上网查阅过相关的资料。 这一点是我最开心的。 这次的体会是,写程序之前,要把程序的流程写出来,先干什么,在干什么,程序框架是什么,重要函数的执行流程,这样写程序的时候就没什么困难了。 总之,当认认真真完成了一件事情之后,不仅感觉收获了很多,而且觉得很开心!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验三 模拟文件存储空间管理 实验 模拟 文件 存储空间 管理