內(nèi)存管理模擬實(shí)驗(yàn)_第1頁
內(nèi)存管理模擬實(shí)驗(yàn)_第2頁
內(nèi)存管理模擬實(shí)驗(yàn)_第3頁
內(nèi)存管理模擬實(shí)驗(yàn)_第4頁
內(nèi)存管理模擬實(shí)驗(yàn)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 1 2022-2-21內(nèi)存管理模擬實(shí)驗(yàn)l要求:設(shè)計(jì)一個(gè)內(nèi)存管理模擬系統(tǒng)并調(diào)試運(yùn)行。l例:可變分區(qū)管理:存儲分配算法采用首次適配算法。用外碎片的處理用“拼接”和“搬遷”技術(shù)。 2 2022-2-21主要數(shù)據(jù)結(jié)構(gòu)l#define NULL 0l#include dos.hl#include mem.hl#include string.hl#include stdio.hl#define total 5000/整個(gè)內(nèi)存的大小l#define setaddress 2000 /用戶區(qū)開始地址l#define min 100/碎片界l#define max 10/最大作業(yè)數(shù) 3 2022-2-21主存

2、分配表MATtypedef struct mat char name10; int address; int length; struct mat *next; struct mat *back;jobptr;jobptr *jobp; 4 2022-2-21自由塊鏈typedef struct freearea int address; int size; struct freearea *next; struct freearea *back;freeptr;freeptr *freep; 5 2022-2-21有關(guān)變量及模塊int totalfree;/總自由空間int jobnumbe

3、r; /作業(yè)數(shù)void initiation(); /初始化代碼int ffallocation(); /分配模塊void showyou(); /顯示當(dāng)前內(nèi)存狀態(tài)void ffcollection(); / 回收void coalesce(); / 碎片處理void menu(); /主菜單程序 6 2022-2-21初始化1.void initiation()2. freep=(freeptr *)malloc(sizeof(freeptr);3. freep-size=total;4. freep-address=setaddress;5. freep-next=NULL;6. free

4、p-back=NULL;7. totalfree=total;8. jobp=NULL;9. jobnumber=0;10.int ffallocation(jl,jn)int jl;/作業(yè)長度char jn10; /作業(yè)名 int ja; freeptr *fp; jobptr *jp,*jp1,*jp2; ja=-1; if (totalfreesizenext; else jobnumber+;totalfree=totalfree-jl;jp2=(jobptr *)malloc(sizeof(jobptr);strcpy(jp2-name,jn);jp2-length=jl;jp2-a

5、ddress=fp-address;ja=jp2-address;if (jobp=NULL) jp2-next=NULL; jp2-back=NULL; jobp=jp2; if (fp-size-jlnext!=NULL)fp-next-back=fp-back; if (fp-back!=NULL)fp-back-next=fp-next; else freep=fp-next;else fp-size=fp-size-jl; fp-address=fp-address+jl; return (ja); else jp=jobp; while (jp != NULL) & (jp

6、2-addressaddress) jp1=jp;jp=jp-next; jp2-next=jp; if (jp=NULL) jp2-back=jp1;jp1-next=jp2; else jp2-back=jp-back; if (jp-back!=NULL) jp1-next=jp2; else jobp=jp2; jp-back=jp2; 9 2022-2-21void showyou()jobptr *jp; system(cls); if (jobnumbername,jp-length,jp-address); jp=jp-next; printf(the total left i

7、s %d byten,totalfree);void ffcollection(jn)char jn10; freeptr *fp,*fp1,*fp2; jobptr *jp; int f; jp=jobp; f=0; while ( (jp!=NULL) & strcmp(jp-name,jn) ) jp=jp-next; if (jp!=NULL) jobnumber-; totalfree=totalfree+jp-length; if (freep=NULL) freep=(freeptr *)malloc(sizeof(freeptr); freep-address=jp-a

8、ddress; freep-size=jp-length; freep-next=NULL; freep-back=NULL; else fp=freep; while ( (fp!=NULL) & (fp-addressaddress) ) fp1=fp;fp=fp-next; if (fp!=NULL) if (fp-next!=NULL) & (fp-next-address=jp-address+jp-length) f=f+1;if (fp-back!=NULL) & (jp-address=fp-address+fp-size) f=f+2; else if

9、 ( jp-address=fp1-address+fp1-size )f=f+2; switch(f) case 0: fp2=(freeptr *)malloc(sizeof(freeptr); fp2-address=jp-address; fp2-size=jp-length; fp2-next=fp; if (fp!=NULL) fp2-back=fp-back; if (fp-back!=NULL) fp1-next=fp2; else freep=fp2; fp-back =fp2; else fp2-back=fp1; fp1-next=fp2; break; case 1:

10、fp-size=fp-size+jp-length; fp-address=jp-address; break; case 2: fp1-size=fp-size+jp-length; break;case 3: fp-size=fp1-size+jp-length+fp-size; fp1-next=fp-next; if(fp-next!=NULL) fp-next-back=fp2; free(fp); break; if (jp=jobp) jobp=jp-next;if (jp-next!=NULL) jp-next-back=jp-back;if (jp-back!=NULL) j

11、p-back-next=jp-next;free(jp); if (!(strcmp(jp-name,jn) printf(cantt find %s,so cant collect %s,jn,jn);void coalesce() freeptr *fp,*fp1; jobptr *jp; int bottom; if (jobnumber0) jp=jobp; bottom=total+setaddress; while (jp!=NULL) jp-address=bottom-jp-length; bottom=bottom-jp-length; jp=jp-next; fp=free

12、p; while (fp!=NULL) fp1=fp; fp=fp-next; free(fp1); freep=(freeptr *)malloc(sizeof(freeptr); freep-size=totalfree; freep-address=setaddress; freep-next=NULL; freep-back=NULL; void menu() char name10; int length,address; int select=0; while (select!=4) system(cls); printf(n); printf( * memory manageme

13、nt program *n); printf(n); printf(n); printf( you can select one of the following:n ); printf(_n); printf( (1) require to be allocate.n); printf( (2) require to collecte the size.n); printf( (3) check the memory.n); printf( (4) quit.n); printf(_n); printf(n); printf(n); printf( which would you selec

14、t ? please inpute 1,2,3,4.n);scanf(%d,&select); while ( (select!=1) & (select!=2) & (select!=3) & (select!=4) ) scanf(%d,&select); switch(select) case 1: if ( jobnumbermax ) printf(the job is too many.n); else printf(enter you job name:n); scanf(%s,name); printf(enter you job length:n); scanf(%d,&length); address=ffallocation(length,name); switch(address) case -1: printf(the momory is full.n);break; case 0: coalesce();ffallocation(length,name);showyou();break; default: showyou();break; getch();break; case 2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論