版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 委托托管協(xié)議書
- 2025版新能源產(chǎn)品銷售合同標(biāo)準(zhǔn)模板
- 2025年度熱鍍鋅鋼管銷售合同范本2篇
- 二零二五年度企業(yè)財(cái)務(wù)報(bào)表編制與分析合同范本3篇
- 2025年度體育場(chǎng)館教練個(gè)人聘用合同示例4篇
- 2025年度二手房全款買賣合同房產(chǎn)交易風(fēng)險(xiǎn)提示協(xié)議
- 2025年度城市綜合體商業(yè)空間租賃及品牌入駐協(xié)議
- 跨領(lǐng)域的安全逃生技巧探索
- 綠色能源在農(nóng)業(yè)機(jī)械中的運(yùn)用前景
- 智能家居時(shí)代下的家用醫(yī)療設(shè)備選擇
- 煤礦反三違培訓(xùn)課件
- 向流程設(shè)計(jì)要效率
- 安全文明施工的管理要點(diǎn)
- 2024年中國(guó)航空發(fā)動(dòng)機(jī)集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 當(dāng)代中外公司治理典型案例剖析(中科院研究生課件)
- GMP-基礎(chǔ)知識(shí)培訓(xùn)
- 動(dòng)力管道設(shè)計(jì)手冊(cè)-第2版
- 2022年重慶市中考物理試卷A卷(附答案)
- Python繪圖庫(kù)Turtle詳解(含豐富示例)
- 煤礦機(jī)電設(shè)備檢修技術(shù)規(guī)范完整版
- 榆林200MWp并網(wǎng)光伏發(fā)電項(xiàng)目可行性研究報(bào)告
評(píng)論
0/150
提交評(píng)論