操作系統(tǒng)內(nèi)存分配算法模擬實(shí)現(xiàn)_第1頁(yè)
操作系統(tǒng)內(nèi)存分配算法模擬實(shí)現(xiàn)_第2頁(yè)
操作系統(tǒng)內(nèi)存分配算法模擬實(shí)現(xiàn)_第3頁(yè)
操作系統(tǒng)內(nèi)存分配算法模擬實(shí)現(xiàn)_第4頁(yè)
操作系統(tǒng)內(nèi)存分配算法模擬實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、.專業(yè)整理.實(shí)驗(yàn)名稱內(nèi)存分配與回收算法實(shí)現(xiàn)同組人姓名實(shí)驗(yàn)性質(zhì)基本操作-驗(yàn)證性綜合性設(shè)計(jì)性實(shí)驗(yàn)日期2010-5-17實(shí)驗(yàn)成績(jī)教師評(píng)價(jià):實(shí)驗(yàn)預(yù)習(xí)口實(shí)驗(yàn)操作口實(shí)驗(yàn)結(jié)果口實(shí)驗(yàn)報(bào)告口 其它口教師簽名:一、實(shí)驗(yàn)?zāi)康募耙?)掌握為實(shí)現(xiàn)多道程序并發(fā)執(zhí)行,操作系統(tǒng)是如何通過作業(yè)調(diào)度選擇作業(yè)進(jìn)入內(nèi)存2)系統(tǒng)如何為進(jìn)入內(nèi)存的作業(yè)分配內(nèi)存空間,實(shí)現(xiàn)多道作業(yè)何時(shí)駐留內(nèi)存,就緒進(jìn)程隊(duì)列中的多個(gè)進(jìn)程是如何以分式方式共享CPU作業(yè)運(yùn)行完成離開系統(tǒng)時(shí),系統(tǒng)如何進(jìn)行內(nèi)存回收,計(jì)算進(jìn)程周轉(zhuǎn)時(shí)間。3)掌握各種調(diào)度算法,以及實(shí)現(xiàn)所需的各種數(shù)據(jù)結(jié)構(gòu)。二、實(shí)驗(yàn)內(nèi)容根據(jù)給定的動(dòng)態(tài)分區(qū)分配算法流程圖,用你熟悉的計(jì)算機(jī)編程語(yǔ)言編寫一程序,該程

2、 序?qū)崿F(xiàn)內(nèi)存的合理分配后回收。三、主要設(shè)備及軟件PC Windows2000操作系統(tǒng)、Linux操作系統(tǒng)四、實(shí)驗(yàn)流程、操作步驟或核心代碼、算法片段 1、分配算法流程出空閑分區(qū)塊類:class FreeBlock空閑分區(qū)鏈類:class FreeList內(nèi)存分配回收算法類:class MemoryMa nager測(cè)試類(主類):class TestForMemManage具體實(shí)現(xiàn)請(qǐng)?jiān)试S我先列出核心部分,內(nèi)存分配回收算法類的實(shí)現(xiàn):package com.kaip in g.memoryma nage;/ 個(gè)人包import java.util.Sea nner;public class Memor

3、yMa nager FreeList flist; /空閑分區(qū)類對(duì)象public MemoryMa nager()flist = new FreeList();flist.l nitFBIock();public void memAllocati on (i nt size, Stri ng n ewjob _n ame)/內(nèi)存分酉己(首次適應(yīng)算法)FreeBlock q=flist.head;FreeBlock p=flist.head. next;while != n ull)if(size v= 0)System.out.println(Hn申請(qǐng)的空間不能小于1!H);break;)if

4、(p.state = false && p.size >= size)q = new FreeBlock(p.size - size);p.size = size;p. state = true;q. job_ name = newjob_n ame;r. n ext = p.n ext;p.n ext = q;break; 完成分配elsep = p.n ext; 移動(dòng)到足夠分配的空閑塊)if(p = n ull)if(flist.flistsize >= size) System.out.pri ntl n("目前尚無足夠大的空閑塊,系統(tǒng)將進(jìn)行重定位操

5、作relocation();/ 重定向memAllocation(size,newob_name);/重新分配內(nèi)存 else System.out.println(作業(yè)"+new job name+”內(nèi)存尚未分配成功!】 ) else分配內(nèi)存后可能存在大小為0的空間,將其清除System.out.printlnC 作業(yè)"+new_job_name+”內(nèi)存分配成功! p = flist.head .n ext; q = flist.head; whileg != n ull) if(p.size = 0)flist.deleteFBIock(p); p = p.n ext;)

6、private void memRecovery(FreeBlock target) /內(nèi)存回收FreeBlock p = flist.head .n ext;while(p != null)回收區(qū)與插入點(diǎn)的前一個(gè)空閑分區(qū)相鄰接if(p.next = target && p.state = false)p.size += target.size;p.n ext = target. next;回收區(qū)同時(shí)與插入點(diǎn)的前后兩個(gè)空閑分區(qū)相鄰接if(!p. next.state)p.size += p.n ext.size;p.next = p.n ext .n ext;)break;if

7、(p = target)回收區(qū)與插入點(diǎn)的后一空閑分區(qū)相鄰接if(!p. next.state)target.size += p.n ext.size; target .next = p.n ext .n ext;)break; 若兩不鄰接,則直接跳出p = p.n ext;private void relocation() /FreeBlock fron t_r=flist.head;FreeBlock r=front_r.n ext;FreeBlock beh in d_r=r. while(r != n ull)next;空閑資源重定向,回收空閑空間/當(dāng)前重定向空閑塊將r定位到第一塊空閑分

8、區(qū)塊 if(r.state = false)break;r = r.n ext;behi nd_r = r.n ext;.學(xué)習(xí)幫手.專業(yè)整理.front=front r.n ext; 記錄第一塊空閑分區(qū)的上一塊while(beh ind r != nu ll)if(beh in d r.state'front.n ext = beh in d_r;r.n ext = beh in d_r. next;beh in d_r. next = r;front r = beh ind r;)elser.size += beh in d_r.size;r.n ext = beh in d r.

9、next;)behi nd= r.n ext;System.out.pri ntln(" 重定向成功,繼續(xù)為作業(yè)分配內(nèi)存.”);)public void addJob() /添加作業(yè)intnewSize;新作業(yè)所需內(nèi)存大小String nJobName = new String("");Scanner sea nner=new Sea nn er(System.i n);System.out.pri nt("請(qǐng)輸入新任務(wù)的名稱:");nJ obName = sea nner.n extL in e();System.out.pri nt(&qu

10、ot;請(qǐng)輸入新任務(wù)所需內(nèi)存大?。?quot;);n ewSize = sea nner.n ext In t();memAllocati on(n ewSize ,nJ obName);)public void delJob() /銷毀作業(yè)String cur Job name = new Strinboolea n flag =指示作業(yè)是否刪除成功自3Block q=flist.head. next;Scanner sea nner=new Sea nn er(System.i n);System.out.pri nt("請(qǐng)輸入需要回收的作業(yè)名稱:”);curj ob_n ame

11、= sea nner.n extL in e(); while(q != n ull) if(q.job_ name = curjob_ name) q.state = false;q.job_ name =,H; memRecovery(q); / 回收內(nèi)存flag = true; break; elseq = q.n ext;if(flag)System.out.pri ntl n(" elseSystem.out.pri ntl n(")public void prin tJob In fo() /FreeBlock p = flist.head .n ext找到要?jiǎng)h

12、除的作業(yè)的下一個(gè)結(jié)點(diǎn)刪除作業(yè)成功?。﹦h除作業(yè)未成功!");打印作業(yè)信息int pro.num = 1; 用戶程序號(hào)int mem num = 1;內(nèi)存分區(qū)塊號(hào)System.out.printing用戶程序信息while(p != null) if(p.state)System.out.pri ntln("用 戶 程 序"+pro_ num+H("+p.job_ name+,)H+Ht占用第"+mem num+分區(qū)塊”);pro nu m+; mem_ nu m+; p = p.n ext;1)public void prin tFreeSuba

13、real nfo() /打印空閑分區(qū)信息FreeBlock p = flist.head .n ext;int leav_size = 0;Il剩余內(nèi)存大小int mem_num = 1; II內(nèi)存分區(qū)塊號(hào)System.out.println(H空閑分區(qū)信息");System.out.println("t 分區(qū)塊號(hào) t 大小”); while(p != n ull) if(!p.state)System.out.pri ntl n(HtH+mem _nu m+HtH+p.size); leav size += p.size;) mem_ nu m+; p = p.n ext

14、;System.out.pri ntl n("剩余內(nèi)存總打小為"+leav s泛e);)其它類的實(shí)現(xiàn) 空閑分區(qū)塊類:package com.kaip in g.memoryma nage;public class FreeBlock int size; IIboolean state;空閑塊大小String job_name;裝入的作業(yè)名稱FreeBlock next;下一空閑塊的自引用Hfalse表示空閑,true表示已經(jīng)裝入作業(yè)public FreeBlock(i nt s)size = s;state = false;job_ name = new Strin g(,

15、m);n ext = n ull;)空閑分區(qū)鏈類:package com.kaip in g.memoryma nage;import java.util.Sea nner;public class FreeList FreeBlock fblock;FreeBlock head;int fblockNum; 空閑塊數(shù)int sumMemCount;/ 內(nèi)存總大小int flistsize;空閑分區(qū)總和public FreeList()fblock = nu II;head = new FreeBlock(O);)public boolea n isEmpty()return (fblock

16、= n ull);)public void in sertFBIock(i nt size)FreeBlock n ewBlock = new FreeBlock(size); if(fblock = n ull)fblock = n ewBlock;head .next =fblock;)elsefblock .n ext = n ewBlock;|fblock = fblock .n ext;1)public void deleteFBIock(FreeBlock dblock) FreeBlock temp = head;while(temp != n ull)if(temp .next

17、 = dblock)temp .n ext = dblock .n ext; break;) temp = temp .n ext;1)public void In 讓FBIock()int leavesCount;為化人分區(qū)內(nèi)存總大小int bsize=0;分區(qū)塊大小Scanner sea nner=new Sea nn er(System.i n);System.out.pri nt("初始多大空間,請(qǐng)輸入一整數(shù):”);sumMemCo unt = sea nner.n ext In t();leavesCo unt = sumMemCo unt;flistsize = sumM

18、emCount;初始空閑分區(qū)大小為內(nèi)存大小System.out.pri nt(" 需將內(nèi)存分為多少分區(qū)塊,請(qǐng)輸入一整數(shù): fblockNum = sea nner.n ext In t();System.out.printlnC,初始化內(nèi)存分區(qū)");for(i nt i=1; i <= fblockNum; i+)if(i = fblockNum)in sertFBIock(leavesCo un t);elseSystem.out.print("請(qǐng)輸入第”+i+”塊分區(qū)大?。骸?;bsize = sea nner.n ext In t();1f(bsize

19、 >= leavesCo unt - i)System.out.pri nt("您輸入的數(shù)據(jù)無法保證每分區(qū)塊最少有1單位內(nèi)存,請(qǐng)重新輸入:”);|bsize = sea nner.n ext In t();)in sertFBIock(bsize);leavesCo unt -= bsize;System.out.printing余下內(nèi)存大小為“+leavesCount+”,請(qǐng)繼續(xù)分配!)System.out.pri ntlnf分配完畢!");System.out.printlnC創(chuàng)建空閑分區(qū)表如下");System.out.println("t

20、分區(qū)號(hào) t 大小”);FreeBlock temp = head .n ext;for(i nt i=1; i v= fblockNum; i+)System.out.pri ntl n("t,+i+,t,+temp.size);temp = temp .n ext;I)測(cè)試類(主類):package com.kaip in g.memoryma nage;import java.util.Sea nner;public class TestForMemMa nage public static void main(String口 args) MemoryMa nager mem_m

21、a nage = new MemoryMa nager();int choice=0;Scanner sea nner=new Sea nn er(System.i n);doSystem.out.println("0.退出程序");System.out.println(M1.添加新作業(yè)”);System.out.println(H2.銷毀一條作業(yè)”);System.out.println("3.顯示作業(yè)信息");System.out.pri ntln ("4.顯示空閑分區(qū)信息)System.out.pri nt("請(qǐng)輸入您的選擇:&

22、quot;);choice = sea nner.n extl nt(); switch(choice)case 0:break;case 1:mem_ma nage.addJob();break;case 2:mem_ma nage.delJob();break;case 3:mem_ma nage.pri ntJobl nfo();break;case 4:mem_ma nage.pri ntFreeSubarea In fo();break;default:System.out.pri ntl n("請(qǐng)輸入正確的選擇!");while(choice != 0);Sys

23、tem.out.pri ntl n();System.out.pri ntl n("使用愉快!期待您下次使用!");五、實(shí)驗(yàn)測(cè)試結(jié)果及心得體會(huì)1、測(cè)試結(jié)果本人主要測(cè)試內(nèi)存的分配與回收以及無足夠大的空閑分區(qū)塊時(shí)進(jìn)行的重定向操作等功能。初始化內(nèi)存分區(qū):麗姑壟人空r叭請(qǐng)輸入一整數(shù)g二*需海內(nèi)存分懸蟲少分氐塊,簞?shì)斎胝麛ⅲ撼跏蓟瘍?nèi)存分區(qū)惜輸入摞,以芳匡文小】.余下內(nèi)再大小為口維續(xù)分配z請(qǐng)輸人第:塊分區(qū)大?。?余下闖存大小丈請(qǐng)維皺芳配匚諂輸入 第么塊伯區(qū)大?。河嘞聝?nèi)存大小為7諸址紋分配!請(qǐng)輸入第目決吩區(qū)大?。河嘞聝?nèi)存犬 小均2、請(qǐng)繼竦分配¥話輸入捕5坎分區(qū)大小:余T內(nèi)希大小冊(cè)工 i育繼淇芳配,請(qǐng)輸入第6塊文寸區(qū)大?。?:余下網(wǎng)方大小為二。請(qǐng)維絞 分配I請(qǐng)輸入笫*塊分區(qū)大?。河嘞翲勺存大小均號(hào)3,請(qǐng)繼族分配?請(qǐng)輸入弟2塊為區(qū)大?。浩?下兩存犬小肉請(qǐng)維輾吩配!諸輸入第9塊芳區(qū)大?。河嘞聝?nèi)存大小為ain請(qǐng)維絞分配弓另 配宅里,心電F弄單!分區(qū)號(hào)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論