資源簡介
包括實驗題目,代碼及運行結(jié)果
實驗5 內(nèi)存管理(2學(xué)時)
一、實驗?zāi)康?
通過實驗加強對內(nèi)存管理方法的理解和掌握。
二、實驗內(nèi)容
編寫程序?qū)崿F(xiàn)采用可變分區(qū)方法管理內(nèi)存。
三、實驗要求
1、在該實驗中,采用可變分區(qū)方式完成對存儲空間的管理(即存儲空間的分配與回收工作)。
2、設(shè)計用來記錄主存使用情況的數(shù)據(jù)結(jié)構(gòu):已分區(qū)表和空閑分區(qū)表或鏈表。
3、在設(shè)計好的數(shù)據(jù)結(jié)構(gòu)上設(shè)計一個主存分配算法(循環(huán)首次適應(yīng)算法)。
4、在設(shè)計好的數(shù)據(jù)結(jié)構(gòu)上設(shè)計一個主存回收算法。其中,若回收的分區(qū)有上鄰空閑分區(qū)和(或)下鄰空閑分區(qū),要求合并為一個空閑分區(qū)登記在空閑分區(qū)表的一個表項里。
5、(附加)若需要可以實現(xiàn)程序的浮動,對內(nèi)存空間進(jìn)行緊湊。

代碼片段和文件信息
#include?
#include?
#include?
using?namespace?std;
/***?空閑鏈?***/
struct?Block{
????Block*?fro;?//?前向指針
????Block*?nex;?//?后向指針
????int?sta_add;?//?起始地址
????int?sz;?//?空閑塊大小
????bool?state;?//?分配狀態(tài)?1表示已經(jīng)分配?0表示空閑
????char?name[10];?//?占用分區(qū)作業(yè)名稱
}*block*first*p;?//?block:?分區(qū)塊遍歷變量?first:?分區(qū)首地址?p:?下一個開始遍歷的分區(qū)塊地址
int?n;?//?空閑塊數(shù)
/***?作業(yè)?***/
struct?Work{
????char?name[10];?//?作業(yè)名稱
????int?sz;?//?作業(yè)大小
????Block*?add;?//?分區(qū)塊的地址
????int?block_sz;?//?分區(qū)塊的大小
????bool?finish;?//?作業(yè)完成狀態(tài)?1表示已完成,0表示未完成
}work[100];
int?id?=?0;?//?作業(yè)數(shù)量
void?input(){
????cout?<“請輸入空閑塊數(shù):?“;
????cin?>>?n;
????Block*?fro;
????int?now?=?0;?//?起始地址
????for(int?i=0;?i ????????cout?<“請輸入第“?<????????int?sz;?cin?>>?sz;
????????block?=?new?Block();
????????block->state?=?0;
????????block->sz?=?sz;
????????block->sta_add?=?now;
????????now?=?now+sz;
????????strcpy(block->name“NULL“);
????????if(i?==?0)?first?=?block;
????????else?block->fro?=?frofro->nex?=?block;
????????fro?=?block;
????}
????block->nex?=?first;
????p?=?first;
}
bool?allocation(int?id){
????cout?<“請輸入作業(yè)名稱?作業(yè)大小:?“;
????char?name[10];?int?sz;
????cin?>>?name?>>?sz;
????block?=?p;
????for(int?t=0;?t ????????if(block->state?==?1)?{?block?=?block->nex;?continue;}
????????if(block->sz?>=?sz){
????????????cout?<“分配成功!“?<????????????block->state?=?1;
????????????strcpy(block->namename);
????????????work[id].block_sz?=?block->sz;
????????????strcpy(work[id].namename);
????????????work[id].add?=?block;
????????????work[id].sz?=?sz;
????????????p?=?block->nex;
????????????return?1;
????????}
????????block?=?block->nex;
????}
????cout?<“分配失敗!“?<????return?0;
}
void?pback(){
????cout?<“請輸入完成作業(yè)名稱:?“;
????char?name[10];?cin?>>?name;
????bool?flag?=?0;
????for(int?i=0;?i ????????if(strcmp(work[i].namename)==0?&&?work[i].finish==0){
????????????block?=?work[i].add;
????????????strcpy(block->name“NULL“);
????????????block->state?=?0;
????????????work[i].finish?=?1;
????????????flag?=?1;
????????????break;
????????}
????}
????if(flag?==?0)?{?cout<<“沒有該作業(yè)!\n“;?return?;}
????Block*?fro*?nex;
????nex?=?block->nex;
????if(block?==?first){
????????if(n?==?1)?{
????????????cout?<“回收成功!?\n“;
????????????return?;
????????}
????????if(nex->state?==?0){
????????????block->nex?=?nex->nex;
????????????nex->nex->fro?=?block;
????????????block->sz?=?block->sz+nex->sz;
????????????if(p?==?nex)?p?=?nex->nex;
????????????delete?nex;
????????}
????}else?if(block->nex?==?first){
????????fro?=?block->fro;
????????if(fro->state?==?0){
????????????fro->nex?=?block->nex;
????????????fro->sz?=?fro->sz+block->sz;
????????????if(p?==?block)?p?=?block->nex;
????????????delete?block;
????????}
????}else{
????????fro?=?block->fro;
????????nex?=?block->nex;
????????if(fro->state==0?&&?nex->state==0){
????????????fro->nex?=?nex->nex;
???????????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????5060??2018-05-23?21:14??main.cpp
?????文件???????30208??2018-05-23?15:16??實驗題目5.doc
?????文件???????97390??2018-05-23?21:13??新建?Microsoft?Word?文檔.docx
評論
共有 條評論