动态分区存储管理.docx

上传人:b****6 文档编号:4336656 上传时间:2022-11-29 格式:DOCX 页数:15 大小:102.17KB
下载 相关 举报
动态分区存储管理.docx_第1页
第1页 / 共15页
动态分区存储管理.docx_第2页
第2页 / 共15页
动态分区存储管理.docx_第3页
第3页 / 共15页
动态分区存储管理.docx_第4页
第4页 / 共15页
动态分区存储管理.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

动态分区存储管理.docx

《动态分区存储管理.docx》由会员分享,可在线阅读,更多相关《动态分区存储管理.docx(15页珍藏版)》请在冰豆网上搜索。

动态分区存储管理.docx

动态分区存储管理

《操作系统》课程实验报告

 

实验名称:

动态分区存储管理

 

姓名:

学号:

地点:

实验楼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.sizenext;

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<data.ID<

cout<<"起始地址:

"<data.address<

cout<<"分区大小:

"<data.size<<"KB"<

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;

}

}

}

四、实验结果

 

五、实验总结

本次程序设计主要是动态分区存储管理的实现。

通过实验我对动态分区存储有了深刻的理解。

在这次的课程设计中,让我感觉较为不满意的地方是,在实验开始之前我对于动态分区存储理解不是太深,从而加大了实验的难度。

对于这次出现的这个问题,我认真研究了课本基础知识,加强理解,也让我明白到了基础知识的重要性。

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

当前位置:首页 > 高中教育 > 初中教育

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

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