1.实 验 目 的:
1.1熟悉并掌握动态分区分配的算法。
1.2熟悉并掌握动态分区中分区回收的各种情况,并能够实现相邻空闲分区合并。
2.实 验 环 境:
PC机、windows操作系统、VC++6.0
3.实 验 内 容 及 过 程:
3.1创建元素
3.2利用最佳适应算法(best fit algorithm),在从小到大排序的空闲区中,找到第一个满足要求的空闲区,并分配空间。
3.3通过输入要收回的作业编号,回收内存空间,若回收空间的周围是可分配空间,则合并。
3.4主函数部分,输入可分配空间的基本参数,执行参数,输出操作后的结果。
4.实 验 结 果 及 分 析:
4.1先输入可分配空间的基本参数
4.2选择内存分配,并输入作业的编号和所需的内存大小。若所需内存大于可分配空间,则显示分配失败。
4.3选择内存回收,输入要回收作业的编号。若回收空间与周围的可分配空间相邻,则合并。
4.4显示操作过后的可分配空间剩余。
5。实 验 心 得:
本次实验加深了我对计算机内存分配机制中的最佳适应算法的了解,学习了分区管理,要求的硬件支持少,管理算法简单,容易实现的优点和作业或进程的大小受分区大小控制,除非配合采用覆盖和交换技术的缺点。
6.附 录:
#include<bits/stdc++.h>
using namespace std;
typedef struct{
int size;
int start;
int state;
}Noallot;
typedef struct{
int size;
int start;
int state;
int os;
}Allot;
//size
int cmp1(Noallot a,Noallot b){
return {a.size<b.size} ;
}
//start
int cmp2(Noallot a,Noallot b){
return {a.start<b.start};
}
//----------------------
Noallot nt[10];
Allot at[10];
int n;
int cnt=0;
//-------------------------
void allot(){
int no,size,flag=0;
cout<<"输入作业编号及其所需空间"<<endl;
cin>>no>>size;
for (int i=0;i<n;i++){
if (nt[i].size>=size){
at[cnt].os=no;
at[cnt].size=size;
at[cnt].start=nt[i].start;
at[cnt].state=1;
nt[i].size=nt[i].size - size;
nt[i].start=nt[i].start+size;
if (nt[i].size==0) nt[i].state=0;
cnt++;
flag=1;
break;
}
}
if (!flag) cout<<"分区空间不足!"<<endl;
}
//--------------------------------
void recycle(){
int no,flag=0;
cout<<"输入要回收的作业编号"<<endl;
cin>>no;
for (int i=0;i<cnt;i++){
if (at[i].os==no){
flag=1;
sort(nt,nt+n,cmp2);
for(int j=0;j<n;j++){
if (at[i].start==nt[j].start+nt[j].size && nt[j+1].start==at[i].start+at[i].size){
at[i].state=0;
nt[j+1].state=0;
nt[j].size+=at[i].size+nt[j+1].size;
break;
}
if (at[i].start==nt[j].start+nt[j].size){
at[i].state=0;
nt[j].size+=at[i].size;
break;
}
if (nt[j].start==at[i].start+at[i].size){
at[i].state=0;
nt[j].start=at[i].start;
nt[j].size+=at[i].size;
break;
}
if (j==n-1){
nt[n].size=at[i].size;
nt[n].start=at[i].start;
nt[n].state=1;
n++;
break;
}
}
}
}
if (!flag) cout<<"要回收的作业不存在!"<<endl;
}
int main(){
cout<<"输入可分配空间的数量"<<endl;
cin>>n;
cout<<"输入分区大小和起始地址"<<endl;
for (int i=0;i<n;i++){
cin>>nt[i].size>>nt[i].start;
nt[i].state=1;
}
int m;
while (1){
cout<<"输入1为内存分配,2为内存回收" <<endl;
cin>>m;
sort(nt,nt+n,cmp1);
if (m==1) allot();
else if (m==2) recycle();
else break;
}
cout<<"可用分区大小和起始地址"<<endl;
for (int i=0;i<n;i++){
if (nt[i].state==1) cout<<nt[i].size<<" "<<nt[i].start<<endl;
}
return 0;
}