作業系統-動態分割槽分配模擬實驗
阿新 • • 發佈:2019-01-22
/* 動態分割槽分配方式模擬 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; }