动态分区存储管理.docx
- 文档编号:4336656
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:15
- 大小:102.17KB
动态分区存储管理.docx
《动态分区存储管理.docx》由会员分享,可在线阅读,更多相关《动态分区存储管理.docx(15页珍藏版)》请在冰豆网上搜索。
动态分区存储管理
《操作系统》课程实验报告
实验名称:
动态分区存储管理
姓名:
学号:
地点:
实验楼302
指导老师:
专业班级:
软件外包11-01
一、实验目的:
1、熟悉并掌握动态分区分配的算法。
2、熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。
二、实验内容:
用高级语言模拟实现动态分区存储管理,要求:
1、分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至少一种。
熟悉并掌握各种算法的空闲区组织方式。
2、分区的初始化——可以由用户输入初始分区的大小。
(初始化后只有一个空闲分区,起始地址为0,大小是用户输入的大小)
3、分区的动态分配过程:
由用户输入作业号和作业的大小,实现分区过程。
4、分区的回收:
用户输入作业号,实现分区回收,同时,分区的合并要体现出来。
(注意:
不存在的作业号要给出错误提示!
)
5、分区的显示:
任何时刻,可以查看当前内存的情况(起始地址是什么,大小多大的分区时空闲的,或者占用的,能够显示出来)
三、实验代码
#include
#include
#defineFree0//空闲状态
#defineBusy1//已用状态
#defineOK1//完成
#defineERROR0//出错
#defineMAX_length1000//最大内存空间为1000KB
typedefintStatus;
typedefstructfreearea//定义一个空闲区说明表结构
{
intID;//分区号
longsize;//分区大小
longaddress;//分区地址
intstate;//状态
}ElemType;
//----------线性表的双向链表存储结构------------
typedefstructDuLNode//双向链表
{
ElemTypedata;
structDuLNode*prior;//前趋指针
structDuLNode*next;//后继指针
}DuLNode,*DuLinkList;
DuLinkListblock_first;//头结点
DuLinkListblock_last;//尾结点
Statusalloc(int);//内存分配
Statusfree(int);//内存回收
StatusFirst_fit(int,int);//首次适应算法
StatusBest_fit(int,int);//最佳适应算法
StatusNext_fit(int,int);//循环首次适应算法
voidshow();//查看分配
StatusInitblock();//开创空间表
StatusInitblock()//开创带头结点的内存空间链表
{
block_first=(DuLinkList)malloc(sizeof(DuLNode));
block_last=(DuLinkList)malloc(sizeof(DuLNode));
block_first->prior=NULL;
block_first->next=block_last;
block_last->prior=block_first;
block_last->next=NULL;
block_last->data.address=0;
block_last->data.size=MAX_length;
block_last->data.ID=0;
block_last->data.state=Free;
returnOK;
}
//-----------------------分配主存-------------------------
Statusalloc(intch)
{
DuLNode*p=block_first->next;
intID,request;
cout<<"请输入作业(分区号):
";
if(p!
=NULL)//判断分区号是否重复
{
while(p!
=NULL)
{
cin>>ID;
if(p->data.ID==ID)
{
cout<<"分区号重复,请重试!
"< continue; } else break; p=p->next; } } else cin>>ID; cout<<"请输入需要分配的主存大小(单位: KB): "; cin>>request; if(request<0||request==0) { cout<<"分配大小不合适,请重试! "< returnERROR; } if(ch==3)//选择循环首次适应算法 { if(Next_fit(ID,request)==OK)cout<<"分配成功! "< elsecout<<"内存不足,分配失败! "< returnOK; } elseif(ch==2)//选择最佳适应算法 { if(Best_fit(ID,request)==OK)cout<<"分配成功! "< elsecout<<"内存不足,分配失败! "< returnOK; } else//默认首次适应算法 { if(First_fit(ID,request)==OK)cout<<"分配成功! "< elsecout<<"内存不足,分配失败! "< returnOK; } } //------------------首次适应算法----------------------- StatusFirst_fit(intID,intrequest)//传入作业名及申请量 { //为申请作业开辟新空间且初始化 DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode)); temp->data.ID=ID; temp->data.size=request; temp->data.state=Busy; DuLNode*p=block_first->next; while(p) { if(p->data.state==Free&&p->data.size==request) {//有大小恰好合适的空闲块 p->data.state=Busy; p->data.ID=ID; returnOK; break; } if(p->data.state==Free&&p->data.size>request) {//有空闲块能满足需求且有剩余" temp->prior=p->prior; temp->next=p; temp->data.address=p->data.address; p->prior->next=temp; p->prior=temp; p->data.address=temp->data.address+temp->data.size; p->data.size-=request; returnOK; break; } p=p->next; } returnERROR; } //--------------------最佳适应算法------------------------ StatusBest_fit(intID,intrequest)//传入作业名及申请量 { intch;//记录最小剩余空间 DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode)); temp->data.ID=ID; temp->data.size=request; temp->data.state=Busy; DuLNode*p=block_first->next; DuLNode*q=NULL;//记录最佳插入位置 while(p)//初始化最小空间和最佳位置 { if(p->data.state==Free&&(p->data.size>request||p->data.size==request)) { q=p; ch=p->data.size-request; break; } p=p->next; } while(p) { if(p->data.state==Free&&p->data.size==request) {//空闲块大小恰好合适 p->data.ID=ID; p->data.state=Busy; returnOK; break; } if(p->data.state==Free&&p->data.size>request) {//空闲块大于分配需求 if(p->data.size-request { ch=p->data.size-request;//更新剩余最小值 q=p;//更新最佳位置指向 } } p=p->next; } if(q==NULL)returnERROR;//没有找到空闲块 else {//找到了最佳位置并实现分配 temp->prior=q->prior; temp->next=q; temp->data.address=q->data.address; q->prior->next=temp; q->prior=temp; q->data.address+=request; q->data.size=ch; returnOK; } } //--------------------循环首次适应算法------------------------ StatusNext_fit(intID,intrequest)//传入作业名及申请量 { //为申请作业开辟新空间且初始化 DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode)); temp->data.ID=ID; temp->data.size=request; temp->data.state=Busy; staticDuLNode*p=block_first->next;//定义静态指针变量 if(p->data.size while(p) { if(p->data.state==Free&&p->data.size==request) {//有大小恰好合适的空闲块 p->data.state=Busy; p->data.ID=ID; returnOK; break; } if(p->data.state==Free&&p->data.size>request) {//有空闲块能满足需求且有剩余" temp->prior=p->prior; temp->next=p; temp->data.address=p->data.address; p->prior->next=temp; p->prior=temp; p->data.address=temp->data.address+temp->data.size; p->data.size-=request; returnOK; break; } p=p->next; } returnERROR; } //-----------------------主存回收-------------------- Statusfree(intID) { DuLNode*p=block_first; while(p) { if(p->data.ID==ID) { p->data.state=Free; p->data.ID=Free; if(p->prior->data.state==Free)//与前面的空闲块相连 { p->prior->data.size+=p->data.size; p->prior->next=p->next; p->next->prior=p->prior; } if(p->next->data.state==Free)//与后面的空闲块相连 { p->data.size+=p->next->data.size; if(p->next->next! =NULL) { p->next->next->prior=p->next->prior; } else { p->next=p->next->next; } p->prior->next=p; } break; } p=p->next; } returnOK; } //---------------显示主存分配情况------------------ voidshow() { cout<<"+++++++++++++++++++++++++++++++++++++++\n"; cout<<"+++主存分配情况+++\n"; cout<<"+++++++++++++++++++++++++++++++++++++++\n"; DuLNode*p=block_first->next; while(p) { cout<<"分区号: "; if(p->data.ID==Free)cout<<"Free"< elsecout< cout<<"起始地址: "< cout<<"分区大小: "< cout<<"状态: "; if(p->data.state==Free)cout<<"空闲"< elsecout<<"已分配"< cout<<"--------------"< p=p->next; } } //-----------------------主函数--------------------------- voidmain() { loop: intch;//算法选择标记 cout<<"动态分区分配方式的模拟\n"; cout<<"初始内存为1000KB\n"; cout<<"相应的算法如下\n"; cout<<" (1)首次适应算法\n"; cout<<" (2)最佳适应算法\n"; cout<<"(3)循环首次适应算法\n"; cout<<"\n"; cout<<"\n"; cout<<"请选择分配算法: "; cin>>ch; Initblock();//开创空间表 intchoice;//操作选择标记 while (1) { cout<<"********************************************\n"; cout<<"**1: 分配内存2: 回收内存**\n"; cout<<"**3: 查看分配0: 退出**\n"; cout<<"********************************************\n"; cout<<"请输入您的操作: "; cin>>choice; if(choice==1)alloc(ch);//分配内存 elseif(choice==2)//内存回收 { intID; cout<<"请输入您要释放的分区号: "; cin>>ID; free(ID); } elseif(choice==3)show();//显示主存 elseif(choice==0)gotoloop;//退出 else//输入操作有误 { cout<<"输入有误,请重试! "< continue; } } } 四、实验结果 五、实验总结 本次程序设计主要是动态分区存储管理的实现。 通过实验我对动态分区存储有了深刻的理解。 在这次的课程设计中,让我感觉较为不满意的地方是,在实验开始之前我对于动态分区存储理解不是太深,从而加大了实验的难度。 对于这次出现的这个问题,我认真研究了课本基础知识,加强理解,也让我明白到了基础知识的重要性。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 分区 存储 管理