




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、精選優(yōu)質文檔-傾情為你奉上精選優(yōu)質文檔-傾情為你奉上專心-專注-專業(yè)專心-專注-專業(yè)精選優(yōu)質文檔-傾情為你奉上專心-專注-專業(yè)存儲管理實驗-可變分區(qū)管理實驗目的: 通過分區(qū)存儲管理模擬算法.了解可變分區(qū)的內存分配和回收過程.熟悉內存分配之最先、最佳、最差適應算法。實驗內容:閱讀參考程序 ,寫出該程序的內存分配算法是哪種?完善內存回收算法 。設計最先內存分配算法.分配從小地址開始 ;參考程序#include #include #define n 10 /*假定系統(tǒng)允許的最大作業(yè)數為n.假定模擬實驗中n值為10*/#define m 10 /*假定系統(tǒng)允許的空閑區(qū)表最大為m.假定模擬實驗中m值為1
2、0*/#define minisize 100 /*空閑分區(qū)被分配時.如果分配后剩余的空間小于minisize.則將該空閑分區(qū)全部分配.若大于minisize.則切割分配,即不留小碎片*/structfloat address; /*已分配分區(qū)起始地址*/float length; /*已分配分區(qū)長度.單位為字節(jié)*/int flag; /*已分配區(qū)表登記欄標志.用0表示空欄目*/used_tablen; /*已分配區(qū)表。即存放已經分配的分區(qū)*/ structfloat address; /*空閑區(qū)起始地址*/float length; /*空閑區(qū)長度.單位為字節(jié)*/int flag; /*空閑
3、區(qū)表登記欄標志.用0表示空欄目.可用來登記空閑區(qū).用1表示該空閑區(qū)未分配*/free_tablem; /*空閑區(qū)表.即存放空閑分區(qū)*/*主存分配函數*/void allocate(char J,float xk) /*給J作業(yè).采用最佳分配算法分配xk大小的空間*/ int i,k; float ad; k=-1; for(i=0;i=xk & free_tablei.flag=1) if(k=-1|free_tablei.lengthfree_ta69blek.length) k=i; if(k=-1)/*未找到可用空閑區(qū).返回*/ printf(無可用空閑區(qū)n); return; /*找到
4、可用空閑區(qū).開始分配:若空閑區(qū)大小與要求分配的空間差小于minisize大小.則空閑區(qū)全部分配;若空閑區(qū)大小與要求分配的空間差大于minisize大小.則從空閑區(qū)劃出一部分分配*/ if(free_tablek.length-xk=minisize) free_tablek.flag=0; ad=free_tablek.address; xk=free_tablek.length; else free_tablek.length=free_tablek.length-xk; ad=free_tablek.address+free_tablek.length; /*修改已分配分區(qū)表*/ i=0;
5、 while(used_tablei.flag!=0&i=n) /*無表目可填寫已分配分區(qū)*/ printf(無表目填寫已分分區(qū).錯誤n); /*修正空閑區(qū)表*/ if(free_tablek.flag=0) /*前面找到的是整個空閑分區(qū)*/ free_tablek.flag=1; else /*前面找到的是某個空閑分區(qū)的一部分*/ free_tablek.length=free_tablek.length+xk; return; else /*修改已分配表*/ used_tablei.address=ad; used_tablei.length=xk; used_tablei.flag=J;
6、 return;/*主存分配函數結束*/*主存回收函數*/void reclaim(char J)/*回收作業(yè)名為J的作業(yè)所占主存空間*/ int i,k,j,s,t; float S,L; /*尋找已分配表中對應登記項*/ s=0; while(used_tables.flag!=J|used_tables.flag=0)&s=n)/*在已分配表中找不到名字為J的作業(yè)*/ printf(找不到該作業(yè)n); return; /*修改已分配表*/ used_tables.flag=0; /*取得歸還分區(qū)的起始地址S和長度L*/ S=used_tables.address; L=used_tabl
7、es.length; j=-1;k=-1;i=0; /*尋找回收分區(qū)的空閑上下鄰.上鄰表目k.下鄰表目j*/ while(im&(j=-1|k=-1) if(free_tablei.flag=1) if(free_tablei.address+free_tablei.length=S) k=i;/*找到上鄰*/ if(free_tablei.address=S+L) j=i;/*找到下鄰*/ i+; if(k!=-1) if(j!=-1) /* 上鄰空閑區(qū).下鄰空閑區(qū).三項合并*/ 。 else /*上鄰空閑區(qū).下鄰非空閑區(qū).與上鄰合并*/ 。 else if(j!=-1) /*上鄰非空閑區(qū).
8、下鄰為空閑區(qū).與下鄰合并*/ 。 else /*上下鄰均為非空閑區(qū).回收區(qū)域直接填入*/ /*在空閑區(qū)表中尋找空欄目*/ t=0; while(free_tablet.flag=1&t=m)/*空閑區(qū)表滿,回收空間失敗,將已分配表復原*/ printf(主存空閑表沒有空間,回收空間失敗n); used_tables.flag=J; return; free_tablet.address=S; free_tablet.length=L; free_tablet.flag=1; return;/*主存回收函數結束*/int main( ) int i,a; float xk; char J; /*
9、空閑分區(qū)表初始化:*/ free_table0.address=10000; /*起始地址假定為10000*/ free_table0.length=10240; /*長度假定為10240.即10k*/ free_table0.flag=1; /*初始空閑區(qū)為一個整體空閑區(qū)*/ for(i=1;im;i+) free_tablei.flag=0; /*其余空閑分區(qū)表項未被使用*/ /*已分配表初始化:*/ for(i=0;i=a&J=A&J=a&J=A&J=Z); reclaim(J); /*回收主存空間*/ break; case 3: /*a=3顯示主存情況*/ /*輸出空閑區(qū)表和已分配表
10、的內容*/ printf(輸出空閑區(qū)表:n起始地址t分區(qū)長度t標志n); for(i=0;im;i+) printf(%.0ft%.0ft%6dn,free_tablei.address,free_tablei.length, free_tablei.flag); printf( 按任意鍵,輸出已分配區(qū)表n); getchar(); printf( 輸出已分配區(qū)表:n起始地址 分區(qū)長度 標志n); for(i=0;in;i+) if(used_tablei.flag!=0) printf(%.0ft%.0ft%6cn,used_tablei.address,used_tablei.length
11、, used_tablei.flag); else printf(%.0ft%.0ft%6dn,used_tablei.address,used_tablei.length, used_tablei.flag); break; default:printf(沒有該選項n); /*case*/ /*While*/ 代碼:#pragma once#includeusing namespace std;#define n 10 /*假定系統(tǒng)允許的最大作業(yè)數為n.假定模擬實驗中n值為10*/#define m 10 /*假定系統(tǒng)允許的空閑區(qū)表最大為m.假定模擬實驗中m值為10*/#define min
12、isize 100 /*空閑分區(qū)被分配時.如果分配后剩余的空間小于minisize.則將該空閑分區(qū)全部分配.若大于minisize.則切割分配,即不留小碎片*/class Memorypublic:/已分配表區(qū).存放已經分配的分區(qū)structfloat address; /*已分配分區(qū)起始地址*/float length; /*已分配分區(qū)長度.單位為字節(jié)*/int flag; /*已分配區(qū)表登記欄標志.用0表示空欄目*/used_tablen; /*已分配區(qū)表。即存放已經分配的分區(qū)*/ /空閑表區(qū).存放空閑分區(qū)structfloat address; /*空閑區(qū)起始地址*/float leng
13、th; /*空閑區(qū)長度.單位為字節(jié)*/int flag; /*空閑區(qū)表登記欄標志.用0表示空欄目.可用來登記空閑區(qū).用1表示該空閑區(qū)未分配*/free_tablem; /*空閑區(qū)表.即存放空閑分區(qū)*/public:Memory();Memory();/*主存分配函數參數char J:作業(yè)id參數float xk:作業(yè)所需要的內存大小*/void allocate(char J, float xk);/*給J作業(yè).采用最佳分配算法分配xk大小的空間*/void reclaim(char J);/主存回收函數void fistfit(char J, float xk);/首次適應算法;#inclu
14、de Memory.hMemory:Memory()Memory:Memory()/內存分配函數void Memory:allocate(char J, float xk)int k = -1;float ad;/作業(yè)J的起始地址for (int i = 0; i = xk&free_tablei.flag = 1)if (k = -1 | free_tablei.length free_tablek.length)k = i;if (k = -1)cout 無可用分區(qū) endl;return;/未找到可用的空閑分區(qū).函數調用結束.返回/*若找到可用空閑分區(qū):if(可用空閑分區(qū)與所需空閑分區(qū)的
15、差小于minisize).該空閑分區(qū)全部分配否則的話.從空閑分區(qū)中劃出一部分來給作業(yè)分配內存*/if (free_tablek.length - xk = minisize)free_tablek.flag = 0;/將此分區(qū)置為不可分配ad = free_tablek.address;/將作業(yè)的起始地址寫為該分區(qū)的起始地址xk = free_tablek.length;/將作業(yè)所需要的空間長度修改為該分區(qū)的長度else/所需分區(qū)大小與可用空閑分區(qū)的大小差值大于minisizefree_tablek.length = free_tablek.length - xk;/空閑分區(qū)的大小修改為原大小
16、減去所需空間大???ad = free_tablek.address + free_tablek.length; /使作業(yè)的結束地址剛好位于該分區(qū)的末尾/*修改已分配的分區(qū)表*/int i = 0;while(used_tablei.flag != 0 & i= n) /*無表目可填寫已分配分區(qū)*/cout 無表目填寫已分分區(qū).錯誤n;/*修正空閑區(qū)表*/if (free_tablek.flag = 0)/如果整個分區(qū)都分配給J作業(yè)free_tablek.flag = 1;/將該分區(qū)置為可用狀態(tài)else/*前面找到的是某個空閑分區(qū)的一部分*/free_tablek.length = free_t
17、ablek.length + xk;/更新空閑分區(qū)的大小return;else/*修改已分配表*/used_tablei.address = ad;used_tablei.length = xk;used_tablei.flag = J;return;/*主存回收函數*/void Memory:reclaim(char J)int i, k, j, s, t;float S, L;/*尋找已分配表中對應登記項*/s = 0;while (used_tables.flag != J | used_tables.flag = 0) & s= n)/*在已分配表中找不到名字為J的作業(yè)*/cout 找
18、不到該作業(yè)! endl;return;/*修改已分配表*/used_tables.flag = 0;/*取得歸還分區(qū)的起始地址S和長度L*/S = used_tables.address;L = used_tables.length;j = -1; k = -1; i = 0;/*尋找回收分區(qū)的空閑上下鄰.上鄰表目k.下鄰表目j*/while (im & (j = -1 | k = -1)if (free_tablei.flag = 1)/如果該分區(qū)未分配if (free_tablei.address + free_tablei.length = S) k = i;/*找到上鄰*/if (fr
19、ee_tablei.address = S + L) j = i;/*找到下鄰*/i+;if (k != -1)if (j != -1)/* 上鄰空閑區(qū).下鄰空閑區(qū).三項合并*/free_tablek.length = free_tablek.length + S + free_tablej.length;free_tablej.flag = 0;else/*上鄰空閑區(qū).下鄰非空閑區(qū).與上鄰合并*/free_tablek.length = free_tablek.length + S;elseif (j != -1)/*上鄰非空閑區(qū).下鄰為空閑區(qū).與下鄰合并*/free_tables.leng
20、th += free_tablej.length;free_tablej.flag = 0;else/*上下鄰均為非空閑區(qū).回收區(qū)域直接填入*/*在空閑區(qū)表中尋找空欄目*/t = 0;while (free_tablet.flag = 1 & t= m)/*空閑區(qū)表滿,回收空間失敗,將已分配表復原*/printf(主存空閑表沒有空間,回收空間失敗n);used_tables.flag = J;return;free_tablet.address = S;free_tablet.length = L;free_tablet.flag = 1;return;/首次適應算法void Memory:f
21、istfit(char J, float xk)for (int i = 0; i m; i+)/給空閑表區(qū)排序for (int j = i + 1; j free_tablej.length)int temp = free_tablei.length;free_tablei.length = free_tablej.length;free_tablej.length = temp;temp = free_tablei.address;free_tablei.address = free_tablej.address;free_tablej.address = temp;temp = free
22、_tablei.flag;free_tablei.flag = free_tablej.flag;free_tablej.flag = temp;int k = -1;float ad;/作業(yè)J的起始地址for (int i = 0; i m; i+)if (xk = free_tablei.length)&(free_tablei.flag=1)k = i;if (k = -1)cout 無可用分區(qū) endl;return;/未找到可用的空閑分區(qū).函數調用結束.返回/*若找到可用空閑分區(qū):if(可用空閑分區(qū)與所需空閑分區(qū)的差小于minisize).該空閑分區(qū)全部分配否則的話.從空閑分區(qū)中劃出
23、一部分來給作業(yè)分配內存*/if (free_tablek.length - xk = minisize)free_tablek.flag = 0;/將此分區(qū)置為不可分配ad = free_tablek.address;/將作業(yè)的起始地址寫為該分區(qū)的起始地址xk = free_tablek.length;/將作業(yè)所需要的空間長度修改為該分區(qū)的長度else/所需分區(qū)大小與可用空閑分區(qū)的大小差值大于minisizefree_tablek.length = free_tablek.length - xk;/空閑分區(qū)的大小修改為原大小減去所需空間大小?ad = free_tablek.address +
24、 free_tablek.length; /使作業(yè)的結束地址剛好位于該分區(qū)的末尾/*修改已分配的分區(qū)表*/int i = 0;while (used_tablei.flag != 0 & i= n) /*無表目可填寫已分配分區(qū)*/cout 無表目填寫已分分區(qū).錯誤n;/*修正空閑區(qū)表*/if (free_tablek.flag = 0)/如果整個分區(qū)都分配給J作業(yè)free_tablek.flag = 1;/將該分區(qū)置為可用狀態(tài)else/*前面找到的是某個空閑分區(qū)的一部分*/free_tablek.length = free_tablek.length + xk;/更新空閑分區(qū)的大小return
25、;else/*修改已分配表*/used_tablei.address = ad;used_tablei.length = xk;used_tablei.flag = J;return;#include #includeMemory.husing namespace std;int main()Memory M;char J;/*空閑分區(qū)表初始化:*/M.free_table0.address = 10000; /*起始地址假定為10000*/M.free_table0.length = 10240; /*長度假定為10240.即10k*/M.free_table0.flag = 1; /*初始空閑區(qū)為一個整體空閑區(qū)*/for (int i = 1; im; i+)M.free_tablei.f
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國FMS物流管理軟件數據監(jiān)測研究報告
- 2025年中國24針平推打印機數據監(jiān)測報告
- 2025至2030年中國黑白藍底膠片市場分析及競爭策略研究報告
- 2025至2030年中國鋁合金分析儀器市場分析及競爭策略研究報告
- 2025至2030年中國輸送槽市場分析及競爭策略研究報告
- 2025至2030年中國結晶喂線機市場分析及競爭策略研究報告
- 2025至2030年中國礦泉水水處理設備市場分析及競爭策略研究報告
- 2025至2030年中國甲氧胺鹽酸鹽市場分析及競爭策略研究報告
- 2025至2030年中國混凝試驗儀市場分析及競爭策略研究報告
- 2025至2030年中國水解蛋白酶市場分析及競爭策略研究報告
- 苗木種植專項方案(3篇)
- 監(jiān)督檢查酒店管理制度
- 河南省鄭州市鞏義市2023-2024學年六年級下學期科學6月期末試卷(含答案)
- 2024年山西特崗教師招聘筆試真題
- 【英語 北京版】2025年普通高等學校招生選擇性考試含答案
- 黑龍江省哈爾濱市第九中學校2024-2025學年高一下學期6月月考化學試題(含答案)
- 2025-2030年中國低溫超導材料行業(yè)市場深度調研及發(fā)展前景與投資戰(zhàn)略研究報告
- 二手車跨境交易平臺創(chuàng)新創(chuàng)業(yè)項目商業(yè)計劃書
- 2023-2024學年浙江省寧波市慈溪市四年級(下)期末數學試卷
- 2025年黑龍江、吉林、遼寧、內蒙古高考生物真題試卷(解析版)
- 阿米巴模式的合同協(xié)議書
評論
0/150
提交評論