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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、yMa nager FreeList flist; /空閑分區(qū)類對象public MemoryMa nager()flist = new FreeList();flist.l nitFBIock();public void memAllocati on (i nt size, Stri ng n ewjob _n ame)/內存分酉己(首次適應算法)FreeBlock q=flist.head;FreeBlock p=flist.head. next;while != n ull)if(size v= 0)System.out.println(Hn申請的空間不能小于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; 移動到足夠分配的空閑塊)if(p = n ull)if(flist.flistsize >= size) System.out.pri ntl n("目前尚無足夠大的空閑塊,系統(tǒng)將進行重定位操

5、作relocation();/ 重定向memAllocation(size,newob_name);/重新分配內存 else System.out.println(作業(yè)"+new job name+”內存尚未分配成功!】 ) else分配內存后可能存在大小為0的空間,將其清除System.out.printlnC 作業(yè)"+new_job_name+”內存分配成功! 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) /內存回收FreeBlock p = flist.head .n ext;while(p != null)回收區(qū)與插入點的前一個空閑分區(qū)相鄰接if(p.next = target && p.state = false)p.size += target.size;p.n ext = target. next;回收區(qū)同時與插入點的前后兩個空閑分區(qū)相鄰接if(!p. next.state)p.size += p.n ext.size;p.next = p.n ext .n ext;)break;if

7、(p = target)回收區(qū)與插入點的后一空閑分區(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;空閑資源重定向,回收空閑空間/當前重定向空閑塊將r定位到第一塊空閑分

8、區(qū)塊 if(r.state = false)break;r = r.n ext;behi nd_r = r.n ext;.學習幫手.專業(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è)分配內存.”);)public void addJob() /添加作業(yè)intnewSize;新作業(yè)所需內存大小String nJobName = new String("");Scanner sea nner=new Sea nn er(System.i n);System.out.pri nt("請輸入新任務的名稱:");nJ obName = sea nner.n extL in e();System.out.pri nt(&qu

10、ot;請輸入新任務所需內存大?。?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("請輸入需要回收的作業(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); / 回收內存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找到要刪

12、除的作業(yè)的下一個結點刪除作業(yè)成功?。﹦h除作業(yè)未成功!");打印作業(yè)信息int pro.num = 1; 用戶程序號int mem num = 1;內存分區(qū)塊號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剩余內存大小int mem_num = 1; II內存分區(qū)塊號System.out.println(H空閑分區(qū)信息");System.out.println("t 分區(qū)塊號 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("剩余內存總打小為"+leav s泛e);)其它類的實現(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表示已經裝入作業(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;/ 內存總大小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ū)內存總大小int bsize=0;分區(qū)塊大小Scanner sea nner=new Sea nn er(System.i n);System.out.pri nt("初始多大空間,請輸入一整數(shù):”);sumMemCo unt = sea nner.n ext In t();leavesCo unt = sumMemCo unt;flistsize = sumM

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

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

20、分區(qū)號 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)測試類(主類):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("請輸入您的選擇:&

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("請輸入正確的選擇!");while(choice != 0);Sys

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

溫馨提示

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

評論

0/150

提交評論