动态分区分配算法

 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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值