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

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

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

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

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

      頁式存儲(chǔ)管理方案中的內(nèi)存分配

      時(shí)間:2019-05-14 02:13:19下載本文作者:會(huì)員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《頁式存儲(chǔ)管理方案中的內(nèi)存分配》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《頁式存儲(chǔ)管理方案中的內(nèi)存分配》。

      第一篇:頁式存儲(chǔ)管理方案中的內(nèi)存分配

      頁式存儲(chǔ)管理方案中的內(nèi)存分配

      用戶提出內(nèi)存空間申請,按一定策略檢查內(nèi)存空間,找出滿足請求的空閑頁面,分給申請者

      1首先接收輸入文件:

      (1)內(nèi)存空閑物理頁面文件(文本文件),包括若干行,每行2項(xiàng)(起始

      物理頁面號(hào),連續(xù)的物理頁面數(shù))

      (2)進(jìn)程占用物理內(nèi)存數(shù)據(jù)文件(文本文件),包括若干行,若干項(xiàng)(進(jìn)

      程號(hào),物理頁面號(hào)1,物理頁面號(hào)2,……)建立空閑頁面表,并在屏幕顯示輸出該表內(nèi)容 20行

      該表中記錄了內(nèi)存中可供分配的空閑頁面的起始頁號(hào)和連續(xù)空閑的頁面數(shù) 3為每個(gè)進(jìn)程建立一個(gè)頁表,并在屏幕顯示輸出每個(gè)頁表的內(nèi)容

      頁表記錄了每個(gè)進(jìn)程邏輯頁面與物理頁面的對(duì)應(yīng)關(guān)系在用戶界面根據(jù)用戶提示接收一個(gè)內(nèi)存申請,格式為:進(jìn)程名,申請空間大?。▎挝粸镵字節(jié))為該進(jìn)程建立一個(gè)頁表,顯示輸出該表內(nèi)容,檢查空閑頁面表,為該進(jìn)程分配相應(yīng)的物理頁面,并修改有關(guān)的數(shù)據(jù)結(jié)構(gòu)(空閑頁面表,頁表)假設(shè)頁面大小為4K重復(fù)4,5直到輸入特殊字符(0)在屏幕顯示輸出最新的空閑頁面表內(nèi)容

      第二篇:可變分區(qū)存儲(chǔ)管理方式的內(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,只允許進(jìn)行“讀”操作,并使fp指向該文件

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

      }

      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ū)表中對(duì)應(yīng)的登記項(xià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<<“沒有這個(gè)作業(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<<”選擇功能項(xiàng):(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<<”沒有該選項(xiàng)n"<

      }

      }

      }

      第三篇:編程中內(nèi)存分配總結(jié)

      棧, 臨時(shí)變量,大小有限制,函數(shù)返回后就被回收

      堆,可以動(dòng)態(tài)分配,大小可近似認(rèn)為無限制,可以一直存在

      堆:malloc(), free()需要自己申請與自己負(fù)責(zé)釋放!適用于事先不知道需要分配多大空間的情況。

      棧:void fun(int x){int y;...}系統(tǒng)幫你分配與釋放。

      /////////////////////////////////////////////////////////////////// 一個(gè)由C/C++編譯的程序占用的內(nèi)存分為以下幾個(gè)部分

      1、棧區(qū)(stack)— 由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其

      操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。

      2、堆區(qū)(heap)— 一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回

      收。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。

      3、全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的

      全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另

      一塊區(qū)域。已初始化全局/靜態(tài)變量,在整個(gè)軟件執(zhí)行過程中有效;.bss函數(shù)調(diào)用棧,其中的內(nèi)容在函數(shù)執(zhí)行期間有效,并由編譯器負(fù)責(zé)分配和收回;

      .heap程序結(jié)束后由系統(tǒng)釋放。

      4、文字常量區(qū) —常量字符串就是放在這里的。程序結(jié)束后由系統(tǒng)釋放

      5、程序代碼區(qū)—存放函數(shù)體的二進(jìn)制代碼。

      二、堆和棧的理論知識(shí) 2.1申請方式

      stack: 由系統(tǒng)自動(dòng)分配。例如,聲明在函數(shù)中一個(gè)局部變量 int b;系統(tǒng)自動(dòng)在棧中為b開辟空間 heap: 需要程序員自己申請,并指明大小,在c中malloc函數(shù) 如p1 =(char *)malloc(10);在C++中用new運(yùn)算符 如p2 = new char[10];但是注意p1、p2本身是在棧中的。

      2.2 申請后系統(tǒng)的響應(yīng)

      棧:只要棧的剩余空間大于所申請空間,系統(tǒng)將為程序提供內(nèi)存,否則將報(bào)異常提示棧溢 出。

      堆:首先應(yīng)該知道操作系統(tǒng)有一個(gè)記錄空閑內(nèi)存地址的鏈表,當(dāng)系統(tǒng)收到程序的申請時(shí),會(huì)遍歷該鏈表,尋找第一個(gè)空間大于所申請空間的堆結(jié)點(diǎn),然后將該結(jié)點(diǎn)從空閑結(jié)點(diǎn)鏈表

      中刪除,并將該結(jié)點(diǎn)的空間分配給程序,另外,對(duì)于大多數(shù)系統(tǒng),會(huì)在這塊內(nèi)存空間中的

      首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內(nèi)存空間。

      另外,由于找到的堆結(jié)點(diǎn)的大小不一定正好等于申請的大小,系統(tǒng)會(huì)自動(dòng)的將多余的那部

      分重新放入空閑鏈表中。

      2.3申請大小的限制

      棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意

      思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在WINDOWS下,棧的大小是2M(也有 的說是1M,總之是一個(gè)編譯時(shí)就確定的常數(shù)),如果申請的空間超過棧的剩余空間時(shí),將

      提示overflow。因此,能從棧獲得的空間較小。

      堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲(chǔ) 的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小

      受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。

      2.4申請效率的比較:

      棧由系統(tǒng)自動(dòng)分配,速度較快。但程序員是無法控制的。

      堆是由new分配的內(nèi)存,一般速度比較慢,而且容易產(chǎn)生內(nèi)存碎片,不過用起來最方便.另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內(nèi)存,他不是在堆,也不是在棧是

      直接在進(jìn)程的地址空間中保留一塊內(nèi)存,雖然用起來最不方便。但是速度快,也最靈活。

      2.5堆和棧中的存儲(chǔ)內(nèi)容

      棧: 在函數(shù)調(diào)用時(shí),第一個(gè)進(jìn)棧的是主函數(shù)中后的下一條指令(函數(shù)調(diào)用語句的下一條可

      執(zhí)行語句)的地址,然后是函數(shù)的各個(gè)參數(shù),在大多數(shù)的C編譯器中,參數(shù)是由右往左入棧 的,然后是函數(shù)中的局部變量。注意靜態(tài)變量是不入棧的。

      當(dāng)本次函數(shù)調(diào)用結(jié)束后,局部變量先出棧,然后是參數(shù),最后棧頂指針指向最開始存的地

      址,也就是主函數(shù)中的下一條指令,程序由該點(diǎn)繼續(xù)運(yùn)行。

      堆:一般是在堆的頭部用一個(gè)字節(jié)存放堆的大小。堆中的具體內(nèi)容由程序員安排。

      2.6存取效率的比較

      char s1[] = “aaaaaaaaaaaaaaa”;char *s2 = “bbbbbbbbbbbbbbbbb”;aaaaaaaaaaa是在運(yùn)行時(shí)刻賦值的;

      而bbbbbbbbbbb是在編譯時(shí)就確定的;

      但是,在以后的存取中,在棧上的數(shù)組比指針?biāo)赶虻淖址?例如堆)快。

      比如: #include void main(){ char a = 1;char c[] = “1234567890”;

      char *p =“1234567890”;a = c[1];a = p[1];return;} 對(duì)應(yīng)的匯編代碼 10: a = c[1];

      00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh] 0040106A 88 4D FC mov byte ptr [ebp-4],cl 11: a = p[1];

      0040106D 8B 55 EC mov edx,dword ptr [ebp-14h] 00401070 8A 42 01 mov al,byte ptr [edx+1] 00401073 88 45 FC mov byte ptr [ebp-4],al 第一種在讀取時(shí)直接就把字符串中的元素讀到寄存器cl中,而第二種則要先把指針值讀到

      edx中,再根據(jù)edx讀取字符,顯然慢了。

      2.7小結(jié):

      堆和棧的區(qū)別可以用如下的比喻來看出:

      使用棧就象我們?nèi)ワ堭^里吃飯,只管點(diǎn)菜(發(fā)出申請)、付錢、和吃(使用),吃飽了就走,不必理會(huì)切菜、洗菜等準(zhǔn)備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。

      使用堆就象是自己動(dòng)手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。(經(jīng)典!)

      第四篇:可變分區(qū)存儲(chǔ)管理方式的內(nèi)存分配和回收實(shí)驗(yàn)報(bào)告

      一.實(shí)驗(yàn)?zāi)康?/p>

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

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

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

      三.實(shí)驗(yàn)背景材料

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

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

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

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

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

      實(shí)驗(yàn)中內(nèi)存分配的算法采用“最優(yōu)適應(yīng)”算法,即選擇一個(gè)能滿足要求的最小空閑分區(qū)。第三,在設(shè)計(jì)的數(shù)據(jù)表格基礎(chǔ)上設(shè)計(jì)內(nèi)存回收問題。內(nèi)存回收時(shí)若相鄰有空閑分區(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”表示空欄目,實(shí)驗(yàn)中只支持一個(gè)字符的作業(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ū),錯(cuò)誤n”);if(free_table[k].flag==0)//前面找到的是整個(gè)空閑區(qū) free_table[k].flag=1;else //前面找到的是某個(gè)空閑區(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ū)表中對(duì)應(yīng)的登記項(xià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)實(shí)驗(yàn)報(bào)告-可變分區(qū)存儲(chǔ)管理方式的內(nèi)存分配回收

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

      一.實(shí)驗(yàn)?zāi)康?/p>

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

      二.實(shí)驗(yàn)內(nèi)容

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

      三.實(shí)驗(yàn)原理

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

      四.實(shí)驗(yàn)部分源程序

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

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

      int length;// 長度大小

      struct SNode *next;// 指向下一結(jié)點(diǎn)的指針 }* 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é)點(diǎn)連接

      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í)參數(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”);}

      五.實(shí)驗(yàn)結(jié)果與體會(huì)

      我的體會(huì):

      下載頁式存儲(chǔ)管理方案中的內(nèi)存分配word格式文檔
      下載頁式存儲(chǔ)管理方案中的內(nèi)存分配.doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


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

      相關(guān)范文推薦

        可變分區(qū)存儲(chǔ)管理方式的內(nèi)存分配和回收實(shí)驗(yàn)報(bào)告(最優(yōu)算法)

        一.實(shí)驗(yàn)?zāi)康?通過編寫和調(diào)試存儲(chǔ)管理的模擬程序以加深對(duì)存儲(chǔ)管理方案的理解,熟悉可變分區(qū)存儲(chǔ)管理的內(nèi)存分配和回收。 二.實(shí)驗(yàn)內(nèi)容 1.確定內(nèi)存空間分配表; 2.采用最優(yōu)適應(yīng)算法完成......

        操作系統(tǒng)課程設(shè)計(jì)_動(dòng)態(tài)分區(qū)分配存儲(chǔ)管理

        操作系統(tǒng)課程設(shè)計(jì) 設(shè)計(jì)題目 動(dòng)態(tài)分區(qū)分配存儲(chǔ)管理 學(xué)生姓名學(xué)號(hào) 專業(yè)班級(jí) 指導(dǎo)教師 呂 霆 20102675 計(jì)算機(jī)10-01班 1 第一章課程設(shè)計(jì)概述 1.1 設(shè)計(jì)任務(wù): 動(dòng)態(tài)分區(qū)分配......

        操作系統(tǒng)課程設(shè)計(jì)之請求式面頁管理

        一、目的與要求 1、目的近年來,由于大規(guī)模集成電路(LSI)和超大規(guī)模集成電路(VLSI)技術(shù)的發(fā)展,使存儲(chǔ)器的容量不斷擴(kuò)大,價(jià)格大幅度下降。但從使用角度看,存儲(chǔ)器的容量和成本總受到一......

        住房分配及管理方案(正式稿)

        太平畈鄉(xiāng)高山中學(xué)教師周轉(zhuǎn)房及校內(nèi)住房分配、管理方案 為規(guī)范學(xué)校教師周轉(zhuǎn)房及校內(nèi)住房的管理,努力營造安居樂教的和諧環(huán)境,結(jié)合我校實(shí)際,依據(jù)《霍山縣農(nóng)村中小學(xué)教師周轉(zhuǎn)房管......

        政府內(nèi)網(wǎng)中的移動(dòng)存儲(chǔ)介質(zhì)管理

        政府內(nèi)網(wǎng)中的移動(dòng)存儲(chǔ)介質(zhì)管理 一、引言 隨著計(jì)算機(jī)應(yīng)用技術(shù)的不斷發(fā)展,筆記本電腦及移動(dòng)硬盤、U盤、可擦寫光盤等移動(dòng)存儲(chǔ)設(shè)備的購置成本不斷降低,使用更為方便。由于其體積......

        酒店管理專業(yè)實(shí)習(xí)分配方案(范文)

        酒店管理專業(yè)實(shí)習(xí)分配方案 酒店管理專業(yè)實(shí)習(xí)分配,關(guān)系到長遠(yuǎn)的校企合作,關(guān)系到學(xué)生的職業(yè)發(fā)展。此過程既要給學(xué)生的一定的自主選擇權(quán),又要兼顧合作企業(yè)的用人需求,是一個(gè)統(tǒng)籌兼......

        行政后勤部走動(dòng)式管理方案

        行政后勤部走動(dòng)式管理方案 一、目的: 為加強(qiáng)公司公共區(qū)域綜合管理,促使本部門管理人員關(guān)注所管轄區(qū)域內(nèi)各人員的工作狀態(tài)、基礎(chǔ)設(shè)施,辦公秩序,環(huán)境衛(wèi)生等,使管理人員能及時(shí)發(fā)現(xiàn)......

        小學(xué)課后服務(wù)經(jīng)費(fèi)管理分配方案

        小學(xué)課后服務(wù)經(jīng)費(fèi)管理分配方案根據(jù)《XX省教育廳等4部門關(guān)于全面推進(jìn)小學(xué)課后服務(wù)工作的指導(dǎo)意見》(X教基發(fā)[2019]2號(hào))、《XX市關(guān)于全面推進(jìn)小學(xué)課后服務(wù)工作的意見》(X教基......