




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實驗名稱內存分配與回收算法實現(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)所需的各種數據結構。二、實驗內容根據給定的動態(tài)分區(qū)分配算法流程圖,用你熟悉的計算機編程語言編寫一程序,該程
2、序實現(xiàn)內存的合理分配后回收。三、主要設備及軟件PC、Windows2000操作系統(tǒng)、Linux操作系統(tǒng)四、實驗流程、操作步驟或核心代碼、算法片段請求分配u.size分區(qū)檢索空閑分區(qū)鏈(表)找到大于u.size的可用分區(qū)否?按動態(tài)分區(qū)方式進行分配修改有關數據結構返回分區(qū)號及首地址空閑分區(qū)總和>=u.size進行緊籌形成連續(xù)空閑區(qū)修改有關數據結構無法分配返回1、分配算法流程出2、算法模擬實現(xiàn) 相關數據結構定義 空閑分區(qū)塊類:class FreeBlock 空閑分區(qū)鏈類:class FreeList 內存分配回收算法類:class MemoryManager 測試類(主類):class Tes
3、tForMemManage 具體實現(xiàn) 請允許我先列出核心部分,內存分配回收算法類的實現(xiàn):package com.kaiping.memorymanage;/個人包import java.util.Scanner;public class MemoryManager FreeList flist; /空閑分區(qū)類對象public MemoryManager()flist = new FreeList();flist.InitFBlock();public void memAllocation(int size, String new_job_name)/內存分配(首次適應算法)FreeBlock
4、q=flist.head;FreeBlock p=flist.head.next;while(p != null)if(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_name;q.next = p.next;p.next = q;break;/完成分配el
5、sep = p.next;/移動到足夠分配的空閑塊if(p = null)if(flist.flistsize >= size)System.out.println("目前尚無足夠大的空閑塊,系統(tǒng)將進行重定位操作.");relocation();/重定向memAllocation(size,new_job_name);/重新分配內存elseSystem.out.println("作業(yè)"+new_job_name+"內存尚未分配成功!");else/分配內存后可能存在大小為0的空間,將其清除System.out.println(&
6、quot;作業(yè)"+new_job_name+"內存分配成功!");p = flist.head.next;/q = flist.head;while(p != null)if(p.size = 0)flist.deleteFBlock(p);p = p.next;private void memRecovery(FreeBlock target) /內存回收FreeBlock p = flist.head.next;while(p != null)/回收區(qū)與插入點的前一個空閑分區(qū)相鄰接if(p.next = target && p.state =
7、false)p.size += target.size;p.next = target.next;/回收區(qū)同時與插入點的前后兩個空閑分區(qū)相鄰接if(!p.next.state)p.size += p.next.size;p.next = p.next.next;break;if(p = target)/回收區(qū)與插入點的后一空閑分區(qū)相鄰接if(!p.next.state)target.size += p.next.size;target.next = p.next.next;break;/若兩不鄰接,則直接跳出p = p.next;private void relocation() /空閑資源重
8、定向,回收空閑空間FreeBlock front_r=flist.head;/FreeBlock r=front_r.next;/當前重定向空閑塊FreeBlock behind_r=r.next;while(r != null)/將r定位到第一塊空閑分區(qū)塊if(r.state = false)break;r = r.next;behind_r = r.next;front_r = front_r.next;/記錄第一塊空閑分區(qū)的上一塊while(behind_r != null)if(behind_r.state)front_r.next = behind_r;r.next = behind
9、_r.next;behind_r.next = r;front_r = behind_r;elser.size += behind_r.size;r.next = behind_r.next;behind_r = r.next;System.out.println("重定向成功,繼續(xù)為作業(yè)分配內存.");public void addJob() /添加作業(yè)int newSize;/新作業(yè)所需內存大小String nJobName = new String("");Scanner scanner=new Scanner(System.in);System.
10、out.print("請輸入新任務的名稱:");nJobName = scanner.nextLine();System.out.print("請輸入新任務所需內存大?。?quot;);newSize = scanner.nextInt();memAllocation(newSize,nJobName);public void delJob() /銷毀作業(yè)String cur_job_name = new String("");boolean flag = false;/指示作業(yè)是否刪除成功FreeBlock q=flist.head.next
11、;Scanner scanner=new Scanner(System.in);System.out.print("請輸入需要回收的作業(yè)名稱:");cur_job_name = scanner.nextLine();while(q != null)if(q.job_name = cur_job_name)q.state = false;q.job_name = ""memRecovery(q);/回收內存flag = true;break;elseq = q.next;/找到要刪除的作業(yè)的下一個結點if(flag)System.out.println(&
12、quot;刪除作業(yè)成功!");elseSystem.out.println("刪除作業(yè)未成功!");public void printJobInfo()/打印作業(yè)信息FreeBlock p = flist.head.next;int pro_num = 1;/用戶程序號int mem_num = 1;/內存分區(qū)塊號System.out.println("-用戶程序信息-");while(p != null)if(p.state)System.out.println("用戶程序"+pro_num+"("+p
13、.job_name+")"+"t占用第"+mem_num+"分區(qū)塊");pro_num+;mem_num+;p = p.next;public void printFreeSubareaInfo()/打印空閑分區(qū)信息FreeBlock p = flist.head.next;int leav_size = 0;/剩余內存大小int mem_num = 1;/內存分區(qū)塊號System.out.println("-空閑分區(qū)信息-");System.out.println("t分區(qū)塊號t大小");wh
14、ile(p != null)if(!p.state)System.out.println("t"+mem_num+"t"+p.size);leav_size += p.size;mem_num+;p = p.next;System.out.println("剩余內存總打小為"+leav_size);其它類的實現(xiàn)空閑分區(qū)塊類:package com.kaiping.memorymanage;public class FreeBlock int size; /空閑塊大小 boolean state; /false表示空閑,true表示已經
15、裝入作業(yè) String job_name; /裝入的作業(yè)名稱 FreeBlock next;/下一空閑塊的自引用 public FreeBlock(int s) size = s; state = false; job_name = new String(""); next = null; 空閑分區(qū)鏈類:package com.kaiping.memorymanage;import java.util.Scanner;public class FreeList FreeBlock fblock;FreeBlock head;int fblockNum;/空閑塊數int su
16、mMemCount;/內存總大小int flistsize;/空閑分區(qū)總和public FreeList()fblock = null;head = new FreeBlock(0);public boolean isEmpty()return (fblock = null);public void insertFBlock(int size)FreeBlock newBlock = new FreeBlock(size);if(fblock = null)fblock = newBlock;head.next = fblock;elsefblock.next = newBlock;fbloc
17、k = fblock.next;public void deleteFBlock(FreeBlock dblock)FreeBlock temp = head;while(temp != null)if(temp.next = dblock)temp.next = dblock.next;break;temp = temp.next;public void InitFBlock()int leavesCount;/為化入分區(qū)內存總大小int bsize=0;/分區(qū)塊大小Scanner scanner=new Scanner(System.in);System.out.print("初
18、始多大空間,請輸入一整數:");sumMemCount = scanner.nextInt();leavesCount = sumMemCount;flistsize = sumMemCount;/初始空閑分區(qū)大小為內存大小System.out.print("需將內存分為多少分區(qū)塊,請輸入一整數:");fblockNum = scanner.nextInt();System.out.println("-初始化內存分區(qū)-");for(int i=1; i <= fblockNum; i+)if(i = fblockNum)insertFBl
19、ock(leavesCount);elseSystem.out.print("請輸入第"+i+"塊分區(qū)大小:");bsize = scanner.nextInt();if(bsize >= leavesCount - i)System.out.print("您輸入的數據無法保證每分區(qū)塊最少有1單位內存,請重新輸入:");bsize = scanner.nextInt();insertFBlock(bsize);leavesCount -= bsize;System.out.println("余下內存大小為"+
20、leavesCount+",請繼續(xù)分配!");System.out.println("分配完畢!");System.out.println("-創(chuàng)建空閑分區(qū)表如下-");System.out.println("t分區(qū)號t大小");FreeBlock temp = head.next;for(int i=1; i <= fblockNum; i+)System.out.println("t"+i+"t"+temp.size);temp = temp.next;測試類(主類
21、):package com.kaiping.memorymanage;import java.util.Scanner;public class TestForMemManage public static void main(String args) MemoryManager mem_manage = new MemoryManager();int choice=0;Scanner scanner=new Scanner(System.in);doSystem.out.println("0.退出程序");System.out.println("1.添加新作業(yè)");System.out.println("2.銷毀一條作業(yè)"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 13《我能行》第二課時(教案)-部編版道德與法治二年級下冊下冊
- 基因組轉錄組聯(lián)合多組學數據整合分析-洞察闡釋
- 綜合醫(yī)院急診科預檢分診流程
- 老年護理轉院制度及流程探討
- 某年度太陽能用石英玻璃材料戰(zhàn)略市場規(guī)劃報告
- 電商平臺品牌授權合作合同
- 住宅物業(yè)管理的關鍵崗位職責
- 正規(guī)企業(yè)工作背景證明(8篇)
- 高考生物二輪復習(全國版) 第1篇 專題突破 專題8 專題強化練
- 重陽節(jié)作文簡單范文(12篇)
- 施工鋼結構制作安裝環(huán)境因素識別表
- 污水井巡查記錄表
- 2關于更換現(xiàn)場項目經理的函
- 部編版小學道德與法治四年級下冊期末復習簡答及分析題專練(含答案)
- 電子商務那些事學習通超星課后章節(jié)答案期末考試題庫2023年
- 環(huán)境及理化因素損傷-凍傷
- Unit7SeasonPartALetslearn(教學設計)閩教版英語四年級下冊
- 世界文化遺產武當山古建筑群的資料
- 醫(yī)院醫(yī)療設備采購項目HIS系統(tǒng)及硬件采購投標文件
- 【橡膠工藝】-橡膠產品生產工藝規(guī)程
- 推銷實戰(zhàn)技巧與客戶優(yōu)秀服務技巧
評論
0/150
提交評論