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

下載本文檔

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

文檔簡介

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

2、序?qū)崿F(xiàn)內(nèi)存的合理分配后回收。三、主要設備及軟件PC、Windows2000操作系統(tǒng)、Linux操作系統(tǒng)四、實驗流程、操作步驟或核心代碼、算法片段請求分配u.size分區(qū)檢索空閑分區(qū)鏈(表)找到大于u.size的可用分區(qū)否?按動態(tài)分區(qū)方式進行分配修改有關數(shù)據(jù)結(jié)構(gòu)返回分區(qū)號及首地址空閑分區(qū)總和>=u.size進行緊籌形成連續(xù)空閑區(qū)修改有關數(shù)據(jù)結(jié)構(gòu)無法分配返回1、分配算法流程出2、算法模擬實現(xiàn) 相關數(shù)據(jù)結(jié)構(gòu)定義 空閑分區(qū)塊類:class FreeBlock 空閑分區(qū)鏈類:class FreeList 內(nèi)存分配回收算法類:class MemoryManager 測試類(主類):class Tes

3、tForMemManage 具體實現(xiàn) 請允許我先列出核心部分,內(nèi)存分配回收算法類的實現(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)/內(nèi)存分配(首次適應算法)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);/重新分配內(nèi)存elseSystem.out.println("作業(yè)"+new_job_name+"內(nèi)存尚未分配成功!");else/分配內(nèi)存后可能存在大小為0的空間,將其清除System.out.println(&

6、quot;作業(yè)"+new_job_name+"內(nèi)存分配成功!");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) /內(nèi)存回收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è)分配內(nèi)存.");public void addJob() /添加作業(yè)int newSize;/新作業(yè)所需內(nèi)存大小String nJobName = new String("");Scanner scanner=new Scanner(System.in);System.

10、out.print("請輸入新任務的名稱:");nJobName = scanner.nextLine();System.out.print("請輸入新任務所需內(nèi)存大?。?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);/回收內(nèi)存flag = true;break;elseq = q.next;/找到要刪除的作業(yè)的下一個結(jié)點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;/內(nèi)存分區(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;/剩余內(nèi)存大小int mem_num = 1;/內(nèi)存分區(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("剩余內(nèi)存總打小為"+leav_size);其它類的實現(xiàn)空閑分區(qū)塊類:package com.kaiping.memorymanage;public class FreeBlock int size; /空閑塊大小 boolean state; /false表示空閑,true表示已經(jīng)

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;/空閑塊數(shù)int su

16、mMemCount;/內(nèi)存總大小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ū)內(nèi)存總大小int bsize=0;/分區(qū)塊大小Scanner scanner=new Scanner(System.in);System.out.print("初

18、始多大空間,請輸入一整數(shù):");sumMemCount = scanner.nextInt();leavesCount = sumMemCount;flistsize = sumMemCount;/初始空閑分區(qū)大小為內(nèi)存大小System.out.print("需將內(nèi)存分為多少分區(qū)塊,請輸入一整數(shù):");fblockNum = scanner.nextInt();System.out.println("-初始化內(nèi)存分區(qū)-");for(int i=1; i <= fblockNum; i+)if(i = fblockNum)insertFBl

19、ock(leavesCount);elseSystem.out.print("請輸入第"+i+"塊分區(qū)大?。?quot;);bsize = scanner.nextInt();if(bsize >= leavesCount - i)System.out.print("您輸入的數(shù)據(jù)無法保證每分區(qū)塊最少有1單位內(nèi)存,請重新輸入:");bsize = scanner.nextInt();insertFBlock(bsize);leavesCount -= bsize;System.out.println("余下內(nèi)存大小為"+

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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論