實(shí)驗(yàn)四-存儲(chǔ)器管理_第1頁(yè)
實(shí)驗(yàn)四-存儲(chǔ)器管理_第2頁(yè)
實(shí)驗(yàn)四-存儲(chǔ)器管理_第3頁(yè)
實(shí)驗(yàn)四-存儲(chǔ)器管理_第4頁(yè)
實(shí)驗(yàn)四-存儲(chǔ)器管理_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)驗(yàn)四 存儲(chǔ)器管理1、目的與要求 本實(shí)驗(yàn)的目的是讓學(xué)生熟悉存儲(chǔ)器管理的方法,加深對(duì)所學(xué)各種存儲(chǔ)器管理方案的了解;要求采用一些常用的存儲(chǔ)器分配算法,設(shè)計(jì)一個(gè)存儲(chǔ)器管理模擬系統(tǒng),模擬內(nèi)存空間的分配和釋放.2、實(shí)驗(yàn)內(nèi)容設(shè)計(jì)一個(gè)存放空閑塊的自由鏈和一個(gè)內(nèi)存作業(yè)分配表,存放內(nèi)存中已經(jīng)存在的作業(yè).編制一個(gè)按照首次適應(yīng)法分配內(nèi)存的算法,進(jìn)行內(nèi)存分配.同時(shí)設(shè)計(jì)內(nèi)存的回收以及內(nèi)存清理(如果要分配的作業(yè)塊大于任何一個(gè)空閑塊,但小于總的空閑分區(qū),則需要進(jìn)行內(nèi)存的清理,空出大塊的空閑分區(qū))的算法.3實(shí)驗(yàn)環(huán)境PC兼容機(jī)Windows、DOS系統(tǒng)、Turbo c 2.0C語(yǔ)言4實(shí)驗(yàn)提示一、數(shù)據(jù)結(jié)構(gòu)1、自由鏈內(nèi)存空區(qū)采用自

2、由鏈結(jié)構(gòu),鏈?zhǔn)子芍羔榝reep指向,鏈中各空區(qū)按地址遞增次序排列。初啟動(dòng)時(shí)整個(gè)用戶內(nèi)存區(qū)為一個(gè)大空區(qū),每個(gè)空區(qū)首部設(shè)置一個(gè)區(qū)頭(freearea)結(jié)構(gòu),區(qū)頭信息包括:Size 空區(qū)大小Next 前向指針,指向下一個(gè)空區(qū)Back 反向指針,指向上一個(gè)空區(qū)Adderss 本空區(qū)首地址2、內(nèi)存分配表JOBMAT系統(tǒng)設(shè)置一個(gè)MAT,每個(gè)運(yùn)行的作業(yè)都在MAT中占有一個(gè)表目,回收分區(qū)時(shí)清除相應(yīng)表目,表目信息包括:Name 用戶作業(yè)名Length 作業(yè)區(qū)大小Addr 作業(yè)區(qū)首地址二、算法存儲(chǔ)分配算法采用首次適應(yīng)法,根據(jù)指針freep查找自由鏈,當(dāng)找到第一塊可滿足分配請(qǐng)求的空區(qū)便分配,當(dāng)某空區(qū)被分配后的剩余空

3、閑空間大于所規(guī)定的碎片最小量mini時(shí),則形成一個(gè)較小的空區(qū)留在自由鏈中?;厥諘r(shí),根據(jù)MAT將制定分區(qū)鏈入自由鏈,若該分區(qū)有前鄰或后鄰分區(qū),則將他們拼成一個(gè)較大的空區(qū)。當(dāng)某個(gè)分配請(qǐng)求不能被滿足,但此時(shí)系統(tǒng)中所有碎片總?cè)萘繚M足分配請(qǐng)求的容量時(shí),系統(tǒng)立即進(jìn)行內(nèi)存搬家,消除碎片。即將各作業(yè)占用區(qū)集中下移到用戶內(nèi)存區(qū)的下部(高地址部分),形成一片連續(xù)的作業(yè)區(qū),而在用戶內(nèi)存區(qū)的上部形成一塊較大的空閑,然后再進(jìn)行分配。本系統(tǒng)的主要程序模塊包括:分配模塊ffallocation,回收模塊ffcollection,搬家模塊coalesce及命令處理模塊menu,menu用以模擬系統(tǒng)的輸入,通過鍵盤命令選擇進(jìn)行

4、分配模塊、回收模塊、內(nèi)存查詢以及退出的操作.程序運(yùn)行的流程如下圖:5實(shí)驗(yàn)運(yùn)行情況*MENU*You can select one of the following:(1)Require to be allocate. 請(qǐng)分配內(nèi)存(2)Require to collecte the size。 將分配的內(nèi)存回收(3)Check the memory。 檢查當(dāng)前的內(nèi)存情況(4)Quit。 退出*1Enter your job name:JOB1Enter your job length:1000name length(b) addreJOB1 1000 2000The total left is

5、4000 bytes6實(shí)驗(yàn)程序#include stdio。hinclude dos.hinclude stdlib。hinclude conio。hinclude io。h#include ”string。h"#define TOTALSPACE 5000 /*起始空閑空間大小define INITADDRESS 2000 /*起始地址define MINSPACE 100#define MAXJOBCNT 10 / 內(nèi)存中作業(yè)數(shù)量最大值struct JobMat char name10; int address; int length; struct JobMat * next;

6、 struct JobMat * back;;struct FreeArea int address; int size; struct FreeArea * next; struct FreeArea * back;;struct JobMat p_JobMat;struct FreeArea p_FreeArea;int UnusedSpace; /未分配的空閑空間大小int CurrentJobCnt; /目前內(nèi)存中的作業(yè)數(shù)量int JobSize; /目前要分配的作業(yè)的大小char JobName10;int JobAddress; void initiation() p_FreeAr

7、ea=(struct FreeArea )malloc(sizeof(struct FreeArea)); p_FreeArea-size=TOTALSPACE; p_FreeAreaaddress=INITADDRESS; p_FreeAreanext=NULL; p_FreeAreaback=NULL; UnusedSpace=TOTALSPACE; p_JobMat=NULL; CurrentJobCnt=0; JobSize=0; memset(JobName, 0, 10); JobAddress=0;void ffallocation()struct FreeArea * fp;s

8、truct JobMat jp;struct JobMat *jp1;struct JobMat jp2;JobAddress=1;if (UnusedSpaceJobSize)/printf(”Sorry, you input job length is too big _ n”);*/return;JobAddress=0;fp=p_FreeArea;while (fp!=NULL)if(fp>size) < JobSize)fp=fp>next;elseCurrentJobCnt=CurrentJobCnt+1;UnusedSpace=UnusedSpace-JobSi

9、ze;jp2=(struct JobMat *)malloc(sizeof(struct JobMat);strcpy(jp2-name,JobName);jp2-length=JobSize;jp2address=fpaddress;JobAddress=jp2address;if (p_JobMat=NULL)jp2next=NULL;jp2-back=NULL;p_JobMat=jp2;elsejp=p_JobMat;while(jp!=NULL)&&(jp2-addressjpaddress)jp1=jp;jp=jpnext;jp2-next=jp;if (jp=NUL

10、L)jp2back=jp1;jp1next=jp2; elsejp2back=jpback;if (jpback!=NULL) jp1>next=jp2; else p_JobMat=jp2; jpback=jp2; if (fpsizeJobSizeMINSPACE)if (fp-next!=NULL) fp->next->back=fp-back;if (fpback!=NULL) fpbacknext=fp>next;else p_FreeArea=fpnext;elsefpsize=fp>sizeJobSize;fp-address=fpaddress+J

11、obSize;/exit(1);/return;void ffcollection()struct FreeArea fp;struct FreeArea fp1;struct FreeArea fp2;struct JobMat jp;int f;jp=p_JobMat;f=0;while(jp!=NULL) strcmp(jpname, JobName) != 0)jp=jp>next;if (jp!=NULL)CurrentJobCnt=CurrentJobCnt1;UnusedSpace=UnusedSpace+jp>length;if (p_FreeArea=NULL)

12、p_FreeArea=(struct FreeArea )malloc(sizeof(struct FreeArea); p_FreeAreaaddress=jpaddress; p_FreeAreasize=jplength; p_FreeAreanext=NULL; p_FreeAreaback=NULL;elsefp=p_FreeArea;while((fp!=NULL)&(fp-address<jp>address))fp1=fp;fp=fpnext;if (fp!=NULL)if ((fpnext!=NULL)&(fpnext>address=jpa

13、ddress+jplength)f=f+1;if (fpback!=NULL)&(jpaddress=fp1>address+fp1-size)f=f+2;else if ((jp-address) = (fp1address+(fp1size)) f=f+2;switch (f)case 0:fp2=(struct FreeArea )malloc(sizeof(struct FreeArea));fp2address=jpaddress;fp2>size=jp>length;fp2next=fp;if (fp!=NULL)fp2-back=fp-back;if (

14、fpback!=NULL) fp1-next=fp2;else p_FreeArea=fp2;fp-back=fp2;elsefp2-back=fp1;fp1next=fp2;break;case 1:fp-size=fp>size+jp>length;fp->address=jpaddress;break;case 2:fp1size=fp1>size+jplength;break;case 3:fp1size=fp1>size+jp->length+fp-size;fp1-next=fpnext;if (fp>next!=NULL)fp->n

15、ext-back=fp2;free (fp);break;if (jp=p_JobMat) p_JobMat=jpnext;if (jp-next!=NULL) jpnext>back=jp-back;if (jp>back!=NULL) jp-back->next=jp-next;free(jp);void showyou()struct JobMat *jp;/*clrscr();/if (CurrentJobCnt=0)printf(”No job。n");elseprintf("name length(b) addren");jp=p_J

16、obMat;while (jp!=NULL)printf(”s d dn”, jp>name, jplength,jp>address);jp=jp-next;printf("The total left is d bytesn”,UnusedSpace);void coalesce()struct FreeArea fp;struct FreeArea *fp1;struct JobMat *jp;int bottom;if (CurrentJobCnt>0)jp=p_JobMat;bottom=TOTALSPACE+INITADDRESS;while (jp!=

17、NULL)jpaddress=bottom-jp-length;bottom=bottomjplength;jp=jpnext;fp=p_FreeArea;while(fp!=NULL)fp1=fp;fp=fpnext;free(fp1);p_FreeArea=(struct FreeArea )malloc(sizeof(struct FreeArea);p_FreeAreasize=UnusedSpace;p_FreeArea>address=INITADDRESS;p_FreeAreanext=NULL;p_FreeArea-back=NULL;void menu()int sel

18、ect;printf(”nnn*MENU*n”);printf(”You can select one of the following: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”);scanf("%d",&select);switch(select)case 1:if( CurrentJobCnt=MAXJOBCNT)printf(”The job is too many”);elseprintf("Enter your job name:");scanf("%s",JobName);printf("Enter your job length:”);scanf("%d”,&JobSize);ffallocation();switch (JobAddress)case -1:printf("the memory is fu

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論