主存儲器空間的分配和回收_第1頁
主存儲器空間的分配和回收_第2頁
主存儲器空間的分配和回收_第3頁
主存儲器空間的分配和回收_第4頁
主存儲器空間的分配和回收_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、主存儲器空間的分配和回收直接進(jìn)行源代碼的編寫:/*作業(yè)名用1,2,3,···表示*/#include<iostream>#include<list>using namespace std;#define TOTLE_LEFT 108 /除系統(tǒng)占用內(nèi)存外的剩余內(nèi)存#define first_free 14 /第一塊空閑區(qū)的起始地址#define first_size 12 /第一塊空閑區(qū)的大小#define sec_free 32 /第二塊空閑區(qū)的起始地址#define sec_size 96 /第二塊空閑區(qū)的大小#define first_

2、job_size 3#define sec_job_size 23#define third_job_size 3/空閑分區(qū)表結(jié)點 struct Freeint start;int length;Free(int s,int l);Free:Free(int s,int l)start = s;length = 1;/已分配分區(qū)表結(jié)點struct Taskint name;int start;int length;Task(int n,int s,int l);Task:Task(int n,int s,int l) name = n; start = s; length = l;/聲明空閑分

3、區(qū)表list<Free*>free_list;list<Task*>Task_list;/分配可用的起始地址int get_free(int size) int start = -1; /查找適當(dāng)?shù)目臻e分區(qū) list<Free*>:iterator it = free_list.begin(); bool find = false; while(it!=free_list.end() if(*it)->length>=size) find = true; start = (*it)->start; /大于,就分割,把低地址分配出去 if(*

4、it)->length>size) (*it)->start += size; (*it)->length -= size; /等于,就從空閑區(qū)中刪除 else free_list.erase(it); break; /找到就跳出循環(huán) it +; return start;void do_request(int name,int size)if(name=0) cout<<”申請不合法!非法的作業(yè)名!”<<endl; return;if(size>TOTLE_LEFT) cout<<”申請不合法!超出了最大可用內(nèi)存!”<&

5、lt;endl; return; /查找是否已存在同名作業(yè)bool find = false;list<Task*>:iterator it = task_list.begin();while(it!=task_list.end() if(*it)->name =name) find = true; break; it+;if(find) cout<<”此作業(yè)已存在!”<<endl; return;/從空閑分區(qū)選擇合適的空間int start = get_free(size);/未找到合適空間if(start =-1) cout<<”系統(tǒng)內(nèi)

6、存不足!作業(yè)等待!”<<endl; return;Task * ta = new Task(name,start,size);task_list.push_back(ta);cout<<”作業(yè)申請內(nèi)存成功!”<<endl;/插入到空閑分區(qū)表,起始地址從小到大void free_task(int start,int length) /查找要插入的位置 list<Free*>:iterator init_it,last_it; last_it = init_it; list<Free*>:iterator it = free_list.b

7、egin(); while(it! = free_list.end() if(*it)->start>start) break; last_it = it; it +; bool link_prev = false; bool link_next = false; /有前一個小時 if(last_it! = init_it) if(*last_it)->start+(*last_it)->length = start) link_prev = true; /有后一個小時 if(it! = free_list.end() if(start + length =(*it)-

8、>start) link_next = true; /與前后都相連 if(link_prev&&link_next) (*last_it)->length += length + (*it) ->length; free_list.erase(it); /只與前相連 else if(link_prev) (*last_it)->length += length; /只與后相連 else if(link_next) (*it)->start = start; (*it)->length += length; /前后都不相連 else Free

9、*fr = new Free(start,length); Free_list.insert(it,fr); void do_revoke(int name)if(name =0) cout<<”錯誤!不能回收系統(tǒng)內(nèi)存!”<<endl; return;/查找要回收的作業(yè)是否存在bool find = false; list<Task*>:iterator it = task_list.begin(); while(it! = task_list,end() if(*it)->name = name) find = true; break; it +;

10、if(!find) cout<<”錯誤!要回收的作業(yè)不存在!”<<endl; return;free_task(*it)->start,(*it)->length);task_list.erase(it);cout<<”回收作業(yè)占用內(nèi)存成功!”<<endl;void print_task() cout<<”作業(yè)名稱 起始地址 大小”<<endl; for(list<Task*>:iterator it = task_list.begin();it!=task_list.end();it+) cout

11、<<(*it)->name<<” <<(*it)->start<<” <<(*it)->length<<endl; void print_free() cout<<”以下是空閑分區(qū)表的狀態(tài)”<<endl; <<”起始地址 大小”<<endl; for(list<Free*>:iterator it = free_list.begin();it! = free_list.end();it +) cout<<(*it)->start

12、<<” <<(*it)->length<<endl; int main(0 /把系統(tǒng)占用后剩余的內(nèi)存空間計入空閑分區(qū)表 Free *fr1 = new Free(first_free,first_size); free_list.push_back(fr1); Free *fr = new Free(sec_free,sec_size); free_list.push_back(fr); Task *ta = new Task(1,26,first_job_size); task_list.push_back(ta); Task *ta1 = new

13、Task(3,29,third_job_size); task_list.push_back(ta1); Task *ta2 = new Task(2,128,sec_job_size); task_list.push_back(ta2); print_free(): bool quit = false; while(!quit) cout<<”選擇要進(jìn)行的操作:1.申請內(nèi)存2.回收內(nèi)存3.查看作業(yè)”; int op; cin>>op; if(op=1) int name; int size; cout<<”請輸入作業(yè)名及占用空間大小:”; cin>>name; cin>>size; do_request(name,size); print_free(); else if(op=2) int name; cout<<”請輸入要回收的作業(yè)名:”; cin>>name; do_re

溫馨提示

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

評論

0/150

提交評論