試驗(yàn)四-存儲(chǔ)管理-可變分區(qū)_第1頁(yè)
試驗(yàn)四-存儲(chǔ)管理-可變分區(qū)_第2頁(yè)
試驗(yàn)四-存儲(chǔ)管理-可變分區(qū)_第3頁(yè)
試驗(yàn)四-存儲(chǔ)管理-可變分區(qū)_第4頁(yè)
試驗(yàn)四-存儲(chǔ)管理-可變分區(qū)_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)專心-專注-專業(yè)精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)存儲(chǔ)管理實(shí)驗(yàn)-可變分區(qū)管理實(shí)驗(yàn)?zāi)康模?通過(guò)分區(qū)存儲(chǔ)管理模擬算法.了解可變分區(qū)的內(nèi)存分配和回收過(guò)程.熟悉內(nèi)存分配之最先、最佳、最差適應(yīng)算法。實(shí)驗(yàn)內(nèi)容:閱讀參考程序 ,寫出該程序的內(nèi)存分配算法是哪種?完善內(nèi)存回收算法 。設(shè)計(jì)最先內(nèi)存分配算法.分配從小地址開(kāi)始 ;參考程序#include #include #define n 10 /*假定系統(tǒng)允許的最大作業(yè)數(shù)為n.假定模擬實(shí)驗(yàn)中n值為10*/#define m 10 /*假定系統(tǒng)允許的空閑區(qū)表最大為m.假定模擬實(shí)驗(yàn)中m值為1

2、0*/#define minisize 100 /*空閑分區(qū)被分配時(shí).如果分配后剩余的空間小于minisize.則將該空閑分區(qū)全部分配.若大于minisize.則切割分配,即不留小碎片*/structfloat address; /*已分配分區(qū)起始地址*/float length; /*已分配分區(qū)長(zhǎng)度.單位為字節(jié)*/int flag; /*已分配區(qū)表登記欄標(biāo)志.用0表示空欄目*/used_tablen; /*已分配區(qū)表。即存放已經(jīng)分配的分區(qū)*/ structfloat address; /*空閑區(qū)起始地址*/float length; /*空閑區(qū)長(zhǎng)度.單位為字節(jié)*/int flag; /*空閑

3、區(qū)表登記欄標(biāo)志.用0表示空欄目.可用來(lái)登記空閑區(qū).用1表示該空閑區(qū)未分配*/free_tablem; /*空閑區(qū)表.即存放空閑分區(qū)*/*主存分配函數(shù)*/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(無(wú)可用空閑區(qū)n); return; /*找到

4、可用空閑區(qū).開(kāi)始分配:若空閑區(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) /*無(wú)表目可填寫已分配分區(qū)*/ printf(無(wú)表目填寫已分分區(qū).錯(cuò)誤n); /*修正空閑區(qū)表*/ if(free_tablek.flag=0) /*前面找到的是整個(gè)空閑分區(qū)*/ free_tablek.flag=1; else /*前面找到的是某個(gè)空閑分區(qū)的一部分*/ free_tablek.length=free_tablek.length+xk; return; else /*修改已分配表*/ used_tablei.address=ad; used_tablei.length=xk; used_tablei.flag=J;

6、 return;/*主存分配函數(shù)結(jié)束*/*主存回收函數(shù)*/void reclaim(char J)/*回收作業(yè)名為J的作業(yè)所占主存空間*/ int i,k,j,s,t; float S,L; /*尋找已分配表中對(duì)應(yīng)登記項(xiàng)*/ 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和長(zhǎng)度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ū).三項(xiàng)合并*/ 。 else /*上鄰空閑區(qū).下鄰非空閑區(qū).與上鄰合并*/ 。 else if(j!=-1) /*上鄰非空閑區(qū).

8、下鄰為空閑區(qū).與下鄰合并*/ 。 else /*上下鄰均為非空閑區(qū).回收區(qū)域直接填入*/ /*在空閑區(qū)表中尋找空欄目*/ t=0; while(free_tablet.flag=1&t=m)/*空閑區(qū)表滿,回收空間失敗,將已分配表復(fù)原*/ printf(主存空閑表沒(méi)有空間,回收空間失敗n); used_tables.flag=J; return; free_tablet.address=S; free_tablet.length=L; free_tablet.flag=1; return;/*主存回收函數(shù)結(jié)束*/int main( ) int i,a; float xk; char J; /*

9、空閑分區(qū)表初始化:*/ free_table0.address=10000; /*起始地址假定為10000*/ free_table0.length=10240; /*長(zhǎng)度假定為10240.即10k*/ free_table0.flag=1; /*初始空閑區(qū)為一個(gè)整體空閑區(qū)*/ for(i=1;im;i+) free_tablei.flag=0; /*其余空閑分區(qū)表項(xiàng)未被使用*/ /*已分配表初始化:*/ for(i=0;i=a&J=A&J=a&J=A&J=Z); reclaim(J); /*回收主存空間*/ break; case 3: /*a=3顯示主存情況*/ /*輸出空閑區(qū)表和已分配表

10、的內(nèi)容*/ printf(輸出空閑區(qū)表:n起始地址t分區(qū)長(zhǎng)度t標(biāo)志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ū)長(zhǎng)度 標(biāo)志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(沒(méi)有該選項(xiàng)n); /*case*/ /*While*/ 代碼:#pragma once#includeusing namespace std;#define n 10 /*假定系統(tǒng)允許的最大作業(yè)數(shù)為n.假定模擬實(shí)驗(yàn)中n值為10*/#define m 10 /*假定系統(tǒng)允許的空閑區(qū)表最大為m.假定模擬實(shí)驗(yàn)中m值為10*/#define min

12、isize 100 /*空閑分區(qū)被分配時(shí).如果分配后剩余的空間小于minisize.則將該空閑分區(qū)全部分配.若大于minisize.則切割分配,即不留小碎片*/class Memorypublic:/已分配表區(qū).存放已經(jīng)分配的分區(qū)structfloat address; /*已分配分區(qū)起始地址*/float length; /*已分配分區(qū)長(zhǎng)度.單位為字節(jié)*/int flag; /*已分配區(qū)表登記欄標(biāo)志.用0表示空欄目*/used_tablen; /*已分配區(qū)表。即存放已經(jīng)分配的分區(qū)*/ /空閑表區(qū).存放空閑分區(qū)structfloat address; /*空閑區(qū)起始地址*/float leng

13、th; /*空閑區(qū)長(zhǎng)度.單位為字節(jié)*/int flag; /*空閑區(qū)表登記欄標(biāo)志.用0表示空欄目.可用來(lái)登記空閑區(qū).用1表示該空閑區(qū)未分配*/free_tablem; /*空閑區(qū)表.即存放空閑分區(qū)*/public:Memory();Memory();/*主存分配函數(shù)參數(shù)char J:作業(yè)id參數(shù)float xk:作業(yè)所需要的內(nèi)存大小*/void allocate(char J, float xk);/*給J作業(yè).采用最佳分配算法分配xk大小的空間*/void reclaim(char J);/主存回收函數(shù)void fistfit(char J, float xk);/首次適應(yīng)算法;#inclu

14、de Memory.hMemory:Memory()Memory:Memory()/內(nèi)存分配函數(shù)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 無(wú)可用分區(qū) endl;return;/未找到可用的空閑分區(qū).函數(shù)調(diào)用結(jié)束.返回/*若找到可用空閑分區(qū):if(可用空閑分區(qū)與所需空閑分區(qū)的

15、差小于minisize).該空閑分區(qū)全部分配否則的話.從空閑分區(qū)中劃出一部分來(lái)給作業(yè)分配內(nèi)存*/if (free_tablek.length - xk = minisize)free_tablek.flag = 0;/將此分區(qū)置為不可分配ad = free_tablek.address;/將作業(yè)的起始地址寫為該分區(qū)的起始地址xk = free_tablek.length;/將作業(yè)所需要的空間長(zhǎng)度修改為該分區(qū)的長(zhǎng)度else/所需分區(qū)大小與可用空閑分區(qū)的大小差值大于minisizefree_tablek.length = free_tablek.length - xk;/空閑分區(qū)的大小修改為原大小

16、減去所需空間大???ad = free_tablek.address + free_tablek.length; /使作業(yè)的結(jié)束地址剛好位于該分區(qū)的末尾/*修改已分配的分區(qū)表*/int i = 0;while(used_tablei.flag != 0 & i= n) /*無(wú)表目可填寫已分配分區(qū)*/cout 無(wú)表目填寫已分分區(qū).錯(cuò)誤n;/*修正空閑區(qū)表*/if (free_tablek.flag = 0)/如果整個(gè)分區(qū)都分配給J作業(yè)free_tablek.flag = 1;/將該分區(qū)置為可用狀態(tài)else/*前面找到的是某個(gè)空閑分區(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;/*主存回收函數(shù)*/void Memory:reclaim(char J)int i, k, j, s, t;float S, L;/*尋找已分配表中對(duì)應(yīng)登記項(xiàng)*/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和長(zhǎng)度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ū).三項(xiàng)合并*/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ū)表滿,回收空間失敗,將已分配表復(fù)原*/printf(主存空閑表沒(méi)有空間,回收空間失敗n);used_tables.flag = J;return;free_tablet.address = S;free_tablet.length = L;free_tablet.flag = 1;return;/首次適應(yīng)算法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 無(wú)可用分區(qū) endl;return;/未找到可用的空閑分區(qū).函數(shù)調(diào)用結(jié)束.返回/*若找到可用空閑分區(qū):if(可用空閑分區(qū)與所需空閑分區(qū)的差小于minisize).該空閑分區(qū)全部分配否則的話.從空閑分區(qū)中劃出

23、一部分來(lái)給作業(yè)分配內(nèi)存*/if (free_tablek.length - xk = minisize)free_tablek.flag = 0;/將此分區(qū)置為不可分配ad = free_tablek.address;/將作業(yè)的起始地址寫為該分區(qū)的起始地址xk = free_tablek.length;/將作業(yè)所需要的空間長(zhǎng)度修改為該分區(qū)的長(zhǎng)度else/所需分區(qū)大小與可用空閑分區(qū)的大小差值大于minisizefree_tablek.length = free_tablek.length - xk;/空閑分區(qū)的大小修改為原大小減去所需空間大小?ad = free_tablek.address +

24、 free_tablek.length; /使作業(yè)的結(jié)束地址剛好位于該分區(qū)的末尾/*修改已分配的分區(qū)表*/int i = 0;while (used_tablei.flag != 0 & i= n) /*無(wú)表目可填寫已分配分區(qū)*/cout 無(wú)表目填寫已分分區(qū).錯(cuò)誤n;/*修正空閑區(qū)表*/if (free_tablek.flag = 0)/如果整個(gè)分區(qū)都分配給J作業(yè)free_tablek.flag = 1;/將該分區(qū)置為可用狀態(tài)else/*前面找到的是某個(gè)空閑分區(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; /*長(zhǎng)度假定為10240.即10k*/M.free_table0.flag = 1; /*初始空閑區(qū)為一個(gè)整體空閑區(qū)*/for (int i = 1; im; i+)M.free_tablei.f

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論