动态分区存储管理Word文档格式.docx

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

动态分区存储管理Word文档格式.docx

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

动态分区存储管理Word文档格式.docx

4、分区的回收:

用户输入作业号,实现分区回收,同时,分区的合并要体现出来。

(注意:

不存在的作业号要给出错误提示!

5、分区的显示:

任何时刻,可以查看当前内存的情况(起始地址是什么,大小多大的分区时空闲的,或者占用的,能够显示出来)

6、要求考虑:

(1)内存空间不足的情况,要有相应的显示;

(2)作业不能同名,但是删除后可以再用这个名字;

(3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。

三、实验代码

#include<

stdio.h>

stdlib.h>

#defineSIZE800//内存初始大小

#defineMINSIZE5//碎片最小值

enumSTATE{Free,Busy};

structsubAreaNode{

intaddr;

//起始地址

intsize;

//分区大小

inttaskId;

//作业号

STATEstate;

//分区状态

subAreaNode*pre;

//分区前向指针

subAreaNode*nxt;

//分区后向指针

}subHead;

//初始化空闲分区链

voidintSubArea()

{

//分配初始分区内存

subAreaNode*fir=(subAreaNode*)malloc(sizeof(subAreaNode));

//给首个分区赋值

fir->

addr=0;

size=SIZE;

state=Free;

taskId=-1;

pre=&

subHead;

nxt=NULL;

//初始化分区头部信息

subHead.pre=NULL;

subHead.nxt=fir;

}

//首次适应算法

intfirstFit(inttaskId,intsize)

subAreaNode*p=subHead.nxt;

while(p!

=NULL)

{

if(p->

state==Free&

&

p->

size>

=size){

//找到要分配的空闲分区

size-size<

=MINSIZE){

//整块分配

state=Busy;

taskId=taskId;

}else{

//分配大小为size的区间

subAreaNode*node=(subAreaNode*)malloc(sizeof(subAreaNode));

node->

addr=p->

addr+size;

size=p->

size-size;

//修改分区链节点指针

pre=p;

nxt=p->

nxt;

nxt!

=NULL){

nxt->

pre=node;

}

nxt=node;

//分配空闲区间

size=size;

printf("

内存分配成功!

\n"

);

return1;

p=p->

找不到合适的内存分区,分配失败...\n"

return0;

//最佳适应算法

intbestFit(inttaskId,intsize)

subAreaNode*tar=NULL;

inttarSize=SIZE+1;

//寻找最佳空闲区间

=size&

size<

tarSize){

tar=p;

tarSize=p->

size;

if(tar!

if(tar->

tar->

addr=tar->

size=tar->

pre=tar;

nxt=tar->

//找不到合适的空闲分区

//回收内存

intfreeSubArea(inttaskId)

intflag=0;

subAreaNode*p=subHead.nxt,*pp;

state==Busy&

taskId==taskId){

flag=1;

if((p->

pre!

=&

subHead&

pre->

state==Free)

&

(p->

=NULL&

state==Free)){

//情况1:

合并上下两个分区

//先合并上区间

pp=p;

pre;

size+=pp->

nxt=pp->

pp->

free(pp);

//后合并下区间

pp=p->

if(pp->

}elseif((p->

pre==&

subHead||p->

state==Busy)

//情况2:

只合并下面的分区

state==Free)

nxt==NULL||p->

state==Busy)){

//情况3:

只合并上面的分区

//情况4:

上下分区均不用合并

if(flag==1){

//回收成功

内存分区回收成功...\n"

//找不到目标作业,回收失败

找不到目标作业,内存分区回收失败...\n"

//显示空闲分区链情况

voidshowSubArea()

当前的内存分配情况如下:

\n"

起始地址\t空间大小\t工作状态\t作业号\n"

%dk\t"

p->

addr);

size);

%s\t"

state==Free?

"

Free"

:

Busy"

taskId>

0){

%d"

taskId);

intmain()

intoption,ope,taskId,size;

//初始化空闲分区链

intSubArea();

//选择分配算法

while

(1)

请选择要模拟的分配算法:

0表示首次适应算法,1表示最佳适应算法\n"

scanf("

%d"

&

option);

if(option==0){

你选择了首次适应算法,下面进行算法的模拟\n"

break;

}elseif(option==1){

你选择了最佳适应算法,下面进行算法的模拟\n"

错误:

请输入0/1\n\n"

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

当前位置:首页 > PPT模板 > 商务科技

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

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