• /  8
  • 下載費用: 14.90積分  

實驗五 動態分區存儲管理.doc

'實驗五 動態分區存儲管理.doc'
? 實驗五 動態分區存儲管理一、實驗目的深入了解采用動態分區存儲管理方式的內存分配回收的實現。通過編寫和調試存儲管理的模擬程序以加深對存儲管理方案的理解,熟悉動態分區存儲管理的內存分配和回收。二、實驗內容編寫程序完成動態分區存儲管理方式的內存分配回收。具體包括:確定內存空間分配表;采用最優適應算法完成內存空間的分配和回收;編寫主函數對所做工作進行測試。三、設計思路 整體思路:動態分區管理方式將內存除操作系統占用區域外的空間看成一個大的空閑區。當作業要求裝入內存時,根據作業需要內存空間的大小 查詢內存中的各個空閑區,當從內存空間中找到一個大于或等于該作業大小的內存空閑區時,選擇其中一個空閑區,按作業需求量劃出一個分區裝人該作業,作業執行完后,其所占的內存分區被收回,成為一個空閑區。如果該空閑區的相鄰分區也是空閑區,則需要將相鄰空閑區合并成一個空閑區。設計所采用的算法: 采用最優適應算法,每次為作業分配內存時,總是把既能滿足要求、又是最小的空閑分區分配給作業。 但最優適應算法容易出現找到的一個分區可能只比作業所需求的長度略大一點的情行,這時,空閑區分割后剩下的空閑區就很小以致很難再使用,降低了內存的使用率。為解決此問題,設定一個限值minsize,如果空閑區的大小減去作業需求長度得到的值小于等于minsize,不再將空閑區分成己分分區和空閑區兩部分,而是將整個空閑區都分配給作業。 內存分配與回收所使用的結構體: 為便于對內存的分配和回收,建立兩張表記錄內存的使用情況。一張為記錄作業占用分區的“內存分配表”,內容包括分區起始地址、長度、作業名/標志(為0時作為標志位表示空欄目);一張為記錄空閑區的“空閑分區表”,內容包括分區起始地址、長度、標志(0表空欄目,1表未分配)。兩張表都采用順序表形式。 關于分配留下的內存小碎片問題:當要裝入一個作業時,從“空閑分區表”中查找標志為“1”(未分配)且滿足作業所需內存大小的最小空閑區,若空閑區的大小與作業所需大小的差值小于或等于minsize,把該分區全部分配給作業,并把該空閑區的標志改為“0”(空欄目)。同時,在已分配區表中找到一個標志為“0”的欄目登記新裝人作業所占用分區的起始地址,長度和作業名。若空閑區的大小與作業所需大小的差值大于minsize。則把空閑區分成兩部分,一部分用來裝入作業,另外一部分仍為空閑區。這時只要修改原空閑區的長度,且把新裝人的作業登記到已分配區表中。內存的回收:在動態分區方式下回收內存空間時,先檢查是否有與歸還區相鄰的空閑區(上鄰空閑區,下鄰空閑區)。若有,則將它們合件成一個空閑區。程序實現時,首先將要釋放的作業在“內存分配表”中的記錄項的標志改為“0”(空欄目),然后檢查“空閑區表”中標志為‘1’(未分配)的欄目,查找是否有相鄰的空閑區,若有,將之合并,并修改空閑區的起始地址和長度。四、數據結構定義(1)已分配表的定義:struct{float address; //已分分區起始地址 float length; //已分分區長度,單位為字節 int flag; //已分配區表登記欄標志,"0"表示空欄目,實驗中只支持一個字符的作業名}used_table[n]; //已分配區表(2)空閑分區表的定義:struct{float address; //空閑區起始地址 float length; //空閑區長度,單位為字節 int flag; //空閑區表登記欄標志,用"0"表示空欄目,用"1"表示未分配}free_table[m]; //空閑區表 (3)全局變量float minsize=5; #define n 10 //假定系統允許的最大作業數量為n#define m 10 //假定系統允許的空閑區表最大為m 五、源程序代碼#include #include //全局變量float minsize=5;int count1=0;int count2=0;#define M 10 //假定系統允許的空閑區表最大為m#define N 10 //假定系統允許的最大作業數量為n//已分配表的定義struct{float address; //已分分區起始地址 float length; //已分分區長度,單位為字節 int flag; //已分配區表登記欄標志,"0"表示空欄目}used_table[N]; //已分配區表對象名//空閑區表的定義:struct{float address; //空閑區起始地址 float length; //空閑區長度,單位為字節 int flag; //空閑區表登記欄標志,用"0"表示空欄目,用"1"表示未分配}free_table[M]; //空閑區表對象名//函數聲明void initialize(void);int distribute(int, float);int recycle(int);void show();//初始化兩個表void initialize(void){ int a; for(a=0; a<=N-1; a++) used_table[a].flag=0; //已分配表的表項全部置為空表項 free_table[0].address=1000; free_table[0].length=1024; free_table[0].flag=1; //空閑區表的表項全部為未分配}//最優分配算法實現的動態分區int distribute(int process_name, float need_length){ int i, k=-1; //k用于定位在空閑表中選擇的未分配欄 float ads, len; int count=0; i=0; while(i<=M-1) //循環找到最佳的空閑分區 { if(free_table[i].flag==1 && need_length <=free_table[i].length) { count++; if(count==1||free_table[i].length < free_table[k].length) k=i; } i=i+1; } if(k!=-1) { if((free_table[k].length-need_length)<=minsize) //整個分配 { free_table[k].flag=0; ads=free_table[k].address; len=free_table[k].l。省略部分。/回收區也有下鄰接,和上下鄰接合并 free_table[k].length+=free_table[j].length+recycle_length; free_table[j].flag=0; //將第j欄的標記置為'0' } else //不存在下鄰接,和上鄰接合并 free_table[k].length+=recycle_length; } else if(j!=-1){ //只有下鄰接,和下鄰接合并 free_table[j].length+=recycle_length; free_table[j].address=recycle_address; } else { //上下鄰接都沒有 x=0; while(free_table[x].flag!=0) x=x+1; //在空閑區表中查找一個狀態為'0'的欄目 if(x<=M-1){ //找到后,在空閑分區中登記回收的內存 free_table[x].address=recycle_address; free_table[x].length=recycle_length; free_table[x].flag=1; } else{ //空閑表已滿,執行回收失敗 used_table[y].flag=process_name; cout<<"空閑區已滿,回收失??!\n"; return 0; } } return process_name;}void show() //程序執行時輸出模擬的內存分配回收表{ cout<<"+++++++++++++++++++++++++++++++++++++++\n"; cout<<"+++++++ 空 閑 區 +++++++\n"; cout<<"+++++++++++++++++++++++++++++++++++++++\n"; for(int i=0;i<=count2;i++) if(free_table[i].flag!=0) cout<<"初始地址:"<<free_table[i].address<<" "<<"長度:"<<free_table[i].length<<" "<<"狀 態:"<<free_table[i].flag<<endl; cout<<"+++++++++++++++++++++++++++++++++++++++\n"; cout<<"+++++++ 已 分 配 區 ++++++\n"; cout<<"+++++++++++++++++++++++++++++++++++++++\n"; for(int j=0;j<count1;j++) if(used_table[j].flag!=0) cout<<"初始地址:"<<used_table[j].address<<" "<<"長度:"<<used_table[j].length<<" "<<"作業名:"<<used_table[j].flag<<endl;}void main() //主函數調用各功能函數對所有工作進行測試{ int choice; //用來選擇將要進行的操作 int job_name; float need_memory; bool exitFlag=false; cout<<" 動態分區分配方式的模擬 \n"; cout<<"************************************\n"; cout<<"請選擇操作類型:\n"; initialize(); //開創空閑區和已分配區兩個表 while(!exitFlag) { cout<<"********************************************\n"; cout<<"** 1: 分配內存 2: 回收內存 **\n"; cout<<"** 3: 查看分配 0: 退 出 **\n"; cout<<"********************************************\n"; cout<>choice; switch(choice) { case 0: exitFlag=true; //退出操作 break; case 1: cout<>job_name>>need_memory; if(job_name!=0&&need_memory!=0) distribute(job_name, need_memory); // 分配內存 else if(job_name==0) cout<<"作業號不能為零!\n請重新選擇操作:\n"; else if(need_memory==0) cout<<"內存分配數不能為零!\n請重新選擇操作:\n"; break; case 2: int ID; cout<>ID; if(ID!=0) recycle(ID); //回收內存 else cout<<"作業名不能為零!\n請重新選擇操作:\n"; break; case 3: show(); break; } }}六、實驗結果分析1. 運行源程序,模擬內存的分配與回收操作,并記錄實驗結果。2. 簡要分析distribute函數和recycle函數的執行流程。8
關 鍵 詞:
動態 實驗 管理 存儲 分區
 天天文庫所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
關于本文
本文標題:實驗五 動態分區存儲管理.doc
鏈接地址: http://www.476824.live/p-49949139.html
關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服點擊這里,給天天文庫發消息,QQ:1290478887 - 聯系我們

本站為“文檔C2C交易模式”,即用戶上傳的文檔直接賣給(下載)用戶,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有【成交的100%(原創)】。本站是網絡服務平臺方,若您的權利被侵害,侵權客服QQ:1290478887 歡迎舉報。

[email protected] 2017-2027 http://www.476824.live 網站版權所有

粵ICP備19057495號 

收起
展開
球探网即时蓝球比分 广东11选五计划一中一 2008上证指数最高 四川快乐十二前三走势图 明利配资 福建体彩36选7模拟机选 江西时时彩交易时间 配资平台哪个好`找恒瑞行配资 148期七乐彩开奖结果 陕西快乐10分下载 近期新上市的股票