实验4动态分区存储管理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四、动态分区存储管理

(一)、实验目的和要求

为了进一步提高主存的利用率,使存储空间划分更加适应不同的作业组合,人们设计可变式分区方案。本实验要求模拟放置与回收策略算法,加深对动态分区存储管理的理解。(二)、实验内容

本实验模拟了最佳适应算法分配算法,最坏适应算法、首次适应算法同学们可以据此自己实现。

实验原理:

放置策略:

首次适应算法的表是按空闲区首址升序的(即空闲区表是按空闲区首址从小到大)方法组织的。最佳适应算法是将申请者放入与其大小最接近、切割后的空闲区最小的空闲区中。若系统中有与申请区大小相等的空闲区。最坏适应算法的空闲区表是按空闲区大小降序的方法组织的(从大到小的顺序)。

回收算法

当一个进程(或程序)释放某内存区时,要调用存储区释放算法release,它将首先检查释放区是否与空闲区表(队列)中的其它空闲区相邻,若相邻则合并成一个空闲区,否则,将释放的一个空闲区插入空闲区表(或队列)中的适当位置。

空闲释放区与空闲区相邻有四种情况。

上邻空闲区

下上邻空闲区

上、下邻空闲区

上、下邻已分配区

(三)、实验环境

1、pc

2、vc++

(四)、程序源代码:

#include

#include

#include

#include

#define n 10

#define m 10

#define minisize 100

struct

{

float address;

float length;

int flag;

}used_table[n];

struct

{

float address;

float length;

int flag;

}free_table[m];

void allocate(char J,float xk)

{

int i,k;

float ad;

k=-1;

for(i=0; i

if(free_table[i].length>=xk&&free_table[i].flag==1) if(k==-1||free_table[i].length

if(k==-1)

{

printf("无可用空闲区\n");

return;

}

if(free_table[k].length-xk<=minisize)

{

free_table[k].flag=0;

ad=free_table[k].address;

xk=free_table[k].length;

}

else{

free_table[k].length=free_table[k].length-xk;

ad=free_table[k].address+free_table[k].length;

}

i=0;

while(used_table[i].flag!=0&&i

i++;

if(i>=n)

{

printf("无表目填写已分分区,错误\n");

if(free_table[k].flag==0)

free_table[k].flag=1;

else

{

free_table[k].length=free_table[k].length+xk; return;

}

}

else

{

used_table[i].length=xk;

used_table[i].flag=J;

}

return;

}

void reclaim(char J)

{

int i,k,j,s,t;

float S,L;

s=0;

while((used_table[s].flag!=J||used_table[s].flag==0)&&s

s++;

if(s>=n)

{

printf("找不到该作业\n");

return;

}

used_table[s].flag=0;

S=used_table[s].address;

L=used_table[s].length;

j=-1;

k=-1;

i=0;

while(i

{

if(free_table[i].flag==1)

{

if(free_table[i].address+free_table[i].length==S)k=i;

if(free_table[i].address==S+L)j=i;

}

i++;

}

if(k!=-1)

if(j!=-1) /* 上邻空闲区,下邻空闲区,三项合并*/

{

free_table[k].length=free_table[j].length+free_table[k].length+L; free_table[j].flag=0;

}

else

/*上邻空闲区,下邻非空闲区,与上邻合并*/

free_table[k].length=free_table[k].length+L;

else if(j!=-1) /*上邻非空闲区,下邻为空闲区,与下邻合并*/ {

相关文档
最新文档