实验4动态分区存储管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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) /*上邻非空闲区,下邻为空闲区,与下邻合并*/ {