




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、動(dòng)態(tài)分區(qū)存儲(chǔ)管理方式的主存分配回收一、實(shí)驗(yàn)?zāi)康纳钊肓私鈩?dòng)態(tài)分區(qū)存儲(chǔ)管理方式主存分配回收的實(shí)現(xiàn)。二、實(shí)驗(yàn)要求編寫程序完成動(dòng)態(tài)分區(qū)存儲(chǔ)管理方式的主存分配回收的實(shí)現(xiàn)。實(shí)驗(yàn)具體包括:首先確定主存空間分配表;然后采用最優(yōu)適應(yīng)算法完成主存空間的分配和回收;最后編寫主函數(shù)對(duì)所做工作進(jìn)行測(cè)試。三、實(shí)驗(yàn)步驟實(shí)現(xiàn)動(dòng)態(tài)分區(qū)的分配和回收,主要考慮的問題有三個(gè):第一,設(shè)計(jì)記錄主存使用情況的數(shù)據(jù)表格,用來記錄空閑區(qū)和作業(yè)占用的區(qū)域;第二,在設(shè)計(jì)的數(shù)據(jù)表格根底上設(shè)計(jì)主存分配算法:第三,在設(shè)計(jì)的數(shù)據(jù)表格根底上設(shè)計(jì)主存回收算法。首先,考慮第個(gè)問題:設(shè)計(jì)記錄主存使用情況的數(shù)據(jù)表格,用來記錄空閑區(qū)和作業(yè)占用的區(qū)域。由于動(dòng)態(tài)分區(qū)的大
2、小是由作業(yè)需求量決定的,故分區(qū)的長度是預(yù)先不固定的,且分區(qū)的個(gè)數(shù)也隨主存分配和回收變動(dòng)。總之,所有分區(qū)情況隨時(shí)可能發(fā)生變化,數(shù)據(jù)表格的設(shè)計(jì)必須和這個(gè)特點(diǎn)相適應(yīng)。由于分區(qū)長度不同,因此設(shè)計(jì)的表格應(yīng)該包括分區(qū)在主存中的起始地址和長度。由于分配時(shí)空閑區(qū)有時(shí)會(huì)變成兩個(gè)分區(qū):空閑區(qū)和已分分區(qū),回收主存分區(qū)時(shí),可能會(huì)合并空閑分區(qū),這樣如果整個(gè)主存采用一張表格記錄已分分區(qū)和空閑區(qū),就會(huì)使表格操作繁瑣。主存分配時(shí)查找空閑區(qū)進(jìn)行分配,然后填寫已分配區(qū)表,主要操作在空閑區(qū);某個(gè)作業(yè)執(zhí)行完后,將該分區(qū)變成空閑區(qū),并將其與相鄰的空閑區(qū)合并,主要操作也在空閑區(qū)。由此可見,主存的分配和回收主要是對(duì)空閑區(qū)的操作。這樣為了便
3、于對(duì)主存空間的分配和回收,就建立兩張分區(qū)表記錄主存使用情況一張表格記錄作業(yè)占用分區(qū)的“已分配區(qū)表一張是記錄空閑區(qū)的“空閑區(qū)表。這兩張表的實(shí)現(xiàn)方法一般有兩種,一種是鏈表形式,一種是順序表形式。在試驗(yàn)中,采用順序表形式,用數(shù)組模擬。由于順序表的長度必須是提前固定,所以無論是“已分配區(qū)表還是“空閑區(qū)表都必須事先確定長度。他們的長度必須是系統(tǒng)可能的最大項(xiàng)數(shù),系統(tǒng)運(yùn)行過程中才不會(huì)出錯(cuò),因而在多數(shù)情況下,無論是“已分配區(qū)表還是“空閑區(qū)表都有空閑欄目。已分配區(qū)表中除了分區(qū)起始地址、長度外,也至少還有一項(xiàng)“標(biāo)志,如果是空閑欄目,內(nèi)容為“空,如果為某個(gè)作業(yè)占用分區(qū)的登記項(xiàng),內(nèi)容為該作業(yè)的作業(yè)名;空閑區(qū)表中除了分
4、區(qū)起始地址、長度外,也要有一項(xiàng)“標(biāo)志,如果是空閑欄目,內(nèi)容為“空,如果為某個(gè)空閑區(qū)的登記項(xiàng),內(nèi)容為“未分配。在實(shí)際系統(tǒng)中,這兩表格的內(nèi)容可能還要多,實(shí)驗(yàn)中僅僅使用上述必須的數(shù)據(jù)。為此,“已分配區(qū)表和“空閑區(qū)表可變分區(qū)管理方式將內(nèi)存除操作系統(tǒng)占用區(qū)域外的空間看做一個(gè)大的空閑區(qū)。當(dāng)作業(yè)要求裝入內(nèi)存時(shí),根據(jù)作業(yè)需要內(nèi)存空間的大小 查詢內(nèi)存中的各個(gè)空閑區(qū),當(dāng)從內(nèi)存空間中找到一個(gè)大于或等于該作業(yè)大小的內(nèi)存空閑區(qū)時(shí),選擇其中一個(gè)空閑區(qū),按作業(yè)需求量劃出一個(gè)分區(qū)裝人該作業(yè),作業(yè)執(zhí)行完后,其所占的內(nèi)存分區(qū)被收回,成為一個(gè)空閑區(qū)。如果該空閑區(qū)的相鄰分區(qū)也是空閑區(qū),那么需要將相鄰空閑區(qū)合并成一個(gè)空閑區(qū)。四、實(shí)驗(yàn)結(jié)
5、果程序代碼:#include <iostream.h>#include <iomanip.h>float minsize=5;int count1=0;int count2=0;#define m 10#define n 10structfloat address; float length; int flag; used_tablen; structfloat address; float length; int flag; free_tablem; void initialize(void);int distribute(int, float);int recycl
6、e(int);void show();void initialize(void)int a;for(a=0; a<=n-1; a+)used_tablea.flag=0;free_table0.address=1000;free_table0.length=1024;free_table0.flag=1;int distribute(int process_name, float need_length)int i, k=-1;float ads, len;int count=0;i=0; while(i<=m-1) if(free_tablei.flag=1 &&
7、 need_length <=free_tablei.length)count+;if(count=1|free_tablei.length < free_tablek.length)k=i;i=i+1;if(k!=-1)if(free_tablek.length-need_length)<=minsize) free_tablek.flag=0;ads=free_tablek.address;len=free_tablek.length;elseads=free_tablek.address;len=need_length;free_tablek.address+=need
8、_length;free_tablek.length-=need_length;i=0;while(used_tablei.flag!=0) i=i+1;if(i<=n-1) used_tablei.address=ads;used_tablei.length=len;used_tablei.flag=process_name;count1+;else if(free_tablek.flag = 0) free_tablek.flag=1;free_tablek.address=ads;free_tablek.length=len;else free_tablek.address=ads
9、; free_tablek.length+=len;cout<<"內(nèi)存分配區(qū)已滿,分配失?。" return 0;elsecout <<"無法為該作業(yè)找到適宜分區(qū)!n"return 0;return process_name;int recycle(int process_name) int y=0;float recycle_address, recycle_length;int i, j, k; int x; while(y<=n-1&&used_tabley.flag!=process_name)y=
10、y+1;if(y<=n-1) recycle_address=used_tabley.address;recycle_length=used_tabley.length;used_tabley.flag=0;count2+;else cout<<"該作業(yè)不存在!n"return 0;j=k=-1;i=0;while(!(i>=m|(k!=-1&&j!=-1) if(free_tablei.flag=1)if(free_tablei.address+free_tablei.length)=recycle_address)k=i;if(r
11、ecycle_address+recycle_length)=free_tablei.address)j=i;i=i+1;if(k!=-1) if(j!=-1)free_tablek.length+=free_tablej.length+recycle_length;free_tablej.flag=0;else free_tablek.length+=recycle_length;else if(j!=-1) free_tablej.length+=recycle_length;free_tablej.address=recycle_address; else x=0;while(free_
12、tablex.flag!=0)x=x+1;if(x<=m-1) free_tablex.length=recycle_length;free_tablex.flag=1;else used_tabley.flag=process_name;cout<<"空閑區(qū)已滿,回收失??!n"return 0;return process_name;void show() cout<<" 空 閑 區(qū)n"for(int i=0;i<=count2;i+) cout<<"地址:"<<free_
13、tablei.address<<" "<<"作業(yè)長度:"<<free_tablei.length<<" "<<"狀 態(tài):"<<free_tablei.flag<<endl; cout<<"已 分 配 區(qū)n" for(int j=0;j<count1;j+) cout<<"地址:"<<used_tablej.address<<" &
14、quot;<<"作業(yè)長度:"<<used_tablej.length<<" "<<"作業(yè)名:"<<used_tablej.flag<<endl;void main() int choice; int job_name;float need_memory;bool exitFlag=false;cout<<" 動(dòng)態(tài)分區(qū)分配方式的模擬 n" initialize(); while(!exitFlag) cout<<"
15、;1: 分配內(nèi)存 2: 回收內(nèi)存n" cout<<"3: 查看分配 0: 退 出n" cin>>choice;switch(choice) case 0: exitFlag=true; break; case 1: cout<<"請(qǐng)輸入作業(yè)名和所需內(nèi)存:" cin>>job_name>>need_memory; distribute(job_name, need_memory); break; case 2: int ID; cout<<"請(qǐng)輸入您要釋放的分區(qū)號(hào):
16、" cin>>ID; recycle(ID); break; case 3: show(); break; 內(nèi)存分配回收實(shí)現(xiàn)截圖(1)、假定系統(tǒng)內(nèi)存分配表允許的最大作業(yè)項(xiàng)為10,當(dāng)分配超過10時(shí),提示“內(nèi)存分配區(qū)已滿,分配失敗。(2)、回收作業(yè)所占內(nèi)存時(shí),當(dāng)輸入的作業(yè)名不存在,回收失敗,提示“該作業(yè)不存在。(3)、當(dāng)要釋放某個(gè)作業(yè)時(shí),將已分配表中此作業(yè)的標(biāo)志置為0,并在空閑區(qū)做相應(yīng)登記。五、總結(jié)核心算法:/最優(yōu)分配算法實(shí)現(xiàn)的動(dòng)態(tài)分區(qū)int distribute(int process_name, float need_length)int i, k=-1;/k用于定位在空
17、閑表中選擇的未分配欄float ads, len;int count=0;i=0;/核心的查找條件,找到最優(yōu)空閑區(qū) while(i<=m-1) /循環(huán)找到最正確的空閑分區(qū)if(free_tablei.flag=1 && need_length <=free_tablei.length)count+;if(count=1|free_tablei.length < free_tablek.length)k=i;i=i+1;if(k!=-1)if(free_tablek.length-need_length)<=minsize) /整個(gè)分配free_table
18、k.flag=0;ads=free_tablek.address;len=free_tablek.length;else/切割空閑區(qū)ads=free_tablek.address;len=need_length;free_tablek.address+=need_length;free_tablek.length-=need_length;i=0;/循環(huán)尋找內(nèi)存分配表中標(biāo)志為空欄目的項(xiàng)while(used_tablei.flag!=0) i=i+1;if(i<=n-1) /找到,在已分配區(qū)表中登記一個(gè)表項(xiàng)used_tablei.address=ads;used_tablei.length=len;used_tablei.flag=process_name;count1+;else /已分配區(qū)表長度缺乏if(free_tablek.flag = 0) /將已做的整個(gè)分配撤銷free_tablek.flag=1;free_tablek.address=ads;free_tablek.length=len;else /將已做的切割分配撤銷free_tablek.address=ads; free_tablek.length+=len;cout<<"內(nèi)存分配區(qū)已滿,分配失??!n" return 0;elsecout <<
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 水產(chǎn)養(yǎng)殖合同協(xié)議
- 章程合同協(xié)議用在哪里
- 合同協(xié)議搞笑
- 二手機(jī)動(dòng)車出讓協(xié)議合同
- 垃圾運(yùn)輸協(xié)議合同
- 導(dǎo)游協(xié)議合同
- 水路運(yùn)輸合同協(xié)議書模板
- 配餐合同協(xié)議
- 夜市股東協(xié)議書范本合同
- 防疫志愿者服務(wù)協(xié)議合同
- 單采血漿站血液安全技術(shù)核查指南
- 衛(wèi)健委2020年落實(shí)婦女兒童發(fā)展規(guī)劃情況的匯報(bào)
- 能力驗(yàn)證課件
- 病例報(bào)告表(CRF)模板
- 大學(xué)語文《西廂記》PPT課件
- 《中華經(jīng)典誦讀》PPT課件
- ZL40輪式裝載機(jī)工作裝置設(shè)計(jì)(含全套CAD圖紙)
- 履帶底盤的組成介紹及各參數(shù)的計(jì)算
- 砼檢查井自動(dòng)計(jì)算表格Excel
- 資產(chǎn)評(píng)估收費(fèi)管理辦法中評(píng)協(xié)[2009]199號(hào)
- 某化纖毛紡廠總配變電所與高壓配電系統(tǒng)設(shè)計(jì)說明
評(píng)論
0/150
提交評(píng)論