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

下載本文檔

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

文檔簡介

1、實(shí)習(xí)二 主存空間的分配和回收一、實(shí)習(xí)內(nèi)容模擬主存空閑空間的表示方法,以及模擬實(shí)現(xiàn)主存空間的分配和回收。二、實(shí)習(xí)目的通過本實(shí)習(xí)幫助理解在不同的存儲管理方式下應(yīng)怎樣進(jìn)行存儲空間的分配和回收。三、實(shí)習(xí)題目在可變分區(qū)管理方式下采用首次適應(yīng)算法實(shí)現(xiàn)主存分配和回收。假定內(nèi)存大小為128K。空閑區(qū)說明表格式為:起始地址指出空閑區(qū)的起始地址;長度一個連續(xù)空閑區(qū)的長度;狀態(tài)有兩種狀態(tài),一種是“未分配”狀態(tài),另一種是“空表目”狀態(tài)。本實(shí)習(xí)我用FBT實(shí)現(xiàn),并且采用首次適應(yīng)算法FF分配內(nèi)存。四、程序中所使用的符號說明和數(shù)據(jù)結(jié)構(gòu)struct FBT自由塊表結(jié)構(gòu)體int startdress;自由塊表中一個表項(xiàng)的始地址i

2、nt size;自由塊表中的一個表項(xiàng)的大小int processid;這個表項(xiàng)所對應(yīng)的進(jìn)程號int state;這個表項(xiàng)的狀態(tài)struct FBT *next;指向下一個自由塊表結(jié)構(gòu)體;struct FBT *create() 建立自由塊表子函數(shù)struct FBT *distribute(struct FBT *head)分配內(nèi)存空間子函數(shù)struct FBT *callback(struct FBT *head)回收內(nèi)存空間子函數(shù)回收內(nèi)存有下列4種情況,在程序中用條件語句實(shí)現(xiàn):進(jìn)程i回收區(qū)進(jìn)程j空閑區(qū)回收區(qū)進(jìn)程j進(jìn)程i回收區(qū)空閑區(qū)空閑區(qū)回收區(qū)空閑區(qū)void print(struct FBT

3、 *head)顯示自由塊表內(nèi)容子函數(shù)void main()主函數(shù)五、流程圖鏈表初始化流程圖顯示FBT流程圖分配內(nèi)存子函數(shù)流程圖回收內(nèi)存子函數(shù)流程圖六、程序清單#include <stdio.h>#include<malloc.h>struct FBTint startdress;/分區(qū)首地址int size;/分區(qū)所占內(nèi)存大小int processid;/所申請內(nèi)存分區(qū)的進(jìn)程號,本來FBT中沒有這一項(xiàng),但是便于內(nèi)存的回收我加了這一項(xiàng)int state;/此分區(qū)的狀態(tài)struct FBT *next;/指針,指向下一個結(jié)點(diǎn)(分區(qū));struct FBT *create()

4、/建立自由塊表struct FBT *head,*p,*q;head=NULL;p=(struct FBT *)malloc (sizeof(struct FBT);/申請一個新的結(jié)點(diǎn),用來存放新的分區(qū)q=(struct FBT *)malloc (sizeof(struct FBT);/申請一個新的結(jié)點(diǎn),用來存放新的分區(qū)head=p;p->size =5;/系統(tǒng)分區(qū),大小為5p->processid =-1;/1表示操作系統(tǒng)的固定分區(qū)p->startdress =0;/開始地址為0p->state =1;/狀態(tài)為已分配,值為1p->next =q;/指向下一個結(jié)

5、點(diǎn)q->size=123;/余下的分區(qū)大小為123q->processid=0;/所對應(yīng)的進(jìn)程號為0,表示都未分配q->startdress=5;/開始地址為5q->state=0;/狀態(tài)為未分配,值為0q->next=NULL;/指向下一個分區(qū),因?yàn)橹挥袃蓚€分區(qū),所以為空return head;struct FBT *distribute(struct FBT *head)/分配內(nèi)存子函數(shù)int id,neededsize;struct FBT *pretail,*tail,*p;printf("please input the process id:

6、");/輸入要申請內(nèi)存的進(jìn)程號scanf("%d",&id);printf("please input the needed size:");/輸入要申請的內(nèi)存大小scanf("%d",&neededsize);pretail=tail=head;while (tail!=NULL)if(tail->state =0&&tail->size >=neededsize)/如果此分區(qū)沒有分配,而且大小大于等于申請的內(nèi)存大小if(tail->size >neededsi

7、ze)/如果此分區(qū)大小大于要申請的大小,分配,并把余下的再分割成一個分區(qū)p=(struct FBT *)malloc (sizeof(struct FBT);p->size =neededsize;p->processid =id;p->startdress =tail->startdress ;p->state =1;if(head!=tail)pretail->next =p;p->next =tail;pretail=p;else p->next =tail;head=p;tail->next =NULL;tail->start

8、dress =p->startdress+p->size ;tail->size =tail->size -neededsize;break;if(tail->size =neededsize)/如果此分區(qū)等于要申請的大小,直接分配即可tail->processid =id;tail->state =1;break; else/否則,指向下一個結(jié)點(diǎn)繼續(xù)判斷pretail=tail;tail=tail->next ;if(tail=NULL)/如果遍歷完鏈表都沒有找到合適的分區(qū)分配,則顯示以下信息printf("nSorry,there

9、is not enough memory!n");return head;/返回頭指針struct FBT *callback(struct FBT *head)/回收內(nèi)存子函數(shù)int id;struct FBT *pretail,*tail;printf("please input the process's id:");scanf("%d",&id);pretail=tail=head;while(tail!=NULL)/遍歷鏈表if(tail->processid =id)/如果改分區(qū)所對應(yīng)的進(jìn)程號為要收回分區(qū)的進(jìn)程

10、號,則做以下動作if(tail->next !=NULL)/如果改分區(qū)不是最后一個分區(qū),則做以下動作if(pretail->state =1&&tail->next->state =1 )/前一個分區(qū)是已分配的且后一個分區(qū)也是已分配的tail->state =0;break;if(pretail->state =0&&tail->next->state =1 )/前一個分區(qū)是未分配的且后一個分區(qū)是已分配的pretail->next =tail->next;pretail->size =tail-&

11、gt;size +pretail->size ;free(tail);break;if(pretail->state =1&&tail->next->state =0 )/前一個分區(qū)是已分配的且后一個分區(qū)是未分配的if(pretail!=tail)pretail->next =tail->next ;tail->next ->size =tail->next ->size +tail->size;tail->next ->startdress =tail->startdress ;free(ta

12、il);break;else head=tail->next ;tail->next->startdress =0;tail->next->size +=tail->size;break;if(pretail->state =0&&tail->next->state =0 )/前一個分區(qū)和后一個分區(qū)都是未分配的pretail->next =tail->next->next ;pretail->size =pretail->size +tail->size +tail->next -&

13、gt;size ;free(tail->next);free(tail);break;else/如果改分區(qū)是最后一個分區(qū)則做以下動作if(pretail->state =1)/如果前一個分區(qū)是已分配的tail->state =0;break;else/如果前一個分區(qū)是未分配的pretail->next =NULL;pretail->size=pretail->size +tail->size ;free(tail);break;pretail=tail;tail=tail->next ;/遍歷下一個分區(qū)結(jié)點(diǎn)return head;/返回頭指針vo

14、id print(struct FBT *head)/顯示FBT的內(nèi)容給用戶struct FBT *tail=head;printf("startdresstsizetstatettprocessidtn");tail=head;while(tail!=NULL)if(tail->state=1)printf("%5dtt%5dt%5dtt%5dn",tail->startdress ,tail->size ,tail->state ,tail->processid );elseprintf("%5dtt%5dt%

15、5dn",tail->startdress ,tail->size ,tail->state );tail=tail->next ;void main()/主函數(shù)int choice=1;struct FBT *head;head=create();while(choice!=0)/顯示選擇菜單,供用戶選擇printf("t1.distribute the memoryn");printf("t2.callback the memoryn");printf("t0.exitn");printf("tplease choose:&qu

溫馨提示

  • 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

提交評論