动态分区分配算法

1.实验步骤:

主函数:一个菜单栏的形式,可以选择要执行的算法。
首次适应算法:每次都从开始往后找满足条件的分区。
循环首次适应算法:从前一次找到的地方往后继续找分区。
最佳适应算法:先从小到大排序,找比前一个大后一个小的分区。
2.算法描述:

1.首次适应算法:该算法从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。
2.循环首次适应算法:该算法是首次适应算法的变种。在分配内存空间时,不再每次从表头(链首)开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。
3.最佳适应算法: 该算法总是把既能满足要求,又是最小的空闲分区分配给作业。为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足要求的空闲区,必然是最优的。孤立地看,该算法似乎是最优的,但事实上并不一定。因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。同时每次分配后必须重新排序,这也带来了一定的开销。

3.源代码:

#include
#include
#include
using namespace std;
struct info{
int quhao; //区号
int dress; //起始地址
int num; //大小
int free; //是否空闲
string name; //进程名
};
info IN[100]; //原始内存分配表
int Kong[100];//空闲分区表
int Ready[100];//已分配分区表

//初始化分区
void init(){
Kong[0]=0;
ifstream fen(“data.txt”);
// 从文件中导入内存分区表
for(int i=0;i<5;i++){
fen>>IN[i].quhao>>IN[i].dress>>IN[i].num>>IN[i].free;
Kong[i+1]=i;
Kong[0]+=1;
}
fen.close();
cout<<“原始内存分区”<<endl;
cout<<“区号 地址 大小 空闲”<<endl;
for(int i=0;i<5;i++){
cout<<IN[i].quhao<<" “<<IN[i].dress<<” “<<IN[i].num<<” "<<IN[i].free<<endl;
}
}

//显示空闲分区列表
void disp(){
cout<<“空闲分区列表”<<endl;
for(int i=0;i<5;i++){
if(IN[Kong[i+1]].free==1)
cout<<IN[i].quhao<<" "<<IN[i].num<<endl;
}
}

//内存紧凑
void Jin(int n){
int free=0;
for(int i=0;i<5;i++){
free+=IN[Kong[i+1]].num;
}
if(free>=n){
cout<<“通过紧凑操作后可以进行分配”<<endl;
}
}

//首次适应算法
void FirstFit(){
int n,i,flag=0;
string name;
init(); //初始化分区表
// 请求进程,直到请求的进程大小为0时停止
cout<<“请输入要申请的空间大小”<<endl;
cin>>n;
while(n){
cout<<“请输入进程名”<<endl;
cin>>name;
// 从空闲列表开始向后面查找满足条件的内存区
for(i=0;i<Kong[0];i++){
if(IN[Kong[i+1]].num>=n&&IN[Kong[i+1]].free1){
IN[Kong[i+1]].name=name;
IN[Kong[i+1]].free=0;//不空闲
IN[Kong[i+1]].num-=n;//减去空间大小
cout<<“分配区号:”<<IN[Kong[i+1]].quhao<<endl;
flag=1;
break;
}
}
// 若找不到合适的内存区则输出报错信息
if(flag
0){
cout<<“分配失败,没有合适的内存区”<<endl;
}
flag=0;
disp(); //显示现在空闲区的情况
cout<<“请输入要申请的空间大小”<<endl;
cin>>n;
}

}

//循环首次适应算法
void NextFit() {
int n,i,flag=0;
int xian;//保存上个分配区间的地址
string name;
init();
cout<<“请输入要申请的空间大小”<<endl;
cin>>n;
while(n){
cout<<“请输入进程名”<<endl;
cin>>name;
// 从上次分配的区块开始分配
for(i=xian;i<Kong[0];i++){
if(IN[Kong[i+1]].num>=n&&IN[Kong[i+1]].free1){
IN[Kong[i+1]].name=name;
IN[Kong[i+1]].free=0;
IN[Kong[i+1]].num-=n;//减去空间大小
cout<<“分配区号:”<<IN[Kong[i+1]].quhao<<endl;
xian=i;
flag=1;
break;
}
}
if(flag
0){
for(i=0;i<xian;i++){
if(IN[Kong[i+1]].num>=n&&IN[Kong[i+1]].free1){
IN[Kong[i+1]].name=name;
IN[Kong[i+1]].free=0;
IN[Kong[i+1]].num-=n;//减去空间大小
cout<<“分配区号:”<<IN[Kong[i+1]].quhao<<endl;
xian=i;
flag=1;
break;
}
}
}
if(flag
0){
cout<<“内存分配失败”<<endl;
}
disp();
cout<<“请输入要申请的空间大小”<<endl;
cin>>n;
}
}

// 按大小从小到大排序
void sort(){
int i,j;
for(i=0;i<5;i++){
for(j=1;j<5-i;j++){
if(IN[Kong[j+1]].num<IN[Kong[j]].num){
swap(Kong[j+1],Kong[j]);
}
}
}
// 显示排序后信息
cout<<“排序后的结果:”<<endl;
cout<<“区号 地址 大小 空闲”<<endl;
for(int i=0;i<5;i++){
cout<<IN[Kong[i+1]].quhao<<" “<<IN[Kong[i+1]].dress<<” “<<IN[Kong[i+1]].num<<” "<<IN[Kong[i+1]].free<<endl;
}
}

//最佳适应算法
void BestFit(){
int i,n,flag=0;
string name;
init();
sort();//给空闲分区按大小从小到大排序
cout<<“请输入要申请的空间大小”<<endl;
cin>>n;
while(n){
cout<<“请输入进程名”<<endl;
cin>>name;
if(IN[Kong[1]].num>=n){
IN[Kong[1]].name=name;
IN[Kong[1]].free=0;
IN[Kong[1]].num-=n;//减去空间大小
cout<<“分配区号:0”<<endl;
flag=1;
}
else{
for(i=1;i<Kong[0];i++){
if(IN[Kong[i+1]].num>=n&&IN[Kong[i]].num<n&&IN[Kong[i+1]].free1){
IN[Kong[i+1]].name=name;
IN[Kong[i+1]].free=0;
IN[Kong[i+1]].num-=n;//减去空间大小
cout<<“分配区号:”<<IN[Kong[i+1]].quhao<<endl;
flag=1;
break;
}
}
}
// 若找不到合适的内存区则输出报错信息
if(flag
0){
cout<<“分配失败,没有合适的内存区”<<endl;
}
flag=0;
disp(); //显示现在空闲区的情况
cout<<“请输入要申请的空间大小”<<endl;
cin>>n;
}
}

int main(){
int lx; //算法类型
cout<<“请选择一种算法:”<<endl;
cout<<“1.首次适应算法”<<endl;
cout<<“2.循环首次适应算法”<<endl;
cout<<“3.最佳适应算法”<<endl;
cout<<“0.退出”<<endl;
cin>>lx;
// 利用不同算法进行动态分区分配,直到输入为0
while(lx){
switch(lx){
case 1:FirstFit();
case 2:NextFit();
case 3:BestFit();
}
cout<<“请选择一种算法:” ;
cout<<“1.首次适应算法”<<endl;
cout<<“2.循环首次适应算法”<<endl;
cout<<“3.最佳适应算法”<<endl;
cout<<“0.退出”<<endl;
cin>>lx;
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值