欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      計算機操作系統(tǒng)動態(tài)分區(qū)存儲管理方式下的內(nèi)存空間的分配與回收實驗報告

      時間:2019-05-14 02:23:09下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《計算機操作系統(tǒng)動態(tài)分區(qū)存儲管理方式下的內(nèi)存空間的分配與回收實驗報告》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《計算機操作系統(tǒng)動態(tài)分區(qū)存儲管理方式下的內(nèi)存空間的分配與回收實驗報告》。

      第一篇:計算機操作系統(tǒng)動態(tài)分區(qū)存儲管理方式下的內(nèi)存空間的分配與回收實驗報告

      計算機操作系統(tǒng)

      實驗報告

      實驗二

      實驗題目:存儲器管理

      系別:計算機科學(xué)與技術(shù)系

      班級:

      姓名:

      學(xué)號:2

      一、實驗?zāi)康?/p>

      深入理解動態(tài)分區(qū)存儲管理方式下的內(nèi)存空間的分配與回收。

      二、實驗內(nèi)容

      編寫程序完成動態(tài)分區(qū)存儲管理方式下的內(nèi)存分配和回收的實現(xiàn)。具體內(nèi)容包括:

      確定用來管理內(nèi)存當(dāng)前使用情況的數(shù)據(jù)結(jié)構(gòu); 采用首次適應(yīng)算法完成內(nèi)存空間的分配; 分情況對作業(yè)進行回收;

      編寫主函數(shù)對所做工作進行測試。

      三、實驗原理

      分配:動態(tài)分區(qū)存儲管理方式把內(nèi)存除OS占用區(qū)域外的空間看作一個大的空閑區(qū)。當(dāng)作業(yè)要求裝入內(nèi)存時,根據(jù)作業(yè)需要內(nèi)存空間的大小查詢內(nèi)存中各個空閑區(qū),當(dāng)從內(nèi)存中找到一個大于或等于該作業(yè)大小的內(nèi)存空閑區(qū)時,選擇其中一個空閑區(qū),按作業(yè)要求劃出一個分區(qū)裝入該作業(yè)。

      回收:作業(yè)執(zhí)行完后,它所占用的內(nèi)存空間被收回,成為一個空閑區(qū)。如果該空閑區(qū)的相鄰分區(qū)也是空閑區(qū),則需要將相鄰空閑區(qū)合并成一個空閑區(qū)。

      四、實驗方法

      實現(xiàn)動態(tài)分區(qū)的分配與回收,主要考慮三個問題:

      第一、設(shè)計記錄內(nèi)存使用情況的數(shù)據(jù)表格,用來記錄空閑區(qū)和作業(yè)占用的區(qū)域(利用結(jié)構(gòu)體類型數(shù)組來保存數(shù)據(jù));

      第二、在設(shè)計的數(shù)據(jù)表格基礎(chǔ)上設(shè)計內(nèi)存分配算法(采用首次適應(yīng)算法找合適的分區(qū)(對空閑分區(qū)表進行排序),分配時要考慮碎片問題);

      第三、在設(shè)計的數(shù)據(jù)表格基礎(chǔ)上設(shè)計內(nèi)存回收算法(分四種情況進行回收(上鄰、下鄰、上下鄰和無相鄰分區(qū))。

      五、實驗步驟

      第一,設(shè)計記錄內(nèi)存使用情況的數(shù)據(jù)表格 ? 已分配分區(qū)表:起始地址、長度、標(biāo)志(0表示“空表項”,1表示“已分配”)? 空閑分區(qū)表:

      起始地址、長度、標(biāo)志(0表示“空表項”,1表示“未分配”)

      struct used_table { float address;

      //已分分區(qū)起始地址

      float length;

      //已分分區(qū)長度,單位為字節(jié)

      int flag;

      //已分配表區(qū)登記欄標(biāo)志,用0表示空欄目,char zuoyename;};

      //已分配區(qū)表

      Struct free_table[ { float address;

      //空閑分區(qū)起始地址

      float length;

      //空閑分區(qū)長度,單位為字節(jié)

      int flag;

      //空閑分區(qū)表登記欄目用0表示空欄目,1表示未配 };//空閑分區(qū)表

      第二,在設(shè)計的表格上進行內(nèi)存分配

      ? 首次適應(yīng)算法:為作業(yè)分配內(nèi)存,要求每次找到一個起始地址最小的適合作業(yè)的分區(qū)(按起始地址遞增排序)。

      ? 最大碎片size:要求當(dāng)找到的空閑分區(qū)-作業(yè)的大小的值小于或等于size時,將該分區(qū)全部分配給作業(yè)(數(shù)組后面元素向前移); ? 否則,給作業(yè)分割出一部分空間時,其余部分仍作為新的空閑分區(qū)登記(空閑分區(qū)長度=空閑分區(qū)長度-作業(yè)長度, ? 空閑分區(qū)起始地址=空閑分區(qū)起始地址+作業(yè)長度 第三,在設(shè)計的表格上進行內(nèi)存回收。

      1、上鄰:條件:回收作業(yè)的始址=某個空閑區(qū)的始址+長度

      操作:空閑區(qū)的長度=空閑區(qū)的長度+作業(yè)的大小

      2、下鄰:條件:回收作業(yè)的始址+作業(yè)的長度=某個空閑區(qū)的始址

      操作: 空閑區(qū)的始址=回收作業(yè)的始址

      空閑區(qū)的長度=空閑區(qū)的長度+作業(yè)的長度

      3、上下鄰:條件:1,2條件同時成立

      操作:空閑區(qū)的始址=上鄰的始址

      空閑區(qū)的長度=上鄰的長度+作業(yè)的長度+下鄰的長度

      刪除下鄰

      4、無上下鄰:

      操作:找flag=0的行

      空閑區(qū)的始址=回收作業(yè)的始址

      空閑區(qū)的長度=作業(yè)的長度

      六、實驗代碼

      # include # include #define M 10 //允許的空閑區(qū)表長最大為m #define N 10 //允許的最大作業(yè)數(shù)量為n #define MIN 1 //碎片的最大值

      #define SADDRESS 200 //空閑分區(qū)初始的起始地址 #define SLENGTH 150000 //空閑分區(qū)的初始長度 struct used_t{ float address;//已分分區(qū)起始地址

      float length;//已分分區(qū)長度

      int flag;//已分配表區(qū)登記欄標(biāo)志,用0表示空欄目

      }used_table[N];struct free_t{ float address;//空閑分區(qū)起始地址

      float length;//空閑分區(qū)長度 int flag;//空閑分區(qū)表登記欄目用0表示空欄目,1表示未分配

      }free_table[M];//空閑分區(qū)表

      void allocate(char,float);//分配算法子程序 void reclaim(char);//回收算法子程序 void main(){ int i,a;float zyl;char zyn;//空閑分區(qū)表初始化

      free_table[0].address=SADDRESS;//空閑分區(qū)表的起始地址

      free_table[0].length=SLENGTH;//空閑分區(qū)表的長度 free_table[0].flag=1;//標(biāo)志位置1表示未分配

      for(i=1;i

      free_table[i].length=0;

      free_table[i].flag=0;} //0表示空欄目

      //已分分區(qū)表初始化 for(i=0;i

      used_table[i].length=0;

      used_table[i].flag=0;} while(1){cout<<“請選擇功能項:”<

      <<“1-分配主存”<

      <<“2-回收主存”<

      <<“3-顯示主存”<

      <<“0-退出”<

      <<“選擇功能項(0-3):”;

      cin>>a;switch(a){case 0: //當(dāng)選擇0時退出程序

      return;

      case 1: { //a=1 分配主存空間

      cout<<“n請輸入作業(yè)名zyn和作業(yè)所需長度zyl(作業(yè)名為一個字符,長度zyl要小于”<

      cin>>zyn>>zyl;

      allocate(zyn,zyl);//為作業(yè)zyn分配主存空間

      break;

      } case 2:{ // a=2 回收主存空間

      cout<<“n請輸入要回收分區(qū)的作業(yè)名:”;

      cin>>zyn;

      reclaim(zyn);//回收作業(yè)zyn的主存空間

      break;} case 3: { //a=3 顯示主存情況,輸出空閑區(qū)表和已分配區(qū)表 cout<<“n輸出空閑區(qū)表:”<

      <<“ 起始地址 分區(qū)長度 標(biāo)志”<

      for(i=0;i

      if(free_table[i].flag!=0)cout<

      cin.get();

      cout<<“n輸出已分配區(qū)表:”<

      <<“ 起始地址 分區(qū)長度 標(biāo)志”<

      for(i=0;i

      cout<

      <

      break;}

      default:{

      cout<<“n沒有該選項!”<

      break;

      }}} cin.get()}//分配算法子程序

      void allocate(char zyn,float zyl){ float ad;int k=-1;int i=0;while(i

      if(free_table[i].length>=zyl&&free_table[i].flag==1)

      k=i;

      i++;} if(k==-1){ //未找到可用空閑區(qū),返回

      cout<<“無可用空閑區(qū)!”<

      return;} /*找到可用空閑區(qū),開始分配:若空閑區(qū)大小與作業(yè)要求分配的空間差小于MIN,則將找到的空閑區(qū)全部分配給該作業(yè);若空閑區(qū)大小與要求分配的空間的差大于minisize,則從空閑區(qū)劃出一部分分配給作業(yè)。*/ if(free_table[k].length-zyl<=MIN){ free_table[k].flag=0;ad=free_table[k].address;zyl=free_table[k].length;for(i=k;i

      free_table[i]=free_table[i+1];} else{ free_table[k].length=free_table[k].length-zyl;ad=free_table[k].address;free_table[k].address=free_table[k].address+zyl;} /*修改已分配區(qū)表*/ i=0;while(used_table[i].flag!=0&&i

      s++;//找到作業(yè)zyn在以分配表中的表目s if(s>=N){ cout<<“找不到該作業(yè)!”<

      S=used_table[s].address;//取作業(yè)zyn在內(nèi)存中的首地址

      L=used_table[s].length;//取作業(yè)zyn所分配到的內(nèi)存的長度

      j=-1;k=-1;i=0;//尋找回收分區(qū)的上下鄰空閑區(qū),上鄰表目k,下鄰表目j while(i

      if(free_table[i].address==S+L)j=i;}

      i++;} if(k!=-1){ //有上鄰空閑區(qū)

      if(j!=-1){ //有下鄰空閑區(qū) 即有上下鄰空閑區(qū),三項合并

      free_table[k].length=free_table[k].length+free_table[j].length+L;

      free_table[j].flag=0;} else //上鄰空閑區(qū),下鄰非空閑區(qū),與上鄰合并

      free_table[k].length=free_table[k].length+L;}//if else { //k==-1 無上鄰空閑區(qū)

      if(j!=-1){ //無上鄰空閑區(qū),有下鄰空閑區(qū),與下鄰合并 free_table[j].address=S;free_table[j].length=free_table[j].length+L;} else{ //j==-1 上下鄰均為非空閑區(qū),回收區(qū)域直接填入 t=0;//在空閑區(qū)表中尋找空欄目

      while(free_table[t].flag==1&&t=M){ //空閑區(qū)表滿,回收空間失敗,將已分配區(qū)表復(fù)原

      cout<<“主存空閑表沒有空間,回收失?。 ?

      return;

      } free_table[t].address=S;

      free_table[t].length=L;

      free_table[t].flag=1;}} for(i=0;i<=M-1;i++)for(int j=i;jfree_table[j].address){ free_t temp;temp=free_table[i];free_table[i]=free_table[j];free_table[j]=temp;}}

      七、實驗結(jié)果

      1、總的存儲空間

      2、分配空間

      3、回收空間(1)有上下鄰

      (2)有上鄰

      (3)有下鄰

      (4)無上下鄰,回收7

      八、實驗總結(jié)

      1、通過實驗學(xué)會了理解動態(tài)分區(qū)存儲管理方式下的內(nèi)存空間的分配與回收

      2、學(xué)會了回收的四種方式

      3、實驗過程中遇到了問題,學(xué)會了與同學(xué)探討解決

      第二篇:操作系統(tǒng)實驗報告-可變分區(qū)存儲管理方式的內(nèi)存分配回收

      實驗三 可變分區(qū)存儲管理方式的內(nèi)存分配回收

      一.實驗?zāi)康?/p>

      (1)深入了解可變分區(qū)存儲管理方式的內(nèi)存分配回收的實現(xiàn)。

      二.實驗內(nèi)容

      編寫程序完成可變分區(qū)存儲管理方式的內(nèi)存分配回收,要求有內(nèi)存空間分配表,并采用最優(yōu)適應(yīng)算法完成內(nèi)存的分配與回收。

      三.實驗原理

      在可變分區(qū)模式下,在系統(tǒng)初啟且用戶作業(yè)尚未裝入主存儲器之前,整個用戶區(qū)是一個大空閑分區(qū),隨著作業(yè)的裝入和撤離,主存空間被分成許多分區(qū),有的分區(qū)被占用,而有的分區(qū)時空閑的。為了方便主存空間的分配和去配,用于管理的數(shù)據(jù)結(jié)構(gòu)可由兩張表組成:“已分配區(qū)表”和“未分配區(qū)表”。在“未分配表中”將空閑區(qū)按長度遞增順序排列,當(dāng)裝入新作業(yè)時,從未分配區(qū)表中挑選一個能滿足用戶進程要求的最小分區(qū)進行分配。這時從已分配表中找出一個空欄目登記新作業(yè)的起始地址和占用長度,同時修改未分配區(qū)表中空閑區(qū)的長度和起始地址。當(dāng)作業(yè)撤離時已分配區(qū)表中的相應(yīng)狀態(tài)變?yōu)椤翱铡保鴮⑹栈氐姆謪^(qū)登記到未分配區(qū)表中,若有相鄰空閑區(qū)再將其連接后登記??勺兎謪^(qū)的回收算法較為復(fù)雜,當(dāng)一個作業(yè)撤離時,可分為4種情況:其臨近都有作業(yè)(A和B),其一邊有作業(yè)(A或B),其兩邊均為空閑區(qū)。尤其重要的是,在程序中利用“new類型T(初值列表)”申請分配用于存放T類型數(shù)據(jù)的內(nèi)存空間,利用“delete指針名”釋放指針?biāo)赶虻膬?nèi)存空間。

      四.實驗部分源程序

      #include using namespace std;typedef struct SNode { // Space Node

      int start,end;// 起始,結(jié)束

      int length;// 長度大小

      struct SNode *next;// 指向下一結(jié)點的指針 }* SP;SP Head=(SP)malloc(sizeof(SNode));// 全局變量,內(nèi)存空間頭結(jié) void DispSpace(){ // 顯示內(nèi)存空間分配情況

      SP p=Head->next;

      cout<<“n 空閑區(qū)說明表 n”

      <<“---地址--長度---n”;

      while(p)

      {

      cout<<“

      ”<

      start

      <<“

      ”<

      length<

      p=p->next;

      }

      cout<<“----------------n”;}

      void Initial(){ // 初始化說明表

      SP p,q;

      p=(SP)malloc(sizeof(SNode));

      q=(SP)malloc(sizeof(SNode));

      p->start=14;p->length=12;p->end=26;

      q->start=32;q->length=96;q->end=128;// 指導(dǎo)書上的作業(yè)分配

      Head->next=p;// 與頭結(jié)點連接

      p->next=q;

      q->next=NULL;

      DispSpace();}

      void Allocation(int len){ // 分配內(nèi)存給新作業(yè)

      SP p=Head->next,q;

      while(p){

      if(p->length < len)

      p=p->next;

      else if(p->length > len)

      {

      p->start=p->start+len;

      p->length=p->length-len;

      cout<<“分配成功!n”;

      DispSpace();return;

      }

      else

      {//當(dāng)兩者長度相等

      q=p->next;

      p->next=q->next;

      cout<<“分配成功!n”;

      DispSpace();return;

      }

      }

      cout<<“分配失敗!n”;

      DispSpace();return;}

      void CallBack(int sta,int len){ // 回收內(nèi)存

      SP p=Head,q=p->next,r;// 開始地址和長度

      p->end=0;

      int en=sta+len;

      while(q){

      if(sta == 0){ // 初始地址為0

      if(en == q->start){ // 正好回收

      q->start=0;

      q->length=q->end;

      return;

      }

      else {

      r=(SP)malloc(sizeof(SNode));

      r->start=sta;r->length=len;r->end=en;

      p->next=r;

      r->next=q;

      return;

      }

      }

      else if((p->end < sta)&&(q->start > en)){ // 上鄰區(qū)

      r=(SP)malloc(sizeof(SNode));

      r->start=sta;r->length=len;r->end=en;

      p->next=r;

      r->next=q;

      return;

      }

      else if((p->end < sta)&&(q->start == en)){ // 鄰區(qū)相接

      q->start=sta;

      q->length=q->end-sta;

      return;

      }

      else if((p->end == sta)&&(q->start < en)){ // 下鄰區(qū)

      p->end=en;

      p->length=en-p->start;

      return;

      }

      else if(p->end==sta && q->start==en){ // 鄰區(qū)相接

      p->end=q->end;

      p->length=p->end-p->start;

      p->next=q->next;

      return;

      }

      else {

      p=p->next;

      q=q->next;

      }

      } } void main(){

      Initial();

      cout<<“現(xiàn)在分配大小為 6K 的作業(yè) 4 申請裝入主存: ”;

      Allocation(6);// 分配時參數(shù)只有長度

      //--------指導(dǎo)書測試數(shù)據(jù)演示----------

      cout<<“現(xiàn)回收作業(yè) 3(起址10,長度4)n”;

      CallBack(10,4);

      DispSpace();

      cout<<“現(xiàn)回收作業(yè) 2(起址26,長度6)n”;

      CallBack(26,6);

      DispSpace();

      //---------------演示結(jié)束-------------

      system(“pause”);}

      五.實驗結(jié)果與體會

      我的體會:

      第三篇:操作系統(tǒng)課程設(shè)計_動態(tài)分區(qū)分配存儲管理

      操作系統(tǒng)課程設(shè)計

      設(shè)計題目 動態(tài)分區(qū)分配存儲管理

      學(xué)生姓名學(xué)

      號 專業(yè)班級 指導(dǎo)教師

      呂 霆

      20102675 計算機10-01班

      第一章

      課程設(shè)計概述

      1.1 設(shè)計任務(wù): 動態(tài)分區(qū)分配存儲管理

      1.2 設(shè)計要求

      建立描述內(nèi)存分配狀況的數(shù)據(jù)結(jié)構(gòu); ?建立描述進程的數(shù)據(jù)結(jié)構(gòu); ?使用兩種方式產(chǎn)生進程:(a)自動產(chǎn)生,(b)手工輸入; ? 在屏幕上顯示內(nèi)存的分配狀況、每個進程的執(zhí)行情況; ? 建立分區(qū)的分配與回收算法,支持緊湊算法; ? 時間的流逝可用下面幾種方法模擬:(a)按鍵盤,每按一次可認(rèn)為過一個時間單位;(b)響應(yīng)WM_TIMER;

      ? 將一批進程的執(zhí)行情況存入磁盤文件,以后可以讀出并重放;

      ? 支持算法:首次適應(yīng)算法、循環(huán)首次適應(yīng)算法、最佳適應(yīng)算法:最壞適應(yīng)算法。

      1.3 設(shè)計目的

      旨在讓我們更好的了解動態(tài)分區(qū)管理方面的知識.第二章 原理及算法描述

      2.1動態(tài)分區(qū)分配算法原理

      首次適應(yīng)算法

      * 算法概述:分配內(nèi)存時,從鏈?zhǔn)组_始順序查找,找到滿足的空閑分區(qū)則劃出空間分配,余下的空閑空間仍保留在空閑鏈表中

      * 實現(xiàn)方法:分配時從數(shù)組第一個元素開始比較,若符合條件則將該元素減去對應(yīng)作業(yè)的值

      循環(huán)首次適應(yīng)算法

      * 算法概述:由首次適應(yīng)算法演變,只是每次分配改為由上一次找到的空閑分區(qū)開始查找

      * 實現(xiàn)方法:在首次適應(yīng)算法的基礎(chǔ)上增加一個值用于記錄找到的空閑分區(qū)的位置

      最佳適應(yīng)算法

      * 算法概述:每次為作業(yè)分配內(nèi)存時,總是把能滿足要求、又是最小的空閑分區(qū)

      分配給作業(yè)

      * 實現(xiàn)方法:我們決定每次分配先把空閑分區(qū)按從小到大的順序排列,然后將第一個匹配分區(qū)分配給作業(yè)

      最壞適應(yīng)算法

      * 算法概述:每次為作業(yè)分配內(nèi)存時,總是挑選一個最大的空閑分區(qū)分割給作業(yè)使用

      * 實現(xiàn)方法:算法與最佳適應(yīng)算法幾乎相同,僅在排序時把空閑分區(qū)表按從大到小的順序排列,所以未作詳細(xì)注釋

      回收分區(qū)

      當(dāng)進程運行完畢釋放內(nèi)存時,系統(tǒng)根據(jù)回收區(qū)的首址,從空閑區(qū)鏈(表)中找到相應(yīng)的插入點,此時可能出現(xiàn)以下四種情況之一;1)回收區(qū)與插入點的前一個空閑分區(qū)F1相鄰接,此時應(yīng)將回收區(qū)與插入點的前一分區(qū)合并,不必為回收區(qū)分配新表項,而只需修改其前一分區(qū)F1的大小.2)回收分區(qū)與插入點的后一空閑分區(qū)F2相鄰接,此時也可將兩分區(qū)合并,形成新的空閑分區(qū),但用回收區(qū)的首址作為新空閑區(qū)的首址,大小為兩者之和.3)回收區(qū)同時與插入點的前,后兩個分區(qū)鄰接,此時將三個分區(qū)合并,使用F1的表項和F1的首址,取消F2的表項,大小為三者之和.4)回收區(qū)既不與F1相鄰接,又不與F2鄰接.這時應(yīng)為回收區(qū)單獨建立一新表項,填寫回收區(qū)的首址和大小,并根據(jù)其首址插入到空閑鏈中的適當(dāng)位置.緊湊算法

      通過移動內(nèi)存中的作業(yè)的位置,以把原來多個分散的小分區(qū)拼接成一個大分區(qū)的方法.第三章 開發(fā)環(huán)境

      此程序是本人利用c++語言在vs2012的開發(fā)環(huán)境中實現(xiàn)的第四章 程序?qū)崿F(xiàn)--數(shù)據(jù)結(jié)構(gòu)

      #include #include #include using namespace std;ofstream stream;//輸出流對象 int ary1[20][4];//內(nèi)存分配狀態(tài) int ary2[20][3];//空閑分區(qū)狀態(tài) int ary3[10];//進程分配狀態(tài)

      int recycle;//需要回收的盤塊序號 int id1;//算法選擇號 int m;//內(nèi)存區(qū)數(shù) int n;//空閑區(qū)數(shù) int q;//進程數(shù)

      int r=0;//循環(huán)首次適應(yīng)算法:對應(yīng)的這次查找到的空閑分區(qū)序號 //打印輸出函數(shù) void vision(){

      int i;int j;if(id1==1)stream.open(“first_fit.txt”, ios::app);if(id1==2)stream.open(“nextfirst_fit.txt”, ios::app);if(id1==3)stream.open(“best_fit.txt”,ios::app);if(id1==4)stream.open(“worst_fit.txt”, ios::app);if(id1==5)stream.open(“compact.txt”,ios::app);if(id1==6)stream.open(“huishou.txt”,ios::app);cout<<“-------------內(nèi)存分配狀態(tài)-------------”<

      } cout <

      } cout <

      }

      //作業(yè)信息的自動產(chǎn)生 void create_pro(){

      }

      //作業(yè)的手動生成 void create_zuoye(){ int j;int choice2;int id3=rand()%10;m=id3;//內(nèi)存區(qū)數(shù)量 cout<<“產(chǎn)生”<

      } ary3[0]=42;ary3[1]=86;ary3[i]=rand()%100;if(ary3[i]==0){i--;} {

      } cout<<“--------------------------”<

      }

      //內(nèi)存信息的自動產(chǎn)生 void create_apply(){

      int k=0;//空閑區(qū)數(shù)量 for(i=0;i

      if(ary1[i][3]!=2){ary2[k][0]=ary1[i][0];ary2[k][1]=ary1[i][1];ary2[k][2]=ary1[i][2];k++;} int i;for(i=0;i

      } ary1[i][0]=i+1;ary1[i][1]=rand()%100;if(i==0){ } ary1[i][3]=rand()%3;//cout <>choice2;q=choice2;cout<<“輸入想創(chuàng)建的作業(yè)請求大小”<

      } cout<<“你創(chuàng)建了”<>j;ary3[i]=j;

      }

      //內(nèi)存信息的手動生成 int create_fenqu(){

      }

      //首次適應(yīng)算法 void first_fit()int k,x,y,o=0;int a=0;cout<<“輸入想創(chuàng)建的內(nèi)存分區(qū)塊數(shù) : ”;cin>>k;

      cout<<“輸入”<

      } cout<<“輸入內(nèi)存塊的分配狀態(tài)”<

      } ary1[0][2]=0;ary1[1][2]=ary1[0][1];for(int i=2;i

      for(int i=0;i

      } n=a;return m,n;if(ary1[i][3]!=2){

      } ary2[a][0]=ary1[i][0];ary2[a][1]=ary1[i][1];ary2[a][2]=ary1[i][2];a++;ary1[i][2]=ary1[i-1][2]+ary1[i-1][1];//起始地址 cin>>y;if(y==2){ } ary1[i][3]=y;//狀態(tài) n++;ary1[i][0]=i;//序號 cin>>x;ary1[i][1]=x;//大小 } n=k;//空閑塊數(shù)量

      {

      vision();int i;int j;int k;int l;int d;//用來保存第k個的值 int id2=0;for(i=0;i

      for(j=0;j

      if(ary2[j][1]>=ary3[i])//進程占用空間小于等于其中一個空閑區(qū)的大小 {

      cout<<“[”<

      ary1[ary2[j][0]-1][3]=2;for(k=j+1;k

      ary2[k-1][0]=ary2[k][0];ary2[k-1][1]=ary2[k][1];ary2[k-1][2]=ary2[k][2];} n--;

      }else//否則的話,空閑鏈對應(yīng)的地方盤塊大小小了進程占用的大小,并且內(nèi)存分配從對應(yīng)的 {

      l=ary2[j][0];d=ary1[l-1][1];//大小 ary1[l-1][1]=ary3[i];ary1[l-1][3]=2;m++;for(k=m;k>ary2[j][0]+1;k--){

      ary1[k-1][0]=ary1[k-2][0]+1;ary1[k-1][1]=ary1[k-2][1];ary1[k-1][2]=ary1[k-2][2];ary1[k-1][3]=ary1[k-2][3];那一項開始增加一項

      } l=ary2[j][0];

      }

      }

      { if(ary1[id2][3]!=2)

      }

      } n=k;} break;} else {

      }

      cout<<“[”<

      {

      ary2[k][0]=ary1[id2][0];ary2[k][1]=ary1[id2][1];ary2[k][2]=ary1[id2][2];k++;} ary1[l][0]=l+1;ary1[l][1]=d-ary3[i];ary1[l][2]=ary1[l-1][1]+ary1[l-1][2];ary1[l][3]=0;k=0;for(id2=0;id2

      //首次循環(huán)適應(yīng)算法 void next_fit(){ vision();int i;int j;int k;int s;int d;int id2;for(i=0;i

      {

      for(j=r;j

      if(ary3[i]<=ary2[j][1]){

      cout<<“[”<

      {

      } else//對應(yīng)的空閑塊大小大于進程需要大小 { //-----改變內(nèi)存分配情況-----r=(r+1)%n;//改變第k塊的內(nèi)容 k=ary2[j][0];d=ary1[k-1][1];ary1[k-1][1]=ary3[i];ary1[k-1][3]=2;//從k+1之后所有向后移一格 m++;//內(nèi)存塊數(shù)增加1 for(s=m-1;s>k;s--){

      ary1[s][0]=ary1[s-1][0]+1;ary1[s][1]=ary1[s-1][1];ary1[s][2]=ary1[s-1][2];//---改變內(nèi)存分配---k=ary2[j][0];//得到對應(yīng)空閑塊對應(yīng)內(nèi)存塊的序號 k--;ary1[k][3]=2;//把對應(yīng)內(nèi)存塊標(biāo)志位上改成已分配 //------------------//--改變空閑塊表:把從這塊空閑塊以下的所有空閑塊向上移一格--n--;for(k=j;k

      } vision();//------------------break;ary2[k][0]=ary2[k+1][0];ary2[k][1]=ary2[k+1][1];ary2[k][2]=ary2[k+1][2];stream<<“[”<

      }

      }

      //思路:先把空閑列表檢索一遍,選出最佳答案,進行分配

      void best_fit()//最佳算法--按順序檢索,把與進程要求內(nèi)存大小最接近的快分配給進程 {

      int i;int s;int j=-9999;//用來保存最接近的答案 int e;//用來存放進行比較時的中間結(jié)果

      }

      { if(ary1[id2][3]!=2)

      }

      } else{

      } cout<<“[”<

      {

      ary2[k][0]=ary1[id2][0];ary2[k][1]=ary1[id2][1];ary2[k][2]=ary1[id2][2];k++;} ary1[s][3]=ary1[s-1][3];} //改變第k+1塊內(nèi)容:對應(yīng)的數(shù)組是ary1[k] ary1[k][0]=ary1[k-1][0]+1;ary1[k][1]=d-ary1[k-1][1];ary1[k][2]=ary1[k-1][1]+ary1[k-1][2];//--------------------------//----改變空閑表分配情況----k=0;for(id2=0;id2

      }else { cout<<“[”<

      for(s=0;s

      } if(j<0){ cout<<“[”<=ary3[i])&&(e>ary2[s][1]))//滿足分配要求 { e=ary2[s][1];} j=s;for(i=0;i

      if(ary2[j][1]==ary3[i]){

      } else

      for(l=k;l

      } n--;ary2[l-1][0]=ary2[l][0];ary2[l-1][1]=ary2[l][1];ary2[l-1][2]=ary2[l][2];ary1[k-1][3]=2;k=ary2[j][0];

      }

      //最壞適應(yīng)算法 void worst_fit()

      }

      { if(ary1[id2][3]!=2)

      }

      } vision();n=k;

      } for(k=j+1;k

      {

      ary2[k][0]=ary1[id2][0];ary2[k][1]=ary1[id2][1];ary2[k][2]=ary1[id2][2];k++;} {

      //把對應(yīng)的內(nèi)存分配進行更改 k=ary2[j][0];d=ary1[k-1][1];ary1[k-1][1]=ary3[i];ary1[k-1][3]=2;m++;for(l=m;l>ary2[j][0]+1;l--){

      } k=ary2[j][0];ary1[k][0]=k+1;ary1[k][1]=d-ary1[k-1][1];ary1[k][2]=ary1[k-1][1]+ary1[k-1][2];ary1[k][3]=0;k=0;ary1[l-1][0]=ary1[l-2][0]+1;ary1[l-1][1]=ary1[l-2][1];ary1[l-1][2]=ary1[l-2][2];ary1[l-1][3]=ary1[l-2][3];for(id2=0;id2

      {

      }else { cout<<“[”<

      int e=-9999;//用來存放進行比較時的中間結(jié)果 int k;int l;int d;int id2;vision();{

      j=-9999;e=-9999;for(s=0;s

      } if(j<0){ cout<<“[”<=ary3[i])&&(e

      if(ary2[j][1]==ary3[i]){

      k=ary2[j][0];

      ary1[k-1][3]=2;

      for(l=k;l

      { if(ary1[id2][3]!=2)

      }

      } vision();n=k;

      } for(k=j+1;k

      {

      ary2[k][0]=ary1[id2][0];ary2[k][1]=ary1[id2][1];ary2[k][2]=ary1[id2][2];k++;}

      } else {

      //把對應(yīng)的內(nèi)存分配進行更改 k=ary2[j][0];d=ary1[k-1][1];ary1[k-1][1]=ary3[i];ary1[k-1][3]=2;m++;for(l=m;l>ary2[j][0]+1;l--){

      }

      k=ary2[j][0];ary1[k][0]=k+1;ary1[k][1]=d-ary1[k-1][1];ary1[k][2]=ary1[k-1][1]+ary1[k-1][2];ary1[k][3]=0;k=0;ary1[l-1][0]=ary1[l-2][0]+1;ary1[l-1][1]=ary1[l-2][1];ary1[l-1][2]=ary1[l-2][2];ary1[l-1][3]=ary1[l-2][3];} n--;ary2[l-1][2]=ary2[l][2];for(id2=0;id2

      }

      //回收內(nèi)存算法: /* 有共計八種情況,1.(1)回收區(qū)上鄰接著空閑盤塊,下連接著已分配盤塊(2)回收區(qū)下鄰接著空閑盤塊,上鄰接著已分配盤塊(3)回收區(qū)上下連接的都是空閑盤塊(4)空閑區(qū)上下鄰接的都是已分配盤塊

      (5)要回收的盤塊就是第一個盤塊,并且向下鄰接著空閑盤塊(6)要回收的盤塊就是第一個盤塊,但是向下鄰接著已分配盤塊(7)要回收的盤塊就是最后一個盤塊,并且向上鄰接的是空閑盤塊(8)要回收的盤塊就是最后一個盤塊,但是向上鄰接的是已分配盤塊 */ void apply_recycle(){

      ary1[0][1]=ary1[0][1]+ary1[1][1];ary1[0][3]=0;for(i=1;i

      if(recycle==1){ //cout<

      if(ary1[1][3]!=2){ cout<<“要回收的盤塊就是第一個盤塊,并且向下鄰接著空閑盤塊”<

      } else { ary1[0][3]=0;n++;ary2[0][0]=1;ary2[0][1]=ary1[0][1];ary2[0][2]=ary1[0][2];vision();} stream<<“要回收的盤塊就是第一個盤塊,并且向下鄰接著空閑盤塊”<

      ary2[k][0]=ary1[j][0];

      ary1[0][3]=0;k=0;for(j=0;j

      //cout<<“ary1[j][3]”<

      } else{ cout<<“要回收的盤塊就是第一個盤塊,但是向下鄰接著已分配盤塊”<

      } n=k;vision();

      }

      ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;

      {

      } m--;// cout<<“" k=0;vision();//cout<<”ary1[0][3]“<

      cout<<”ary1[j][3]“<

      } else{ cout<<”要回收的盤塊就是最后一個盤塊,但是向上鄰接的是已分配盤塊“<

      } n=k;vision();

      }

      ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;

      ary1[recycle-2][3]=0;ary1[recycle-2][1]=ary1[recycle-2][1]+ary1[recycle-1][1];m--;k=0;for(j=0;j

      //cout<<”ary1[j][3]“<

      } else if(recycle==m){

      if(ary1[recycle-2][3]!=2){ cout<<”要回收的盤塊就是最后一個盤塊,并且向上鄰接的是空閑盤塊“<

      } n=k;vision();

      }

      ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;stream<<”要回收的盤塊就是最后一個盤塊,并且向上鄰接的是空閑盤塊“<

      ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;

      } else{//剩下比較復(fù)雜的四種情況

      if((ary1[recycle-2][3]!=2)&&(ary1[recycle][3]==2))//回收區(qū)上鄰接著空閑盤塊,下連接著{cout<<”回收區(qū)上鄰接著空閑盤塊,下連接著已分配盤塊“<

      }

      } n=k;vision();

      }

      ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;

      ary1[recycle-1][3]=0;k=0;for(j=0;j

      //cout<<”ary1[j][3]“<

      stream<<”回收區(qū)上鄰接著空閑盤塊,下連接著已分配盤塊“<

      ary1[recycle-2][1]=ary1[recycle-2][1]+ary1[recycle-1][1];for(i=recycle-1;i

      } m--;k=0;for(j=0;j

      //cout<<”ary1[j][3]“<

      } if((ary1[recycle-2][3]!=2)&&(ary1[recycle][3]!=2))//回收區(qū)上下連接的都是空閑盤塊 { cout<<”回收區(qū)上下連接的都是空閑盤塊“<

      } vision();

      }

      ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;

      } n=k;vision();} if((ary1[recycle][3]!=2)&&(ary1[recycle-2][3]==2))//回收區(qū)下鄰接著空閑盤塊,上鄰接著{ cout<<”回收區(qū)下鄰接著空閑盤塊,上鄰接著已分配盤塊“<

      stream<<”回收區(qū)下鄰接著空閑盤塊,上鄰接著已分配盤塊“<

      ary1[recycle-2][3]=0;ary1[recycle-2][1]=ary1[recycle-2][1]+ary1[recycle-1][1];for(i=recycle-1;i

      } m--;k=0;for(j=0;j

      //cout<<”ary1[j][3]“<

      }

      }

      } if((ary1[recycle-2][3]==2)&&(ary1[recycle][3]==2))//空閑區(qū)上下鄰接的都是已分配盤塊 {

      } ary1[recycle-1][3]=0;k=0;for(j=0;j

      } vision();//cout<<”ary1[j][3]“<

      }

      ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;cout<<”回收區(qū)上下連接的都是空閑盤塊“<

      } m=m-2;k=0;for(j=0;j

      } vision();//cout<<”ary1[j][3]“<

      }

      ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;ary1[recycle-1][0]=ary1[recycle+1][0]-2;ary1[recycle-1][1]=ary1[recycle+1][1];ary1[recycle-1][2]=ary1[recycle+1][2];ary1[recycle-1][3]=ary1[recycle+1][3];n=k;n=k;

      }

      //緊湊算法 void compact(){

      num_avl=0;for(id2=0;id2

      int num_avl;//記錄空閑盤塊數(shù)量 int sum_avl=0;//總共空閑區(qū)大小 int num_apl=0;//統(tǒng)計總共空閑區(qū)有多大 vision();for(id2=0;id2

      } //最后一塊空閑塊

      ary1[num_apl][0]=num_apl+1;ary1[num_apl][1]=sum_avl;ary1[num_apl][2]=ary1[num_apl-1][1]+ary1[num_apl-1][2];ary1[num_apl][3]=0;m=num_apl+1;//包括最后一個空閑區(qū) if(ary1[id2][3]==2){

      } ary1[num_apl][0]=num_apl+1;ary1[num_apl][1]=ary1[id2][1];if(num_apl==0){

      } ary1[num_apl][3]=2;num_apl++;//cout<<”num_apl“<

      }

      //主函數(shù)入口

      void main(){

      if(choice1==1){

      }

      num=rand()&10;q=num;int id3=2+rand()%8;m=id3;//內(nèi)存區(qū)數(shù)量 create_apply();create_pro();int i;int j;int num;int choice1;//操作選擇標(biāo)記 int choice2;int flag=1;//標(biāo)記是否再執(zhí)行 while(flag==1){

      cout<<”********************************************“<>choice1;

      } n=num_avl;vision();

      } ary2[num_avl][0]=ary1[id2][0];ary2[num_avl][1]=ary1[id2][1];ary2[num_avl][2]=ary1[id2][2];num_avl++;if(choice1==2){

      } vision();

      cout<<”**------------------請選擇處理算法----------------------**“<

      } }

      cout<<”**************************** “<>o;flag=o;

      cout<<”**1首次適應(yīng)算法-----2循環(huán)首次適應(yīng)算法-----3最佳適應(yīng)算法 **“<>id1;if(id1==1)if(id1==2)if(id1==3)if(id1==4)if(id1==5)

      } {first_fit();} {next_fit();} {best_fit();} {worst_fit();} { compact();} if(id1==6){ cout<<”*******************生成內(nèi)存狀態(tài)******************“<>recycle;if((recycle>m)||(recycle<1)){

      } cout<<”錯誤:內(nèi)存中不存在此塊!“<

      } if(id2==-9999){ apply_recycle();} if(ary2[i][0]==recycle){

      }

      cout<<”錯誤:輸入的為空閑盤塊!"<

      第四篇:可變分區(qū)存儲管理方式的內(nèi)存分配和回收

      #include//定義輸入/輸出函數(shù)

      #include//數(shù)據(jù)流輸入/輸出

      #include//字符串處理

      #include//參數(shù)化輸入/輸出

      const int MJ=10;//假定系統(tǒng)允許的最大作業(yè)數(shù)量為10

      typedef struct node{

      int address;

      int length;

      char tag[10];

      }job;

      job frees[MJ];

      int free_quantity;

      job occupys[MJ];

      int occupy_quantity;

      int read()

      {

      FILE *fp;

      char fn[10];

      cout<<“請輸入初始空閑表文件名:”;

      cin>>fn;

      if((fp=fopen(fn,“r”))==NULL){ 其意義是在當(dāng)前目錄下打開文件file a,只允許進行“讀”操作,并使fp指向該文件

      cout<<“錯誤,文件打不開,請檢查文件名”<

      }

      else{

      while(!feof(fp)){

      fscanf(fp,“%d,%d”,&frees[free_quantity].address,&frees[free_quantity].length);free_quantity++;fscanf(文件指針,格式字符串,輸入表列);

      }

      return 1;

      }

      return 0;

      }

      void sort()

      {

      int i,j,p;

      for(i=0;i

      p=i;

      for(j=i+1;j

      if(frees[j].address

      p=j;

      }

      }

      if(p!=i){

      frees[free_quantity]=frees[i];

      frees[i]=frees[p];

      frees[p]=frees[free_quantity];

      }

      }

      }

      void view()

      {

      int i;

      cout<

      cout<<“輸出空閑區(qū)表:n起始地址 分區(qū)長度狀態(tài)n”<

      for(i=0;i

      cout.setf(2);

      cout.width(12);

      cout<

      cout.width(10);

      cout<

      cout.width(8);

      cout<

      }

      cout<

      cout<<“輸出已分分區(qū)表:n起始地址 分區(qū)長度 占用作業(yè)名n”<

      for(i=0;i

      cout.setf(2);

      cout.width(12);

      cout<

      cout.width(10);

      cout<

      cout.width(8);

      cout<

      }

      }

      void ear()

      {

      char job_name[10];

      int job_length;

      int i,j,flag,t;

      cout<<“請輸入分配內(nèi)存的作業(yè)名和空間大小:”;

      cin>>job_name;

      cin>>job_length;

      flag=0;

      for(i=0;i

      if(frees[i].length>=job_length){

      flag=1;

      }

      }

      if(flag==0){//未找到空閑區(qū),返回

      cout<

      }

      else{

      t=0;

      i=0;

      while(t==0){

      if(frees[i].length>=job_length){//找到可用空閑區(qū),開始分配

      t=1;

      }

      i++;

      }

      i--;

      occupys[occupy_quantity].address=frees[i].address;//修改已分配區(qū)表

      strcpy(occupys[occupy_quantity].tag,job_name);

      occupys[occupy_quantity].length=job_length;

      occupy_quantity++;

      if(frees[i].length>job_length){

      frees[i].address+=job_length;

      frees[i].length-=job_length;

      }

      else{

      for(j=i;j

      frees[j]=frees[j+1];

      }

      free_quantity--;

      cout<<“內(nèi)存空間成功:)”<

      }

      }

      }

      void reclaim()//回收作業(yè)所占的內(nèi)存空間

      {

      char job_name[20];

      int i,j,flag,p=0;

      int address;

      int length;//尋找已分分區(qū)表中對應(yīng)的登記項

      cout<<“輸入要回收分區(qū)的作業(yè)名:”;

      cin>>job_name;

      flag=-1;

      for(i=0;i

      if(!strcmp(occupys[i].tag,job_name)){

      flag=i;

      address=occupys[i].address;

      length=occupys[i].length;

      }

      }

      if(flag==-1){ //在已分分區(qū)表中找不到作業(yè)

      cout<<“沒有這個作業(yè)名”<

      }

      else{//修改空閑區(qū)表,加入空閑表

      for(i=0;i

      if((frees[i].address+frees[i].length)==address){

      if(((i+1)

      for(j=i+1;j

      frees[j]=frees[j+1];

      }

      free_quantity--;

      p=1;

      }

      else{

      frees[i].length+=length;

      p=1;

      }

      }

      if(frees[i].address==(address+length)){

      frees[i].address=address;

      frees[i].length+=length;

      p=1;

      }

      }

      if(p==0){

      frees[free_quantity].address=address;

      frees[free_quantity].length=length;

      free_quantity++;

      }//刪除分配表中的該作業(yè)

      for(i=flag;i

      occupys[i]=occupys[i+1];

      }

      occupy_quantity--;

      }

      }

      void main()

      {

      int flag=0;

      int t=1;

      int chioce=0;

      int i;

      for(i=0;i

      frees[i].address=-1;//空閑區(qū)表初始化

      frees[i].length=0;

      strcpy(frees[i].tag,“free”);

      occupys[i].address=-1;//已分分區(qū)表初始化

      occupys[i].length=0;

      strcpy(occupys[i].tag,“");

      }

      free_quantity=0;

      occupy_quantity=0;

      flag=read();

      while(flag==1){

      sort();

      cout<<”選擇功能項:(0-退出,1-分配內(nèi)存,2-回收內(nèi)存,3-顯示內(nèi)存)n“<

      cin>>chioce;

      switch(chioce){

      case 0:

      flag=0;

      break;

      case 1:

      ear();

      break;

      case 2:

      reclaim();

      break;

      case 3:

      view();

      break;

      default:

      cout<<”沒有該選項n"<

      }

      }

      }

      第五篇:可變分區(qū)存儲管理方式的內(nèi)存分配和回收實驗報告

      一.實驗?zāi)康?/p>

      通過編寫和調(diào)試存儲管理的模擬程序以加深對存儲管理方案的理解,熟悉可變分區(qū)存儲管理的內(nèi)存分配和回收。二.實驗內(nèi)容

      1.確定內(nèi)存空間分配表;

      2.采用最優(yōu)適應(yīng)算法完成內(nèi)存空間的分配和回收; 3.編寫主函數(shù)對所做工作進行測試。

      三.實驗背景材料

      實現(xiàn)可變分區(qū)的分配和回收,主要考慮的問題有三個:第一,設(shè)計記錄內(nèi)存使用情況的數(shù)據(jù)表格,用來記錄空閑區(qū)和作業(yè)占用的區(qū)域;第二,在設(shè)計的數(shù)據(jù)表格基礎(chǔ)上設(shè)計內(nèi)存分配算法;第三,在設(shè)計的數(shù)據(jù)表格基礎(chǔ)上設(shè)計內(nèi)存回收算法。

      首先,考慮第一個問題,設(shè)計記錄內(nèi)存使用情況的數(shù)據(jù)表格,用來記錄空間區(qū)和作業(yè)占用的區(qū)域。

      由于可變分區(qū)的大小是由作業(yè)需求量決定的,故分區(qū)的長度是預(yù)先不固定的,且分區(qū)的個數(shù)也隨內(nèi)存分配和回收變動??傊?,所有分區(qū)情況隨時可能發(fā)生變化,數(shù)據(jù)表格的設(shè)計必須和這個特點相適應(yīng)。由于分區(qū)長度不同,因此設(shè)計的表格應(yīng)該包括分區(qū)在內(nèi)存中的起始地址和長度。由于分配時空閑區(qū)有時會變成兩個分區(qū):空閑區(qū)和已分分區(qū),回收內(nèi)存分區(qū)時,可能會合并空閑分區(qū),這樣如果整個內(nèi)存采用一張表格記錄己分分區(qū)和空閑區(qū),就會使表格操作繁瑣。分配內(nèi)存時查找空閑區(qū)進行分配,然后填寫己分配區(qū)表,主要操作在空閑區(qū);某個作業(yè)執(zhí)行完后,將該分區(qū)變成空閑區(qū),并將其與相鄰的空閑區(qū)合并,主要操作也在空閑區(qū)。由此可見,內(nèi)存的分配和回收主要是對空閑區(qū)的操作。這樣為了便于對內(nèi)存空間的分配和回收,就建立兩張分區(qū)表記錄內(nèi)存使用情況,一張表格記錄作業(yè)占用分區(qū)的“己分分區(qū)表”;一張是記錄空閑區(qū)的“空閑區(qū)表”。這兩張表的實現(xiàn)方法一般有兩種:一種是鏈表形式,一種是順序表形式。在實驗中,采用順序表形式,用數(shù)組模擬。由于順序表的長度必須提前固定,所以無論是“已分分區(qū)表”還是“空閑區(qū)表”都必須事先確定長度。它們的長度必須是系統(tǒng)可能的最大項數(shù)。

      “已分分區(qū)表”的結(jié)構(gòu)定義

      #define n 10 //假定系統(tǒng)允許的最大作業(yè)數(shù)量為n struct { float address;//已分分區(qū)起始地址

      float length;//已分分區(qū)長度、單位為字節(jié) int flag;//已分分區(qū)表登記欄標(biāo)志,“0”表示空欄目,實驗中只支持一個字符的作業(yè)名

      }used_table[n];//已分分區(qū)表

      “空閑區(qū)表”的結(jié)構(gòu)定義

      #define m 10 //假定系統(tǒng)允許的空閑區(qū)最大為m struct { float address;//空閑區(qū)起始地址

      float length;//空閑區(qū)長度、單位為字節(jié)

      int flag;//空閑區(qū)表登記欄標(biāo)志,“0”表示空欄目,“1”表示未分配 }used_table[n];//空閑區(qū)表

      第二,在設(shè)計的數(shù)據(jù)表格基礎(chǔ)上設(shè)計內(nèi)存分配。

      裝入一個作業(yè)時,從空閑區(qū)表中查找滿足作業(yè)長度的未分配區(qū),如大于作業(yè),空閑區(qū)劃

      第1頁 分成兩個分區(qū),一個給作業(yè),一個成為小空閑分區(qū)。

      實驗中內(nèi)存分配的算法采用“最優(yōu)適應(yīng)”算法,即選擇一個能滿足要求的最小空閑分區(qū)。第三,在設(shè)計的數(shù)據(jù)表格基礎(chǔ)上設(shè)計內(nèi)存回收問題。內(nèi)存回收時若相鄰有空閑分區(qū)則合并空閑區(qū),修改空閑區(qū)表。

      四、參考程序

      #define n 10 //假定系統(tǒng)允許的最大作業(yè)數(shù)量為n #define m 10 //假定系統(tǒng)允許的空閑區(qū)最大為m #define minisize 100 struct { float address;//已分分區(qū)起始地址

      float length;//已分分區(qū)長度、單位為字節(jié)

      int flag;//已分分區(qū)表登記欄標(biāo)志,“0”表示空欄目,實驗中只支持一個字符的作業(yè)名

      }used_table[n];//已分分區(qū)表 struct { float address;//空閑區(qū)起始地址

      float length;//空閑區(qū)長度、單位為字節(jié) int flag;//空閑區(qū)表登記欄標(biāo)志,“0”表示空欄目,“1”表示未分配 }used_table[n];//空閑區(qū)表

      allocate(J,xk)//采用最優(yōu)分配算法分配xk大小的空間 char J;float xk;{int i,k;float ad;k=-1;for(i=0;i=xk&&free_table[i].flag==1)if(k==-1||free_table[i].length

      //找到可用空閑區(qū),開始分配;若空閑區(qū)大小與要求分配的空間差小于minisize大小,則空閑區(qū)全部分配;

      //若空閑區(qū)大小與要求分配的空間差大于minisize大小,則從空閑區(qū)劃分一部分分配

      if(free_table[k].length-xk<=minisize){free_table[k].flag=0;ad=free_table[k].address;

      第2頁 xk=free_table[k].length;} else {free_table[k].length=free_table[k].length-xk;ad=free_table[k].address+free_table[k].length;} //修改已分配區(qū)表

      i=0;while(used_table[i].flag!=0&&i=n)//無表目填寫已分分區(qū) {printf(“無表目填寫以分分區(qū),錯誤n”);if(free_table[k].flag==0)//前面找到的是整個空閑區(qū) free_table[k].flag=1;else //前面找到的是某個空閑區(qū)的一部分 free_table[k].length=free_table[k].length+xk;return;} else //修改已分配區(qū)表 {used_table[i].address=ad;used_table[i].length=xk;used_table[i].flag=J;} return;}//內(nèi)存分配函數(shù)結(jié)束

      reclaim(J)//回收作業(yè)名為J的作業(yè)所占的內(nèi)存空間 char J: {int i,k,j,s,t;float S,L;//尋找已分分區(qū)表中對應(yīng)的登記項 S=0;while((used_table[S].flag!=J||used_table[S].flag==0)&&S=n)//在已分分區(qū)表中找不到名字為J的作業(yè) {printf(“找不到該作業(yè)n”);return;} //修改已分分區(qū)表

      used_table[S].flag=0;//取得歸還分區(qū)的起始地址S和長度L S=used_table[S].address;L=used_table[S].length;j=-1;k=-1;i=0;

      第3頁 //尋找回收分區(qū)的上下鄰空閑區(qū),上鄰表目K,下鄰表目J while(i

      {free_table[k].length=free_table[j].length+free_table[k].length+L;free_table[j].flag+0;} else //上鄰空閑區(qū),下鄰非空閑區(qū),與上鄰合并 free_table[k].length=free_table[k].length+L;else if(j!=-1)//上鄰非空閑區(qū),下鄰空閑區(qū),與下鄰合并 {free_table[j].address=S;free_table[j].length=free_table[j].length+L;} else { //上下鄰均為非空閑區(qū),回收區(qū)域直接填入 t=0;//在空閑區(qū)表中尋找空欄目 while(free_table[t].flag==1&&t=m)//空閑區(qū)表滿,回收空間失敗,將已分配分區(qū)表復(fù)原

      {printf(“內(nèi)存空閑表沒有空間,回收空間失敗n”);used_table[S].flag=J;return;} free_table[t].address=s;free_table[t].length=l;free_table[t].flag=1;} return(true);} //內(nèi)存回收函數(shù)結(jié)束

      main(){ int i,a;float xk;char J;//空閑區(qū)表初始化

      free_table[0].address=10240;

      第4頁 free_table[0].length=102400;free_table[0].flag=1;for(i=1;i

      case 1;//a=1 分配內(nèi)存空間

      printf(“輸入作業(yè)名J和作業(yè)所需長度XK:”);scanf(“%c%c%f”,&j,&xk);allocate(j,xk);//分配內(nèi)存空間 break;case 2;//a=2 回收內(nèi)存空間 printf(“輸入要回放分區(qū)的作業(yè)名”);scanf(“%c%c”,&j);reclaim(j);//回收內(nèi)存空間 break;case 3;//a=3顯示內(nèi)存情況,輸出空閑區(qū)表和已分分區(qū)表 printf(“輸出空閑區(qū)表:n起始地址 分區(qū)長度 標(biāo)志n”);for(i=0;i

      第5頁

      下載計算機操作系統(tǒng)動態(tài)分區(qū)存儲管理方式下的內(nèi)存空間的分配與回收實驗報告word格式文檔
      下載計算機操作系統(tǒng)動態(tài)分區(qū)存儲管理方式下的內(nèi)存空間的分配與回收實驗報告.doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進行舉報,并提供相關(guān)證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實,本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦