




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、課程設(shè)計(jì)報(bào)告課程設(shè)計(jì)題目:循環(huán)首次適應(yīng)的動(dòng)態(tài)分區(qū)分配算法模擬 專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù)班 級(jí):10204102姓 名:譜學(xué) 號(hào): 10204102指導(dǎo)教師: 高小輝 2013年 1 月 11 日目 錄一循環(huán)首次適應(yīng)算法 ·······························
2、3;···················3 1. 概述 ·····························
3、183;·································· 3 2需求分析··············
4、·················································3 二實(shí)驗(yàn)指
5、導(dǎo)··················································
6、;··············4 1.基本思想··································
7、83;···················42數(shù)據(jù)結(jié)構(gòu)·····························
8、83;························4三運(yùn)行環(huán)境························
9、83;······························6四流程圖··················
10、3;················································6五循環(huán)首次適應(yīng)算法
11、代碼···········································5六調(diào)試結(jié)果·····
12、3;·················································11七、
13、總結(jié)·················································
14、3;········14八參考文獻(xiàn)········································
15、83;··············14一 循環(huán)首次適應(yīng)算法 1. 概述:該算法是由首次適應(yīng)算法演變而成的。在為進(jìn)程分配內(nèi)存空間時(shí),不再是每次都從鏈?zhǔn)组_(kāi)始查找,而是從上次找到的空閑分區(qū)的下一個(gè)空閑分區(qū)開(kāi)始查找,直至找到一個(gè)能滿足要求的空閑分區(qū),從中劃出一塊的請(qǐng)求大小相等的內(nèi)存空間分配給作業(yè)。為實(shí)現(xiàn)該算法,應(yīng)設(shè)置一起始查找指針,用于指示下一次起始查詢的空閑分區(qū),并采用循環(huán)查找方式,即如果最后一個(gè)(鏈尾)空閑分區(qū)的大小仍不能滿足要求,則返回到第一個(gè)空閑分區(qū),比較
16、大小是否滿足,找到后,應(yīng)調(diào)整起始查詢指針。2. 需求分析了解動(dòng)態(tài)分區(qū)分配中使用的數(shù)據(jù)結(jié)構(gòu)和分配算法,并進(jìn)一步加深對(duì)動(dòng)態(tài)分區(qū)存儲(chǔ)管理方式及其實(shí)現(xiàn)過(guò)程的理解。采用首次適應(yīng)算法的動(dòng)態(tài)分區(qū)分配過(guò)程alloc()和回收過(guò)程free()。空閑分區(qū)通過(guò)空閑分區(qū)鏈表來(lái)管理,在進(jìn)行內(nèi)存分配時(shí),系統(tǒng)優(yōu)先使用空閑區(qū)低端的空間,即每次分配內(nèi)存空間是總是從低址部分開(kāi)始進(jìn)行循環(huán),找到第一個(gè)合適的空間,便按作業(yè)所需分配的大小分配給作業(yè)。作業(yè)完成時(shí),需要釋放作業(yè)所占空間,此時(shí)要考慮到四種情況:(1)回收區(qū)與插入點(diǎn)的前一個(gè)空閑分區(qū)相鄰接。此時(shí)將二者合并,修改前一分區(qū)的大小。(2)回收區(qū)與插入點(diǎn)的后一空閑分區(qū)相鄰接,將二者合并,
17、用回收區(qū)的首址作為新空閑區(qū)的首址。(3)回收區(qū)同時(shí)與插入點(diǎn)的前后兩個(gè)空閑分區(qū)相鄰接,三者合并,使用前一空閑分區(qū)的表項(xiàng)和首址。(4)回收區(qū)單獨(dú)存在。二、實(shí)驗(yàn)指導(dǎo)1基本思想動(dòng)態(tài)分區(qū)是指系統(tǒng)不預(yù)先劃分固定分區(qū),而是在裝入程序的時(shí)候劃分內(nèi)存區(qū)域,使得為程序分配的分區(qū)大小恰好等于該程序的需求量,且分區(qū)的個(gè)數(shù)是動(dòng)態(tài)的。顯然動(dòng)態(tài)分區(qū)有較大的靈活性,較之固定分區(qū)能獲得好的內(nèi)存利用率。2數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)分區(qū)管理可以用兩種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),一種是已分配區(qū)表和空閑區(qū)表,也就是用預(yù)先定義好的系統(tǒng)空間來(lái)存放空間分配信息。另一種也是最常用的就是空閑鏈表,由于對(duì)分區(qū)的操作是動(dòng)態(tài)的,所以很難估計(jì)數(shù)據(jù)結(jié)構(gòu)所占用的空間,而且空閑區(qū)表會(huì)占
18、用寶貴的系統(tǒng)空間,所以提出了空閑鏈表的概念。其特點(diǎn)是用于管理分區(qū)的信息動(dòng)態(tài)生成并和該分區(qū)在物理地址上相鄰。這樣由于可以簡(jiǎn)單用兩個(gè)空閑塊之間的距離定位已分配空間,不僅節(jié)約了系統(tǒng)空間,而且不必維持已分配空間的信息。本實(shí)驗(yàn)是要做一個(gè)模擬程序,來(lái)模擬動(dòng)態(tài)分區(qū)算法的分配和回收過(guò)程,并不是真正的去分配和回收內(nèi)存。基本的模擬方法有兩種:1、先從內(nèi)存中申請(qǐng)一塊存儲(chǔ)區(qū),對(duì)這塊存儲(chǔ)區(qū)進(jìn)行模擬的分配和回收活動(dòng)。2、不申請(qǐng)存儲(chǔ)區(qū),自己定義一塊虛擬的存儲(chǔ)區(qū),對(duì)這塊存儲(chǔ)區(qū)進(jìn)行模擬的分配和回收活動(dòng),分配和回收僅僅是對(duì)數(shù)據(jù)結(jié)構(gòu)的修改而已。三運(yùn)行環(huán)境: 1.操作系統(tǒng) WINDOWS XP 2.編譯軟件 Microsoft Vi
19、sual C+ 3.電腦配置:主頻3.0GHz 內(nèi)存512MB 四流程圖1程序結(jié)構(gòu)如圖: 主菜單創(chuàng)建新作業(yè)alloc();內(nèi)存分配查看空閑分區(qū)鏈free();內(nèi)存回收程序結(jié)束退出回收內(nèi)存空間2.首次適應(yīng)算法的結(jié)構(gòu)如圖:從鏈?zhǔn)组_(kāi)始順序查找空閑分區(qū)鏈完否?返 回分區(qū)大小>所需大小?分區(qū)大小-所需大小<=不可再分割大小?從該分區(qū)中劃出所需大小的新分區(qū)將該整個(gè)分區(qū)從空閑分區(qū)鏈中移出將該分區(qū)分配給相應(yīng)的作業(yè),修改有關(guān)數(shù)據(jù)返 回Y繼續(xù)檢索下一個(gè)表項(xiàng)YNNNY五循環(huán)首次適應(yīng)算法代碼#include <iostream> #include <stdlib.h> #inclu
20、de <stdio.h>using namespace std; struct memory struct memory *former; /前向指針 int address;/地址 int num;/作業(yè)號(hào) int size;/分配內(nèi)存大小 int state;/狀態(tài)0表示空閑1表示已分配 struct memory *next; /后向指針; typedef struct memory MEMORY; MEMORY *mem; const int size_min=10;/內(nèi)存允許的最小空閑塊的大小 void init(); /初始化內(nèi)存塊void exec();/執(zhí)行相應(yīng)算法
21、void F_F(int); /依次初始化每個(gè)作業(yè),并根據(jù)相應(yīng)算法對(duì)作業(yè)分配內(nèi)存void alloc(MEMORY *,MEMORY *);/分配內(nèi)存算法(包括兩種不同算法)void free(MEMORY *,int);/首次適應(yīng)算法回收內(nèi)存void sort(MEMORY *);/對(duì)內(nèi)存鏈進(jìn)行排序 void insert(MEMORY *,MEMORY *); /按空間大小將作業(yè)順序插入到內(nèi)存鏈void print(MEMORY *);/打印內(nèi)存鏈 void main() /主函數(shù) int i=0; while(1) /選擇算法 cout<<("n歡迎進(jìn)入!"
22、;); cout<<("nPlease select a number(1,0)"); cout<<("n 循環(huán)首次適應(yīng)算法"); cout<<" 0-中止程序"<<endl; cin>>i; if(i=1) /首次適應(yīng)算法 cout<<("n以下為首次適應(yīng)算法:n"); init();exec(); else exit(1); void init() /初始化內(nèi)存容量 mem=new MEMORY; mem->size=640; mem
23、->former=0; mem->next=0; void exec()/執(zhí)行算法 while(1) /選擇申請(qǐng)或釋放內(nèi)存操作 cout<<"*"<<endl; cout<<"申請(qǐng)內(nèi)存請(qǐng)輸入作業(yè)號(hào)(1-6)"<<endl; cout<<"釋放內(nèi)存請(qǐng)輸入數(shù)字8"<<endl; cout<<"中止程序請(qǐng)輸入數(shù)字0"<<endl; cout<<"*"<<endl; int
24、 k;cin>>k; /根據(jù)k值選擇相應(yīng)的操作if(k>=1&&k<=7) F_F(k); if(k=8)int m; cout<<"請(qǐng)輸入要釋放的作業(yè)號(hào):" cin>>m; /選擇相應(yīng)的回收算法 free(mem,m); else if(k=0) /回滾到選擇算法的步驟break;void F_F(int i) /依次初始化每個(gè)作業(yè),并根據(jù)相應(yīng)算法對(duì)作業(yè)分配內(nèi)存 int work=130,60,100,200,160,60,50;/作業(yè)序列,i從1開(kāi)始(與作業(yè)號(hào)對(duì)應(yīng)),因此從第一個(gè)開(kāi)始存放作業(yè)值,第0個(gè)值為0
25、,不是作業(yè) cout<<"請(qǐng)輸入要作業(yè)所需的內(nèi)存大小:" MEMORY *running; running=(MEMORY *)malloc(sizeof(MEMORY); if(running!=NULL) running->former=NULL; running->address=0; running->num=i; /i從1開(kāi)始循環(huán) running->size=worki; /指定作業(yè)大小 running->state=0; /作業(yè)未分配 running->next=NULL; /根據(jù)相應(yīng)算法為作業(yè)分配內(nèi)存,詳見(jiàn)all
26、oc函數(shù) alloc(mem,running); print(mem); cout<<endl; else cout<<"沒(méi)有足夠的內(nèi)存空間"<<endl; void print(MEMORY *ptr) /打印顯示內(nèi)存情況 MEMORY *temp; temp=ptr->next; cout<<"n內(nèi)存鏈的狀態(tài)為:"<<endl; while(temp!=NULL) if(temp->state=0) cout<<"內(nèi)存 空閑 "<<&q
27、uot;起始地址為:"<<temp->address <<" 空閑空間大小為:"<<temp->size<<"k" else cout<<"內(nèi)存已分配 "<<"起始地址為:"<<temp->address<<" 分配空間大小為:" <<temp->size<<"k" <<" 運(yùn)行的作業(yè)號(hào):"&
28、lt;<temp->num; cout<<endl; temp=temp->next; void free(MEMORY *ptr,int i) /首次適應(yīng)算法 作業(yè)處理完后釋放內(nèi)存空間 MEMORY *previous,*current; previous=ptr; current=previous->next; while(current!=NULL) /循環(huán)直到找到需要釋放的作業(yè)位置 if(current->state=1&¤t->num=i) break; previous=current; current=c
29、urrent->next; if(current=NULL) cout<<"內(nèi)存中沒(méi)有任何作業(yè)!"<<endl; return; else if(current->next=NULL) /當(dāng)前作業(yè)為內(nèi)存中最后一個(gè)作業(yè) if(previous->state=0) /與前一個(gè)相鄰空閑區(qū)合并 previous->size=previous->size+current->size; previous->next=NULL; cout<<"作業(yè) "<<(current->
30、;num)<<"釋放 "<<(current->size)<<"k 的空間"<<endl; print(mem); else /將狀態(tài)改為0,即為空閑區(qū) current->state=0; cout<<"作業(yè) "<<(current->num)<<"釋放 "<<(current->size)<<"k 的空間"<<endl; print(mem); els
31、e if(current->next)->next=NULL)/p6 /當(dāng)前作業(yè)為倒數(shù)第二個(gè)作業(yè)(此種情況還是要單列出來(lái)討論的否則會(huì)出現(xiàn)錯(cuò)誤) if(previous->state=0&&(current->next)->state=0) /p7 /釋放的地址空間前后均為空閑區(qū) previous->size=previous->size+current->size+(current->next)->size; previous->next=NULL; /與下邊else(其他情況的不同之處) cout<<
32、;"作業(yè) "<<(current->num)<<"釋放 "<<(current->size)<<"k 的空間"<<endl; print(mem); else if(previous->state=0) /p5 /釋放的地址空間前面有空閑塊則把它和前面的合并 previous->size=previous->size+current->size; (current->next)->former=previous; previou
33、s->next=current->next; cout<<"作業(yè) "<<(current->num)<<"釋放 "<<(current->size)<<"k 的空間"<<endl; print(mem); else if(current->next)->state=0) /p8 /釋放的地址空間后面有空閑塊則把它和后面的空閑塊合并 current->size=current->size+(current->ne
34、xt)->size; current->state=0; current->next=NULL; /與下邊else(其他情況的不同之處) cout<<"作業(yè) "<<(current->num)<<"釋放 "<<(current->size)<<"k 的空間"<<endl; print(mem); else /釋放的地址空間前后都沒(méi)有空閑塊時(shí)直接把它的狀態(tài)改為0 current->state=0; cout<<&quo
35、t;作業(yè) "<<(current->num)<<"釋放 "<<(current->size)<<"k 的空間"<<endl; print(mem); else /其他情況下(當(dāng)前作業(yè)在鏈表中間) if(previous->state=0&&(current->next)->state=0) /p7 /所釋放空間前后均為空閑區(qū) previous->size=previous->size+current->size+(curr
36、ent->next)->size; (current->next)->next)->former=previous; previous->next=(current->next)->next; cout<<"作業(yè) "<<(current->num)<<"釋放 "<<(current->size)<<"k 的空間"<<endl; print(mem); else if(previous->state=
37、0) /p5 /釋放的地址空間前面有空閑塊則把它和前面的合并 previous->size=previous->size+current->size; (current->next)->former=previous; previous->next=current->next; cout<<"作業(yè) "<<(current->num)<<"釋放 "<<(current->size)<<"k 的空間"<<endl;
38、 print(mem); else if(current->next)->state=0) /p8 /釋放的地址空間后面有空閑塊則把它和后面的空閑塊合并 current->size=current->size+(current->next)->size; current->state=0; (current->next)->next)->former=current; current->next=(current->next)->next; cout<<"作業(yè) "<<(cu
39、rrent->num)<<"釋放 "<<(current->size)<<"k 的空間"<<endl; print(mem); else /處理完的作業(yè)前后都沒(méi)有空閑塊時(shí)直接把它的狀態(tài)改為0 current->state=0; cout<<"作業(yè) "<<(current->num)<<"釋放 "<<(current->size)<<"k 的空間"<<
40、;endl; print(mem); void alloc(MEMORY *ptr,MEMORY *assign) /根據(jù)算法分配內(nèi)存(is_optimist狀態(tài)) if(ptr->next=NULL) /內(nèi)存沒(méi)有作業(yè)運(yùn)行 if(ptr->size>=assign->size) /內(nèi)存空間大于作業(yè)所需空間,為內(nèi)存分配空間 ptr->size=ptr->size-assign->size; assign->state=1; ptr->next=assign; assign->former=ptr; cout<<"作
41、業(yè) "<<(assign->num)<<"申請(qǐng)"<<(assign->size)<<" "<<"k的內(nèi)存空間"<<endl; else cout<<"沒(méi)有足夠的內(nèi)存空間為作業(yè)"<<(assign->num)<<"分配"<<endl; delete assign; else /內(nèi)存中如果已經(jīng)分配了空間 MEMORY *previous,*current
42、; previous=ptr;/previous為鏈表中的第一個(gè)元素 current=previous->next; while(current!=NULL) /當(dāng)前區(qū)間不為空(最后一個(gè)區(qū)間的next為空),即沒(méi)有循環(huán)到最后 /如果當(dāng)前內(nèi)存空間大于作業(yè)所需空間并且內(nèi)存沒(méi)有被分配/則結(jié)束循環(huán),當(dāng)前current位置即為要插入的位置 if(current->size>=assign->size&¤t->state=0) break; previous=current; /previous后移 current=current->next
43、; if(current=NULL) /空閑鏈中沒(méi)有為作業(yè)分配所需的空間,即釋放的空閑區(qū)間小于要分配的作業(yè)空間 /不夠用,則在所有作業(yè)后邊另外再申請(qǐng)空閑區(qū),如作業(yè)4 if(ptr->size>=assign->size) /內(nèi)存中還有足夠沒(méi)分配的空閑空間為此作業(yè)分配 /此時(shí)ptr指向內(nèi)存上未分配空閑空間的起始地址 assign->address =640-(ptr->size); ptr->size=ptr->size-assign->size; assign->state=1; assign->former=previous; pr
44、evious->next=assign; cout<<"作業(yè) "<<(assign->num)<<"申請(qǐng)"<<(assign->size)<<" "<<"k的內(nèi)存空間"<<endl; else cout<<"沒(méi)有足夠的內(nèi)存空間為作業(yè)"<<(assign->num)<<"分配"<<endl; else /釋放的空閑鏈中有可為
45、此作業(yè)分配的空間 if(current->size-assign->size)<=size_min) /空閑鏈所具備的空間與作業(yè)所需空間大小差不多時(shí) /直接把整個(gè)空閑塊的空間分配給作業(yè)否則從空閑塊中 current->num=assign->num; /劃出與作業(yè)等同的空間 current->state=1; delete assign; cout<<"作業(yè) "<<(current->num)<<"申請(qǐng)"<<(current->size)<<" "<<"k的內(nèi)存間"<<e
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 保底底薪合同范本
- 園林租賃合同范本
- 倉(cāng)庫(kù)出讓合同范本模板
- 地庫(kù)開(kāi)發(fā)合同范本
- 股份質(zhì)押合同范例
- 店面租賃協(xié)議合同書(shū)
- 二零二五版服務(wù)員合同
- 二零二五安全生產(chǎn)協(xié)議責(zé)任書(shū)
- 二零二五三方合作成立公司的協(xié)議
- 婚禮戶外安全合同范本
- 大學(xué)英語(yǔ)寫(xiě)作(華南農(nóng)業(yè)大學(xué))智慧樹(shù)知到答案章節(jié)測(cè)試2023年
- 2023防腐防火涂裝鋼結(jié)構(gòu)變形B
- 跳汰機(jī)操作手冊(cè)
- 100以內(nèi)加減法口算練習(xí)題4000題
- 桂林電子科技大學(xué)
- JJF 1253-2010帶表卡規(guī)校準(zhǔn)規(guī)范
- GB/T 7306.2-200055°密封管螺紋第2部分:圓錐內(nèi)螺紋與圓錐外螺紋
- GB/T 4956-2003磁性基體上非磁性覆蓋層覆蓋層厚度測(cè)量磁性法
- GB/T 27867-2011石油液體管線自動(dòng)取樣法
- PMP項(xiàng)目管理培訓(xùn)-課件
- 10000中國(guó)普通人名大全
評(píng)論
0/150
提交評(píng)論