第一范文网 - 专业文章范例文档资料分享平台

实验2 可变分区管理

来源:用户分享 时间:2025/8/17 23:40:56 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

开始 S=释放区始址 L=释放区长度 查空闲区说明表 N 有与释放区的高地址邻接(上邻)的空闲区吗? Y 有与释放区下邻的空闲区吗? Y L=L+上邻空闲区长度 N 在空闲区说明表中找一空表目登记: 地址=S 长度=L 状态=未分配 Y 有与释放区下邻的空闲区吗? 把上邻空闲区登记栏中的状态置为“空表目”,且将空表目向后调整 N 把上邻空闲区登记栏中的始址改为S,长度改为L 按地址顺序调整和紧缩空闲区说明表 把下邻空闲区登记栏中的长度改为:长度=长度+L 有等待装入的作业吗? Y 唤醒等待的作业并返回 N 返回 图3 首次适应算法回收框图

(4) 请按首次适应算法设计内存分配和回收程序。以表2当前使用的基础,初始化空闲区和已分配区说明表值。设计一个作业申请队列以及作业完成后的释放顺序,实现内存的分配与回收。把空闲区说明表的变化情况以及各作业的申请、释放情况显示或打印出来。

表2 空闲区说明表 起始地址 20K 80K 150K 300K 600K ?? ?? 长度 20KB 50KB 100KB 30KB 100KB ?? ?? 状态 1 1 1 0(空表目) 1 空表目 ?? 参考程序

#include \#define N 5 struct freearea /*定义一个空闲区说明表结构,并初始化变量*/ {

int startaddress; /*空闲区始址*/ int size; /*空闲区大小*/ int state; /*空闲区状态:0表示空表目,1为可用空闲块*/ }freeblock[N]={{20,20,1},{80,50,1},{150,100,1},{300,30,0},{600,100,1}}; /*定义为作业分配主存空间的函数alloc()*/

int alloc(int applyarea) /*applyarea为作业申请量*/ {

int i,tag=0; /*tag为检查是否有满足作业需要的空闲区的标志*/ for(i=0;i

if(freeblock[i].state==1 & freeblock[i].size>applyarea) { freeblock[i].startaddress=freeblock[i].startaddress+applyarea; freeblock[i].size=freeblock[i].size-applyarea; tag=1; /*有满足条件的空闲区时,tag置为1*/

return freeblock[i].startaddress-applyarea; } else if(freeblock[i].state==1 && freeblock[i].size==applyarea) { freeblock[i].state=0; tag=1; /*有满足条件的空闲区时,tag置为1*/ return freeblock[i].startaddress; /*返回为作业分配的主存地址*/

} if(tag==0) return -1; /*没有满足条件的空闲区,分配不成功,返回-1*/

}

/*定义主存回收函数:setfree() */

/*tag1代表释放区的高地址是否邻接一个空闲区,tag2代表释放区的高低地址是否都邻接一个空闲区,

tag3代表释放区的低地址是否邻接一个空闲区*/ void setfree() {

int s,la,tag1=0,tag2=0,tag3=0,i,j;

printf(\ scanf(\ /*输入释放区的开始地址*/ printf(\ scanf(\ /*输入释放区的大小*/ for(i=0;i

{ freeblock[i].state=0; freeblock[j].size=freeblock[j].size+la; tag2=1; /*有与释放区上下都邻接的空闲区*/ break; } if(tag2==0) /*无与释放区高地址邻接的空闲区*/ { freeblock[i].startaddress=s; freeblock[i].size=la; break; } } }

if(tag1==0) /*无与释放区高地址邻接的空闲区,检查是否低地址有邻接空闲区*/

{ for(i=0;i

{ freeblock[i].size=freeblock[i].size +la; tag3=1; /*有与释放区的低地址邻接的空闲区*/ break; } if(tag3==0) /*没有与释放区的低地址邻接的空闲区*/ for(j=0;j

{ freeblock[j].startaddress=s; freeblock[j].size=la; freeblock[j].state=1; break; }

搜索更多关于: 实验2 可变分区管理 的文档
实验2 可变分区管理.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c9g8mo87vyl68ub00wpi2_4.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top