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

下載本文檔

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

文檔簡介

1、實(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)成績教師評價(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ù)給定的動態(tài)分區(qū)分配算法流程圖,用你熟悉的計(jì)算機(jī)編程語言編寫一程序,

2、該程序?qū)崿F(xiàn)內(nèi)存的合理分配后回收。三、主要設(shè)備及軟件PC、Windows2000 操作系統(tǒng)、Linux操作系統(tǒng)四、實(shí)驗(yàn)流程、操作步驟或核心代碼、算法片段1、分配算法流程出無法分配返空閑分區(qū)總禾口 >=u.siz找到大于u.size的可用分區(qū)否?2、算法模擬實(shí)現(xiàn)相關(guān)數(shù)據(jù)結(jié)構(gòu)定義空閑分區(qū)塊類:class FreeBlock空閑分區(qū)鏈類:class FreeList內(nèi)存分配回收算法類 :class MemoryManager測試類(主類):class TestForMemManage具體實(shí)現(xiàn)請?jiān)试S我先列出核心部分,內(nèi)存分配回收算法類的實(shí)現(xiàn)package com.kaip in g.memorym

3、a nage;/個(gè)人包import java.util.Sca nner;public class MemoryMa nager FreeList flist;/空閑分區(qū)類對象public MemoryMa nager()flist = new FreeList();flist.l nitFBIock();public void memAllocati on (i nt size, String n ew_job_ name)內(nèi)存分酉己 (首次適應(yīng)算法)FreeBlock q=flist.head;FreeBlock p=flist.head. next;while(p != n ull)if

4、(size <= 0)System.out.println("n申請的空間不能小于1!");break;if(p.state = false && p.size >= size)q = new FreeBlock(p.size - size);p.size = size;p.state = true;p.job_ name = new_job_n ame;q.n ext = p.n ext;p.n ext = q;break; /完成分配elsep = p.next;/移動到足夠分配的空閑塊if(p = n ull)if(flist.flists

5、ize >= size)(”目前尚無足夠大的空閑塊,系統(tǒng)將進(jìn)行重 定位操作.");relocation();/ 重定向memAllocation(size,new_job_name);/ 重新分配內(nèi)存else(”作業(yè)"+new_job_name+"內(nèi)存尚未分配成功! ”);else/分配內(nèi)存后可能存在大小為0的空間,將其清除(” 作業(yè)"+new_job_name+"內(nèi)存分配成功!"); p = flist.head .n ext;q = flist.head;while(p != n ull)if(p.size = 0)flis

6、t.deleteFBIock(p);p = p.n ext;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

7、.next = p.n ext .n ext;break;if(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.next;/當(dāng)前重定向空閑塊FreeBlock beh in d_r=r.

8、next;while(r != null) /將r定位到第一塊空閑分區(qū)塊if(r.state = false)break;r = r.n ext;behi nd_r = r.n ext;front=front_r.n ext; /記錄第一塊空閑分區(qū)的上一塊while(beh ind_r != nu ll)if(beh in d_r.state)front_r.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.

9、n ext = beh in d_r. next;behi nd_r = r.n ext;(”重定向成功,繼續(xù)為作業(yè)分配內(nèi)存.");public void addJob()/ 添加作業(yè)int newSize; /新作業(yè)所需內(nèi)存大小String nJobName = new String("");Scanner sca nner=new Sca nn er(System.i n);System.out.print("請輸入新任務(wù)的名稱:”);nJ obName = sca nner.n extL in e();System.out.print("

10、請輸入新任務(wù)所需內(nèi)存大?。骸?;n ewSize = sca nner.n ext In t();memAllocati on(n ewSize ,nJ obName);public void delJob()/ 銷毀作業(yè)String cur_job_ name = new Strin g("");boolean flag = false; /指示作業(yè)是否刪除成功FreeBlock q=flist.head. next;Scanner sca nner=new Sca nn er(System.i n);System.out.pri nt(" 請輸入需要回收的作業(yè)

11、名稱:”);cur_j ob_n ame = sca nner.n extL in e();while(q != n ull)if(q.job_ name = cur_job_ name)q.state = false;q.job_ name =""memRecovery(q); / 回收內(nèi)存flag = true;break;elseq = q.next;/找到要刪除的作業(yè)的下一個(gè)結(jié)點(diǎn)if(flag)(” 刪除作業(yè)成功!");else(” 刪除作業(yè)未成功!");public void prin tJobI nfo() /打印作業(yè)信息FreeBlock

12、p = flist.head .n ext;in t pro_ num = 1; / 用戶程序號int mem_num = 1;/內(nèi)存分區(qū)塊號 while(p != n ull)System.out.pri ntl n("用戶程序信息 ");if(p.state)System.out.pri ntln(”用戶程序"+pro_ num+"("+p.job_ name+")"+"t 占用第"+mem_num+" 分區(qū)塊");pro_ nu m+;mem_ nu m+;p = p.n ext

13、;public void prin tFreeSubareal nfo() /打印空閑分區(qū)信息FreeBlock p = flist.head .n ext;int leav_size = 0; /剩余內(nèi)存大小int mem_num = 1;/內(nèi)存分區(qū)塊號System.out.println("-空閑分區(qū)信息 ");System.out.pri ntl n("t分區(qū)塊號t大小");while(p != n ull)if(!p.state)System.out.pri ntl n("t"+mem _nu m+"t"+

14、p.size);leav_size +=p.size;mem_ nu m+;p = p.n ext;System.out.pri ntln(” 剩余內(nèi)存總打小為"+leav_size);其它類的實(shí)現(xiàn)空閑分區(qū)塊類:package com.kaip in g.memoryma nage;public class FreeBlock int size;/空閑塊大小boolea n state;/false表示空閑,true表示已經(jīng)裝入作業(yè)Stri ng job_ name;/裝入的作業(yè)名稱FreeBlock n ext;/下一空閑塊的自引用public FreeBlock(i nt s)s

15、ize = s;state = false;job_ name = new Strin g("");n ext = n ull;空閑分區(qū)鏈類:package com.kaip in g.memoryma nage;import java.util.Sca nner;public class FreeList FreeBlock fblock;FreeBlock head;int fblockNum; / 空閑塊數(shù)int sumMemCount; / 內(nèi)存總大小int flistsize; /空閑分區(qū)總和public FreeList()fblock = nu II;head

16、 = new FreeBlock(O);public boolea n isEmpty()return (fblock = 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;public void deleteFBIock(FreeBlock dblock)

17、FreeBlock temp = head;while(temp != n ull)if(temp .next = dblock)temp .n ext = dblock .n ext;break;temp = temp .n ext;public void In itFBlock()int leavesCount; /為化入分區(qū)內(nèi)存總大小int bsize=0; /分區(qū)塊大小Scanner sca nner=new Sca nn er(System.i n);System.out.print("初始多大空間,請輸入一整數(shù):”); sumMemCo unt = sca nner.n

18、ext In t();leavesCo unt = sumMemCo unt;flistsize = sumMemCount;/初始空閑分區(qū)大小為內(nèi)存大小System.out.print("需將內(nèi)存分為多少分區(qū)塊,請輸入一整數(shù):”);fblockNum = sea nner.n ext In t();(” 初始化內(nèi)存分區(qū)");for(i nt i=1; i <= fblockNum; i+)if(i = fblockNum)in sertFBIock(leavesCo un t);else(” 請輸入第"+i+"塊分區(qū)大小:”);bsize = s

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

20、quot;);FreeBlock temp = head .n ext;for(i nt i=1; i <= fblockNum; i+)System.out.pri ntl n("t"+i+"t"+temp.size);temp = temp .n ext;測試類(主類):package com.kaip in g.memoryma nage;import java.util.Sca nner;public class TestForMemMa nage public static void main(String args) MemoryMa

21、nager mem_ma nage = new MemoryMa nager();int choice=0;Scanner sca nner=new Sca nn er(System.i n);doSystem.out.pri ntln("O.退出程序");System.out.pri ntln("1.添加新作業(yè)");System.out.pri ntln("2.銷毀一條作業(yè)");System.out.pri ntln("3.顯示作業(yè)信息”);System.out.pri ntln("4.顯示空閑分區(qū)信息“Syst

22、em.out.print("請輸入您的選擇:”);choice = sca nner.n extI 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 ntJobI nfo(); break;case 4:mem_ma nage.pri ntFreeSubarea In fo(); break;default:(” 請輸入正確的選擇!");while(choice != 0);

23、System.out.pri ntl n();(” 使用愉快!期待您下次使用!");五、實(shí)驗(yàn)測試結(jié)果及心得體會1、測試結(jié)果本人主要測試內(nèi)存的分配與回收以及無足夠大的空閑分區(qū)塊時(shí)進(jìn)行的重定向 操作等功能。初始化內(nèi)存分區(qū):初姑案大空f環(huán)情輪入一業(yè)藪 g 需海內(nèi)存分閔事少分叵塊,雷輸入整釵: 初始化內(nèi)存分區(qū) 惜輸入摞丄以芳匡文小】.-余下內(nèi)存大小為"5 11維續(xù)分配 請輸人第:坎分國大?。?2 -舍下闖存大小九* 請維皺芳配匚 諂輸入第d塊伯區(qū)大?。?余下內(nèi)存大小為二諸址絞分配! i青輸入第目決吩區(qū)天?。河嘞聝?nèi)存大小天fN 請錐蛭分配2 諸輸入捕5塊夯區(qū)九?。航鹣聝?nèi)右大小辿“i育維續(xù)分配? 請輸入第6塊対區(qū)大小:-: 余下網(wǎng)冇大小為請繼絞分配I 請輸入笫v塊分區(qū)大?。河嘞聲A存大小為93,請繼篠分配? 請輸入第2塊分區(qū)大?。河嘞聝纱娲笮」釷請堆無吩配? 請輸入篥9塊芳區(qū)大?。河嘞聝?nèi)存夫小為36 請維絞分配弓 耳配完卑!4 E?方単!創(chuàng)建空國歸區(qū)

溫馨提示

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

評論

0/150

提交評論