1. 程式人生 > >作業系統-動態分割槽分配模擬實驗

作業系統-動態分割槽分配模擬實驗

/*   動態分割槽分配方式模擬   FF演算法*/
#include <iostream>

using namespace std;
//記憶體空間起始和末尾地址
int minAdress=0;
int maxAdress=640;

//一個程序佔用的一個記憶體區,s為起始位置,e為末尾位置
struct Area{
    int id;
  int s;
  int e;
};

//已經得到記憶體空間的程序數量
int count = 0;
//程序的id
int id=1;

//已經分配出去的記憶體空間
Area area[100];

void sort();
void show();
bool alloc(int size);
void free(int id);
int main()
{
     cout<<"作業1申請130KB"<<endl;
     if(alloc(130))
     show();
      else
        cout<<"分配失敗,記憶體空間不足"<<endl;


     cout<<"作業2申請60KB"<<endl;
     if(alloc(60))
     show();
      else
        cout<<"分配失敗,記憶體空間不足"<<endl;


     cout<<"作業3申請100KB"<<endl;
     if(alloc(100))
     show();
      else
        cout<<"分配失敗,記憶體空間不足"<<endl;


     cout<<"作業2釋放60KB"<<endl;
     free(2);
     show();


     cout<<"作業4申請200KB"<<endl;
     if(alloc(200))
     show();
      else
        cout<<"分配失敗,記憶體空間不足"<<endl;


     cout<<"作業3釋放100KB"<<endl;
     free(3);
     show();


     cout<<"作業1釋放130KB"<<endl;
     free(1);
     show();


     cout<<"作業5申請140KB"<<endl;
     if(alloc(140))
     show();
     else
        cout<<"分配失敗,記憶體空間不足"<<endl;


     cout<<"作業6申請60KB"<<endl;
     if(alloc(60))
     show();
     else
     cout<<"分配失敗,記憶體空間不足"<<endl;


     cout<<"作業7申請50KB"<<endl;
     if(alloc(50))
     show();
     else
        cout<<"分配失敗,記憶體空間不足"<<endl;


     cout<<"作業6釋放60KB"<<endl;
     free(6);
     show();


     cout<<"作業8申請160KB"<<endl;
     if(alloc(160))
     show();
     else
        cout<<"分配失敗,記憶體空間不足"<<endl;



     cout<<"作業9申請150KB"<<endl;
     if(alloc(150))
     show();
     else
        cout<<"分配失敗,記憶體空間不足"<<endl;

}

//釋放空間的函式
void free(int id){
  for(int i=0;i<count;i++)
  {
      //釋放指定記憶體空間
      if(area[i].id==id){
            //長江後浪推前浪
        for(int j=i+1;j<count;j++){
            area[i]=area[j];
        }
        count--;
        //重新排序
        sort();
        break;
      }
  }
}

//分配地址方法,size為申請記憶體空間大小
bool alloc(int size){
   if(size>maxAdress)return false;

   //全部記憶體空間閒置時
   if(count==0){
     //直接從起始地址分配
     Area tmp;
     tmp.id=id++;
     tmp.s=0;
     tmp.e=size;
     area[count++]=tmp;
     return true;
   }
   else{
        //每次查詢的起始位置
        int s = 0;
         //從已經分配的地址中獲得空閒記憶體的末地址
        for(int i=0;i<count;i++){
            //如果查詢起始位置和下一個被分配的起始地址大小足夠
            if(area[i].s-s>=size){
                Area tmp;
                tmp.s=s;
               tmp.e=size+s;
               tmp.id=id++;
               area[count++]=tmp;
              //排序
               sort();
               return true;
            }
            else
            {
                //移動查詢起始位置
                s=area[i].e;
            }
        }
        //查詢最後剩下的空間是否足夠
        if(maxAdress-s>=size)
        {
            Area tmp ;
            tmp.s=s;
            tmp.e=s+size;
            tmp.id=id++;
            area[count++]=tmp;
            sort();
            return true;
        }
        //找不到合適的空間
        id++;
        return false;
   }

}

void sort(){
    //按起始地址順序氣泡排序
   for(int i=0;i<count-1;i++){
     for(int j=i+1;j<count;j++){
        if(area[i].s>area[j].s){
            Area tmp = area[i];
            area[i]=area[j];
            area[j]=tmp;
        }
     }
   }
}

//顯示空閒分割槽的函式
void show(){
    cout<<"空閒分割槽:";
    int s=0;
  for(int i=0;i<count;i++){
    if(area[i].s-s>0){
        cout<<"["<<s<<","<<area[i].s<<"]   ";
    }
    s=area[i].e;
  }
  if(maxAdress-s>0){
     cout<<"["<<s<<","<<maxAdress<<"]   ";
  }
  cout<<endl;
  cout<<"佔用分割槽:";
  for(int i=0;i<count;i++){
    cout<<"["<<area[i].s<<","<<area[i].e<<"]     ";
  }
  cout<<endl<<"================================================="<<endl;

}







/*動態分割槽分配 的模擬  BF演算法*/
#include <iostream>

using namespace std;

//記憶體空間起始和末尾地址
int minAdress=0;
int maxAdress=640;

//一個程序佔用的一個記憶體區,s為起始位置,e為末尾位置
struct Area{
    int id;
  int s;
  int e;
};
//空閒空間
struct Leisure{
  int s;
  int e;
  int size;
};

//已經分配出去的記憶體空間
Area area[100];
//未被分配的空閒空間
Leisure ls[100];
//已經得到記憶體空間的程序數量
int count = 0;
//空閒空間塊數
int count2=0;
//程序ID
int id=1;

bool alloc(int size);
void divide(int i,int size);
void sort();
void show();
void free(int id);

int main(){
    Leisure leis={minAdress,maxAdress,maxAdress-minAdress};
    ls[count2++]=leis;

     cout<<"作業1申請130KB"<<endl;
     if(alloc(130))
     show();
     else
     cout<<"分配失敗,記憶體空間不足"<<endl<<"========================================="<<endl;


     cout<<"作業2申請60KB"<<endl;
     if(alloc(60))
     show();
     else
     cout<<"分配失敗,記憶體空間不足"<<endl;

     cout<<"作業3申請100KB"<<endl;
     if(alloc(100))
     show();
     else
     cout<<"分配失敗,記憶體空間不足"<<endl<<"========================================="<<endl;

     cout<<"作業2釋放60KB"<<endl;
     free(2);
     show();

     cout<<"作業4申請200KB"<<endl;
     if(alloc(200))
     show();
     else
     cout<<"分配失敗,記憶體空間不足"<<endl<<"========================================="<<endl;

     cout<<"作業3釋放100KB"<<endl;
     free(3);
     show();

     cout<<"作業1釋放130KB"<<endl;
     free(1);
     show();

     cout<<"作業5申請140KB"<<endl;
     if(alloc(140))
     show();
     else
     cout<<"分配失敗,記憶體空間不足"<<endl<<"========================================="<<endl;

     cout<<"作業6申請60KB"<<endl;
     if(alloc(60))
     show();
     else
     cout<<"分配失敗,記憶體空間不足"<<endl<<"========================================="<<endl;

     cout<<"作業7申請50KB"<<endl;
     if(alloc(50))
     show();
     else
     cout<<"分配失敗,記憶體空間不足"<<endl<<"========================================="<<endl;

     cout<<"作業6釋放60KB"<<endl;
     free(6);
     show();

       cout<<"作業8申請350KB"<<endl;
     if(alloc(350))
     show();
     else
     cout<<"分配失敗,記憶體空間不足"<<endl<<"========================================="<<endl;

     cout<<"作業7釋放50KB"<<endl;
     free(7);
     show();

}

void free(int id){
    for(int i=0;i<count;i++){
            if(area[i].id==id){
                //查詢被分配空間是否有臨接未被分配空間
            for(int j=0;j<count2;j++){
            //未被分配空間後面接待釋放空間
              if(ls[j].e==area[i].s){
                 //三合一
                 if(ls[j+1].s==area[i].e){
                    ls[j].e=ls[j+1].e;
                    ls[j].size=ls[j].size+(area[i].e-area[i].s)+ls[j+1].size;
                    for(int k=i+1;k<count2-1;k++){
                        ls[k]=ls[k+1];
                    }
                    count2--;
                 }
                 //二合一
                 else{
                    ls[j].e=area[i].e;
                    ls[j].size+=(area[i].e-area[i].s);
                 }
                //刪除已分配空間
                for(int k=i;k<count-1;k++)
                    area[k]=area[k+1];
                    count--;
                    sort();
                    return;
              }
              //待釋放空間後面接未被分配空間
              else if(ls[j].s==area[i].e){
                ls[j].s=area[i].s;
                ls[j].size+=(area[i].e-area[i].s);
                 sort();
                //刪除已分配空間
                for(int k=i;k<count-1;k++)
                    area[k]=area[k+1];
                    count--;
                    return ;
              }
            }
              //待釋放空間不臨接未被分配空間
                  //新建未分配空間塊
                  Leisure l = {area[i].s,area[i].e,area[i].e-area[i].s};
                  ls[count2++]=l;
                   sort();
                  //刪除已分配空間
                for(int k=i;k<count-1;k++)
                    area[k]=area[k+1];
                    count--;
                    return;
      }
    }
}

bool alloc(int size){
    //從空閒記憶體區查詢是否有足夠的空間
   for(int i=0;i<count2;i++){
         //該空間大於需要空間
        if(ls[i].size>size){
            //分配空間
            Area a={id++,ls[i].s,ls[i].s+size};
            area[count++]=a;
           //把這塊分部分出去
            divide(i,size);
            return true;
        }
        //該空間等於需要空間
        else if(ls[i].size==size){
            Area a={id++,ls[i].s,ls[i].s+size};
            area[count++]=a;
            //由於已經排序,所以直接移除該空間並讓後面的移到前面
            for(int j=count2-1;j>=i;j--){
                ls[j-1]=ls[j];
            }
            count2--;
            return true;
        }
   }
   //保持id一致
   id++;
   return false;
}

//縮減第i塊空閒分割槽,用以劃分給程序
void divide(int i,int size)
{
    ls[i].s=ls[i].s+size;
    ls[i].size-=size;
}

//重新整理未分配空間
void sort(){
    for(int i=0;i<count2-1;i++){
        for(int j=i+1;j<count2;j++){
            if(ls[i].size>ls[j].size){
                Leisure l = ls[i];
                ls[i]=ls[j];
                ls[j]=l;
            }
        }
    }
}

void show(){
    cout<<"空閒記憶體區:";
  for(int i=0;i<count2;i++){
    cout<<"["<<ls[i].s<<","<<ls[i].e<<"]    ";
  }
  cout<<endl<<"佔用空間:";
  for(int i=0;i<count;i++){
    cout<<"["<<area[i].s<<","<<area[i].e<<"]      ";
  }
  cout<<endl<<"==================================================="<<endl;

}