動態(tài)分區(qū)主存的分配和回收_第1頁
動態(tài)分區(qū)主存的分配和回收_第2頁
動態(tài)分區(qū)主存的分配和回收_第3頁
動態(tài)分區(qū)主存的分配和回收_第4頁
動態(tài)分區(qū)主存的分配和回收_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、動態(tài)分區(qū)主存的分配和回收實驗報告一、 小組成員張煒(33)、王飛(37)、馮平(25)、趙建偉(26) 二、實驗名稱動態(tài)分區(qū)主存的分配和回收三、實驗內(nèi)容和目的動態(tài)分區(qū)方式主存的分配和回收。 通過本實驗幫助學生理解在動態(tài)分區(qū)管理方式下應怎樣實現(xiàn)主存空間的分配和回收。四、動態(tài)分區(qū)主存的分配和回收設計思想(1)可變分區(qū)方式是按作業(yè)需要的主存空間大小來分割分區(qū)的。當要裝入一個作業(yè)時,根據(jù)作業(yè)需要的主存量查看是否有足夠的空閑空間,若有,則按需要量分割一個分區(qū)分配給該作業(yè);若無則作業(yè)不能裝入。隨著作業(yè)的裝入、撤離、主存空間被分成許多個分區(qū),有的分區(qū)被作業(yè)占用,有的分區(qū)空閑。0 5k 10k14k26k32

2、k128k操作系統(tǒng)作業(yè)1作業(yè)3空閑區(qū)作業(yè)2空閑區(qū)為了說明哪些區(qū)是空閑的,可以用來裝入新作業(yè),必須要有一張空區(qū)說明表,格式如下:起址長度狀態(tài)14k12k未分配32k96k未分配空表目空表目其中,起址:指出一個空閑區(qū)的主存起始地址長度:指出從起始地址開始的一個連續(xù)空閑區(qū)的長度狀態(tài):有兩種狀態(tài),一種是“未分配”狀態(tài),指出對應的由起址指出的某個 長度的區(qū)域是空閑區(qū);另一種是“空表目”狀態(tài),表示表中對應的登記項目是空白(無效),可用來登記新的空閑區(qū)(例如,作業(yè)撤離后,它所占用的區(qū)域就成了空閑區(qū),應找一個“空表目”欄登記歸還區(qū)的起址和長度且修改狀態(tài))。由于分區(qū)的個數(shù)不定,所以空閑區(qū)說明表中應有適量的狀態(tài)為

3、“空表目”的登記欄目,否則造成表格“溢出”無法登記。(2)當有一個新作業(yè)要求裝入主存時,必須查找空閑說明表,從中找出一個足夠大的空閑區(qū)。有時找到的空閑區(qū)可能大于作業(yè)需要量,這時應把原來的空閑區(qū)分成兩部分:一部分分給作業(yè)占用;另一部分又成為一個較小的空閑區(qū)。為了盡量減少由于分割造成的“碎片”,在作業(yè)請求裝入時,盡可能利用主存的低地址部分的空閑區(qū),而盡量保存高地址部分有較大的連續(xù)空閑區(qū)域,以利于大型作業(yè)的裝入。為此,在空閑區(qū)說明表中,把每個空閑區(qū)按其地址順序登記,即每個后繼的空閑區(qū)其起始地址總是比前者大。為了方便查找還可使表格“緊縮”,總是讓“空表目”欄集中在表格的后部。(3)主存分配。由于本實驗

4、是模擬主存的分配,所以當把主存區(qū)分配給作業(yè)后并不實際動裝入程序裝入作業(yè),而用輸出“分配情況”來代替。(4)主存回收。當一個作業(yè)執(zhí)行結束撤離時,作業(yè)所占的區(qū)域應該歸還,歸還的區(qū)域如與其他空閑區(qū)相鄰,則應合成一個較大的空閑區(qū),登記在空閑區(qū)說明表中。(5)請按首次適應算法和最佳適應算法設計主存分配和回收的程序,然后按(1)中的假設,設主存中已裝入3個作業(yè),且形成兩個空閑區(qū),確定空閑說明表的初值。現(xiàn)有一個需要主存量為6K的作業(yè)4申請裝入主存;然后作業(yè)3撤離;再作業(yè)2撤離。請你為它們進行主存分配和回收,把主存區(qū)說明表的初值和每次分配或回收后的變化顯示出來。顯示要求如下:按(1)中的格式打印內(nèi)存的初始狀態(tài)

5、,作業(yè)4申請為其分配后的內(nèi)存狀態(tài);再顯示作業(yè)3撤離后的內(nèi)存狀態(tài)、作業(yè)2撤離后的內(nèi)存狀態(tài)五、調(diào)試過程中遇到的問題及解決過程調(diào)試過程主要問題就是對文件的讀取操作出現(xiàn)了一點小問題及一些結構體變量的引用錯誤,對算法的整體構架不熟的前提下,導致了很多細節(jié)問題上考慮不夠周到、不夠全面使程序不夠完善!經(jīng)過細心研究捉摸,后來一一解決!六、實驗總結通過此次上機實踐模擬,我們對動態(tài)分區(qū)主存的分配和回收算法的提出到實現(xiàn)過程有了全新的認識,應該說受益非淺!相信在之后的實驗會更加認真對待!七、實驗程序代碼#include #include #include#include int k=4;struct list / 初

6、始化數(shù)據(jù)的結構體 int num; int adr; int end; int size;s=1,1000,2999,2000,2,500,799,300,3,3500,3699,200,4,4000,4499,500; / 初始化空閑分區(qū)/*void print(struct list *p,int n) / print函數(shù)作用輸出結果 int flag1=1; int flag2=1; int i,j=0; cout-n; for(i=0;isize=0) / 控制不輸出size=0的空閑塊 flag2=0; j+; continue; else flag2=1; if(p-size!=0

7、&flag2!=0) flag1=0; cout序號:setw(2)num-j/*輸出的序號仍然是從1開始*/* 起始位置:setw(5)adr 終止位置:setw(5)end 空閑塊大小:setw(5)sizeendl; if(flag1=1) / 當所有的空閑塊正好被分配完時 coutn空閑內(nèi)存已被分配完,請回收!n; cout-n;*/void print(struct list a,int n) / print函數(shù)作用輸出結果 int i; cout-n; if(a0.size=0) for(i=0;ik;i+) ai.adr=ai+1.adr; ai.size=ai+1.size;

8、ai.end=ai+1.end; k=k-1; if(k=0) coutn空閑塊已經(jīng)分配完畢,需要再分配,請回收!n; for(i=0;ik;i+) cout序號:setw(2)ai.num/*輸出的序號仍然是從1開始*/ 起始位置:setw(5)ai.adr 終止位置:setw(5)ai.end 空閑塊大小:setw(5)ai.sizeendl; cout-n;void link(struct list a) /*當一塊空閑內(nèi)存的尾地址和下一塊的首地址相連時,將它們合并成一塊*/ int i; for(i=0;ik;i+) if(ai.end=ai+1.adr-1) ai.size=ai.s

9、ize+ai+1.size; ai.end=ai+1.end; for(i=i+1;ik;i+) ai.adr=ai+1.adr; ai.size=ai+1.size; ai.end=ai+1.end; k=k-1; void order(struct list a,int n) / order函數(shù)將空閑內(nèi)存塊按空間塊起始地址大小排序 int i,j,adr,end,size; for(i=1;i=0&adraj.adr;j-) aj+1.size=aj.size; aj+1.adr=aj.adr; aj+1.end=aj.end; aj+1.adr=adr; aj+1.size=size;

10、aj+1.end=end; void sort(struct list a,int n) / sort函數(shù)將空閑塊按空間大小排序 int i,j,size,adr,end; for(i=1;i=0&sizeaj.size;j-) aj+1.size=aj.size; aj+1.adr=aj.adr; aj+1.end=aj.end; aj+1.size=size; aj+1.adr=adr; aj+1.end=end; void assign(struct list a,int size) int i,flag=0; for(i=0;ik;i+) if(size=ai.size) flag=1

11、; ai.adr=ai.adr+size-1; ai.size=ai.size-size; sort(s,k); print(s,k); break; if(flag=0) coutn沒有合適的內(nèi)存塊可用!endl; void accept(struct list a,int fadd,int size) / accept函數(shù)用于回收內(nèi)存空間 int i,j,flag; flag=0; / 當回收的內(nèi)存不與其他已存在的內(nèi)存空閑塊相連的時候,設置flag=1 for(i=0;ik;i+) for(j=ai.adr;j=fadd&j=fadd+size-1)/當要回收的內(nèi)存中有未用過的內(nèi)存時,提示

12、錯誤。 coutn輸入數(shù)據(jù)錯誤,回收內(nèi)存塊中有未使用的地址。nn; flag=1; break; if(flag=1) break; /* if(ai.end+1)!=fadd)&(fadd+size)=ai+1.adr)/回收區(qū)與插入點的后一個分區(qū)相連 ai+1.size=ai+1.size+size; ai+1.adr=fadd; flag=0; break; if(i=0&(fadd+size)=ai.adr)/回收區(qū)與起始地址最小的空閑塊相連 ai.adr=fadd; ai.size=ai.size+size; flag=0; break; if(ai.end+1)=fadd)&(fa

13、dd+size)=ai+1.adr)/回收的內(nèi)存夾在兩個空閑塊之間 ai.size=ai.size+size+ai+1.size; ai.end=ai.adr+ai.size-1; for(i=i+1;ik;i+) ai.adr=ai+1.adr; ai.size=ai+1.size; ai.end=ai+1.end; k=k-1; flag=0; break; */ if(flag=0) ak.num=k+1; ak.size=size; ak.adr=fadd; ak.end=fadd+size-1; k=k+1; coutn分配成功,新的內(nèi)存塊排列如下:n; void main() in

14、t size; int fadd ; / 回收區(qū)首地址 int i=1; / 選擇操作的代碼 while(true) /人機交互界面 printf( tt =n);printf( tt = 主存動態(tài)分區(qū)的分配與回收 =nn);printf( tt *001 張煒 王飛 馮平 趙建偉 001*n);printf( tt =n);printf(n);printf(tt*n);printf(tt* 點擊1 執(zhí)行 ! *n);printf(tt* 點擊2 退出 ! *n);printf(tt*n);printf(輸入選擇:n); char ch; do ch=(char)_getch(); while(ch!=1&ch!=2); /* system(cls); */ if(ch=2) /退出 return; else /執(zhí)行分配 cout初始空閑內(nèi)存塊情況:n; print(s,k); coutendl; cout初始空閑內(nèi)存塊排序(最佳適應算法):n; sort(s,k); print(s,k); while(i) coutn-n選擇操作:n;

溫馨提示

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

評論

0/150

提交評論