实验2 可变分区管理 联系客服

发布时间 : 星期一 文章实验2 可变分区管理更新完毕开始阅读f238b0d2a58da0116c17491a

开始 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; }