實驗四---內存管理模擬實驗_第1頁
實驗四---內存管理模擬實驗_第2頁
實驗四---內存管理模擬實驗_第3頁
實驗四---內存管理模擬實驗_第4頁
實驗四---內存管理模擬實驗_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優質文檔-傾情為你奉上實驗四 內存管理模擬實驗模擬實現一個簡單的固定(可變)分區存儲管理系統1實驗目的通過本次課程設計,掌握了如何進行內存的分區管理,強化了對首次適應分配算法和分區回收算法的理解。2實驗內容(1)建立相關的數據結構,作業控制塊、已分配分區及未分配分區(2)實現一個分區分配算法,如最先適應算法、最優或最壞適應分配算法(3)實現一個分區回收算法(4)給定一個作業/進程,選擇一個分配或回收算法,實現分區存儲的模擬管理圖1.流程圖3實驗步驟首先,初始化函數initial()將分區表初始化并創建空閑分區列表,空閑區第一塊的長度是30,以后的每個塊長度比前一個的長度長20。frees0

2、.length=30第二塊的長度比第一塊長20,第三塊比第二塊長20,以此類推。freesi.length=freesi-1.length+20;下一塊空閑區的首地址是上一塊空閑區的首地址與上一塊空閑區長度的和。freesi.front=freesi-1.front+freesi-1.length;分配區的首地址和長度都初始化為零occupysi.front=0;occupysi.length=0;顯示函數show()是顯示當前的空閑分區表和當前的已分配表的具體類容,分區的有起始地址、長度以及狀態,利用for語句循環輸出。有一定的格式,使得輸出比較美觀好看。assign()函數是運用首次適應分

3、配算法進行分區,從鏈首開始順序查找,直至找到一個大小能滿足要求的空閑分區為止;然后再按照作業的大小,從該分區中劃出一塊內存空間分配給請求者,余下的空閑分區仍留在空閑鏈中。若從鏈首直至鏈尾都不能找到一個能滿足要求的分區,則此次內存分配失敗,返回。這個算法傾向于優先利用內存中低址部分被的空閑分區,從而保留了高址部分的的大空閑區。著給為以后到達的大作業分配大的內存空間創造了條件。它的缺點是低地址部分不斷被劃分,會留下很多難以利用的、很小的空閑分區,而每次查找又都是從低址部分開始,這樣無疑會增加查找可用空閑分區的開銷。分配內存,從空閑的分區表中找到所需大小的分區。設請求的分區的大小為job_lengt

4、h,表中每個空閑分區的大小可表示為freei.length。如果freesi.length>=job_length,即空閑空間I的長度大于等于作業的長度將空閑標志位設置為1,如果不滿足這個條件則輸出:“對不起,當前沒有滿足你申請長度的空閑內存,請稍后再試!”。如果freesi.length>=job_length空閑區空間I的長度不大于作業長度,I的值加1判斷下一個空閑區空間是否大于作業的長度。把未用的空閑空間的首地址付給已用空間的首地址,已用空間的長度為作業的長度,已用空間數量加1。如果(freesi.length>job_length),空間的長度大于作業的長度,free

5、si.front+=job_length; 空閑空間的起始首地址=原空閑區間的起始長度加作業長度freesi.length-=job_length;空閑區間的長度=原空閑區間的長度-作業的長度。如果空間的長度與作業的長度相等,空閑區向前移一位,空閑區的數量也減一。這樣判斷所有情況并相應分配之后,內存空間分配成功。第二個操作為:撤消相應作業。在這個操作中,進行了以下步驟:(1)按照系統提示輸入將要撤消的作業名;(2)判斷該作業是否存在若不存在:輸出“沒有這個作業名,請重新輸入作業名”;若存在:則先分別用flag,start,len保存該作業在分配區表的位置i,內存空間的首地址以及長度。接著根據回

6、收區的首地址,即該作業的首地址,從空閑區表中找到相應的插入點,將其加入空閑表,此時可能出現以下三種情況之一:1 .回收區只與插入點前一個空閑分區F1相鄰接即(freesi.front+freesi.length)=start),此時判斷其是否與后一個空閑分區F2相鄰接,又分兩種情況:若相鄰接,則將三個分區合并,修改新的空閑分區的首地址和長度。新的首地址為F1的首地址,長度為三個分區長度之和,相應的代碼為:freesi.length=freesi.length+freesi+1.length+len;,并相應的空閑區表。若不相鄰接,即合并后的首應將回收區與插入點的前一分區合并,則不須為回收分區分

7、配新的表項,只須修改其前一分區的大小。該大小為F1與當前作業大小之和。freesi.length+=len;2 .回收分區與插入點前一個空閑分區不鄰接但與后一空閑分區F2鄰接。此時應合并當前作業分區與F2分區,合并后的分區首地址為當前作業首地址start,長度為兩個分區長度之和。代碼為:freesi.front=start; freesi.length+=len;3.回收分區既不與插入點前一空閑分區相鄰接,也不與后一空閑分區相鄰接。此時只須將該回收分區插入空閑區表即可。此時空閑區的數量加1。將回收區加入空閑區表后還須修改分配區表內容。具體為:修改分配區表中回收區(第一區)之后的各區指針,使其依

8、次前移一位,即occupysi=occupysi+1;同時已分配分區數量減1,即occupy_quantity-;最后輸出內存空間回收完畢!即完成了撤消作業并回收相應空間的操作。圖2.初始化空閑分區列表圖3.內存空間分配1圖4.內存空間分配2圖5.內存回收4實驗總結動態分區分配是根據進程的實際需要,動態地為之分配內存空間。程序中采用空閑分區表,用于紀錄每個空閑分區的情況。每個空閑分區占一個表目,表目中包括起始地址、長度和狀態。采用已分配表,用于存放請求的作業,每個作業占一個表目,包括起始地址、長度和作業名。程序調用initial()函數實現對空閑分區的初始化。將作業裝入內存時,運用首次適應分配

9、算法。程序中調用assign()實現,分配內存時,從表首開始查找,直至找到一個大小能滿足要求的空閑分區為止;然后再按照作業的大小,從該分區中劃出一塊內存空間分配給請求者,余下的空閑分區仍留在空閑表中。若不能找到滿足要求的空閑區,則此次內存分配失敗,返回。回收內存,即撤銷某些作業,調用撤銷函數cancel(),根據所撤銷作業的首址,從空閑區表中找到相應的插入點,回收內存包括四種情況:(1)回收區與前一空閑分區相鄰接,此時將回收區與前一分區合并,并修改前一分區的大小;(2)回收區與后一空閑分區相鄰接,此時將回收區與后一分區合并,并修改后一分區的首址和大小;(3)回收區同時與前、后分區相鄰接,則將三

10、個分區合并,使用前一分區的首址,大小為三分區大小之和;(4)回收區不與空閑分區相鄰,則重新建立一新表項,填寫首址和大小,插入表中相應位置。函數show()用于顯示空閑區表和已分配表時,運用for循環,依次顯示每個空閑區表和已分配表的信息。專心-專注-專業#include<stdlib.h>#include<stdio.h>#include<iostream.h>#include<string.h>#include<iomanip.h>const int MAXJOB=5;/定義表最大記錄數typedef struct nodeint

11、front;int length;char data20;job;/定義job類型的數據類型job freesMAXJOB;/定義空閑區表int free_quantity;job occupysMAXJOB;/定義已分配區表int occupy_quantity;/初始化并創建空閑分區表函數int initial()int i;frees0.front=0;frees0.length=30;occupys0.front=0;occupys0.length=0;strcpy(frees0.data,"free");for(i=1;i<MAXJOB;i+)freesi.

12、front=freesi-1.front+freesi-1.length;freesi.length=freesi-1.length+20;strcpy(freesi.data,"free");occupysi.front=0;occupysi.length=0;strcpy(occupysi.data," ");free_quantity=MAXJOB;occupy_quantity=0;return 1;/顯示函數void show()int i;printf("-n");printf("當前空閑分區表如下:n"

13、;);printf("起始地址 長度 狀態n");for(i=0;i<free_quantity;i+)printf("%5d %8d %sn",freesi.front,freesi.length,freesi.data);printf("-n");printf("當前已分配表如下:n");printf("起始地址 長度 占用作業名n");for(i=0;i<occupy_quantity;i+)printf("%5d %6d %sn",occupysi.fro

14、nt,occupysi.length,occupysi.data);printf("-n");/首次適應分配算法void assign()char job_name20;int job_length;int i,j,flag,t;printf("請輸入新申請內存空間的作業名和空間大小:");scanf("%s",job_name);scanf("%d",&job_length);flag=0;for(i=0;i<free_quantity;i+)if(freesi.length>=job_len

15、gth) /如果空閑空間I的長度>=作業長度 flag=1; /空閑標志位就置if(flag=0)printf("對不起,當前沒有能滿足你申請長度的空閑內存,請稍候再試!n");elset=0;i=0;while(t=0) /為空閑區間的時候 if(freesi.length>=job_length) t=1; i+;/如果空閑空間I的長度不大于作業長度,I加,判斷下一個空間i-;occupysoccupy_quantity.front=freesi.front;/把未用的空閑空間的首地址付給已用空間的首地址strcpy(occupysoccupy_quanti

16、ty.data,job_name);/已用空間的內容為作業名occupysoccupy_quantity.length=job_length;/已用空間的長度為作業的長度occupy_quantity+; /已用空間數量加if(freesi.length>job_length) /如果空間的長度大于作業的長度, freesi.front+=job_length; /空閑空間的起始首地址=原空閑區間的起始長度加作業長度 freesi.length-=job_length;/空閑區間的長度=原空閑區間的長度-作業的長度else /如果空間的長度=作業的長度 for(j=i;j<free

17、_quantity-1;j+) freesj=freesj+1;/空閑區間前移一位 free_quantity-;/空閑區間的數量減一printf("內存空間分配成功!n");/撤消作業 void cancel()char job_name20;int i,j,flag,p=0;int start;int len;printf("請輸入要撤消的作業名:");scanf("%s",job_name);flag=0;for(i=0;i<occupy_quantity;i+)if(!strcmp(occupysi.data,job_n

18、ame)/當輸入作業名匹配時 flag=i;/把i的值賦給flag; start=occupysi.front;/把已用空間的首地址賦給start len=occupysi.length;/把已用空間的長度賦給lenif(flag=0)printf("沒有這個作業名,請重新輸入作業名!n");else /加入空閑表for(i=0;i<free_quantity;i+) if(freesi.front+freesi.length)=start)/上空 if(i+1)<free_quantity)&&(freesi+1.front=start+len

19、)/下空 /第i個空閑區間的長度=第i個空閑區間的長度+第i+1個空閑區間的長度(下空閑區)+length freesi.length=freesi.length+freesi+1.length+len; for(j=i+1;j<free_quantity;j+) freesj=freesj+1;/空閑區間前移一位 free_quantity-;/空閑區的數量漸少了一個p=1; else freesi.length+=len;/(上空下不空)第i個空閑區間的長度=第i個空閑區間的長度+length,空閑區個數不變 p=1; if(freesi.front=(start+len)/下空上不空 freesi.front=start;/起始地址等于待回收地址freesi.length+=len;/第i個空閑區間的長度=第i個空閑區間的長度+lengthp=1; if(p=0) /上下空閑區都不空(直接在空閑區表中找一個空表目,將其內容插入) freesfree_quantity.front=start; freesfree_quantity.length=len; free_quantity+; /空閑區的數量加 /刪除分配表中的該作業for(i=flag;i<occupy_quantity;i+) occupysi=o

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論