實(shí)驗(yàn)四-存儲(chǔ)器管理
《實(shí)驗(yàn)四-存儲(chǔ)器管理》由會(huì)員分享,可在線閱讀,更多相關(guān)《實(shí)驗(yàn)四-存儲(chǔ)器管理(11頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
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、2.0 ③C語言 4.實(shí)驗(yàn)提示 一、數(shù)據(jù)結(jié)構(gòu) 1、自由鏈 內(nèi)存空區(qū)采用自由鏈結(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ū)大小
3、 Addr 作業(yè)區(qū)首地址 二、算法 存儲(chǔ)分配算法采用首次適應(yīng)法,根據(jù)指針freep查找自由鏈,當(dāng)找到第一塊可滿足分配請(qǐng)求的空區(qū)便分配,當(dāng)某空區(qū)被分配后的剩余空閑空間大于所規(guī)定的碎片最小量mini時(shí),則形成一個(gè)較小的空區(qū)留在自由鏈中。 回收時(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)
4、的主要程序模塊包括:分配模塊ffallocation,回收模塊ffcollection,搬家模塊coalesce及命令處理模塊menu,menu用以模擬系統(tǒng)的輸入,通過鍵盤命令選擇進(jìn)行分配模塊、回收模塊、內(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)
5、Check the memory. 檢查當(dāng)前的內(nèi)存情況
(4)Quit. 退出
***********************************
1
Enter your job name:JOB1
Enter your job length:1000
name length(b) addre
JOB1 1000 2000
The total left is 4000 bytes
6.實(shí)驗(yàn)程序
#include
6、
7、obMat * 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; /*目前要分配的
8、作業(yè)的大小 char JobName[10]; int JobAddress; void initiation(){ p_FreeArea=(struct FreeArea *)malloc(sizeof(struct FreeArea)); p_FreeArea->size=TOTALSPACE; p_FreeArea->address=INITADDRESS; p_FreeArea->next=NULL; p_FreeArea->back=NULL; UnusedSpace=TOTALS
9、PACE;
p_JobMat=NULL;
CurrentJobCnt=0;
JobSize=0;
memset(JobName, 0, 10);
JobAddress=0;
}
void ffallocation()
{
struct FreeArea * fp;
struct JobMat *jp;
struct JobMat *jp1;
struct JobMat *jp2;
JobAddress=-1;
if (UnusedSpace 10、y, you input job length is too big ^_^ \n");*/
return;
}
JobAddress=0;
fp=p_FreeArea;
while (fp!=NULL)
if((fp->size) < JobSize)
{
fp=fp->next;
}
else
{
CurrentJobCnt=CurrentJobCnt+1;
UnusedSpace=UnusedSpace-JobSize;
jp2=(struct JobMat *)malloc(sizeof(struct 11、JobMat));
strcpy(jp2->name,JobName);
jp2->length=JobSize;
jp2->address=fp->address;
JobAddress=jp2->address;
if (p_JobMat==NULL)
{
jp2->next=NULL;
jp2->back=NULL;
p_JobMat=jp2;
}
else
{
jp=p_JobMat;
while((jp!=NULL)&&(jp2->address 12、ess))
{
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 p_JobMat=jp2;
jp->back=jp2;
13、 }
}
if (fp->size-JobSize 14、}
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(jp->name, JobName) != 0)
{
jp=jp->next;
}
if (jp!=NULL)
{
CurrentJobCnt=CurrentJobCnt-1;
UnusedSpace=Unus 15、edSpace+jp->length;
if (p_FreeArea==NULL)
{
p_FreeArea=(struct FreeArea *)malloc(sizeof(struct FreeArea));
p_FreeArea->address=jp->address;
p_FreeArea->size=jp->length;
p_FreeArea->next=NULL;
p_FreeArea->back=NULL;
}
else
{
fp=p_FreeArea;
while((fp!=NU 16、LL)&&(fp->address 17、 else if ((jp->address) == (fp1->address+(fp1->size)))
{
f=f+2;
}
switch (f)
{
case 0:
fp2=(struct FreeArea *)malloc(sizeof(struct FreeArea));
fp2->address=jp->address;
fp2->size=jp->length;
fp2->next=fp;
if (fp!=NULL)
{
fp2->bac 18、k=fp->back;
if (fp->back!=NULL) fp1->next=fp2;
else p_FreeArea=fp2;
fp->back=fp2;
}
else
{
fp2->back=fp1;
fp1->next=fp2;
}
break;
case 1:
fp->size=fp->size+jp->length;
fp->address=jp->address;
break;
case 2: 19、
fp1->size=fp1->size+jp->length;
break;
case 3:
fp1->size=fp1->size+jp->length+fp->size;
fp1->next=fp->next;
if (fp->next!=NULL)
{
fp->next->back=fp2;
}
free (fp);
break;
}
}
if (jp==p_JobMat) p_JobMat=jp->next;
if (jp-> 20、next!=NULL) {jp->next->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");
}
else
{
printf("name length(b) addre\n");
jp=p_JobMat;
while (j 21、p!=NULL)
{
printf("%s %d %d\n", jp->name, jp->length,jp->address);
jp=jp->next;
}
}
printf("The total left is %d bytes\n",UnusedSpace);
}
void coalesce()
{
struct FreeArea *fp;
struct FreeArea *fp1;
struct JobMat *jp;
int bottom;
if (CurrentJobCnt>0)
{
22、
jp=p_JobMat;
bottom=TOTALSPACE+INITADDRESS;
while (jp!=NULL)
{
jp->address=bottom-jp->length;
bottom=bottom-jp->length;
jp=jp->next;
}
fp=p_FreeArea;
while(fp!=NULL)
{
fp1=fp;
fp=fp->next;
free(fp1);
}
p_FreeArea=(struct FreeArea *)malloc(sizeof 23、(struct FreeArea));
p_FreeArea->size=UnusedSpace;
p_FreeArea->address=INITADDRESS;
p_FreeArea->next=NULL;
p_FreeArea->back=NULL;
}
}
void menu()
{
int select;
printf("\n\n\n****************MENU***************\n");
printf("You can select one of the following:\n");
printf( 24、"(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(" 25、The job is too many");
}
else
{
printf("Enter your job name:");
}
scanf("%s",JobName);
printf("Enter your job length:");
scanf("%d",&JobSize);
ffallocation();
switch (JobAddress)
{
case -1:
printf("the memory is full");
break;
case 0 26、:
coalesce();
ffallocation();
break;
default:
break;
}
break;
case 2:
printf("Enter the name of job:");
scanf("%s",JobName);
ffcollection();
break;
case 3:
break;
case 4:
exit(1);
break;
default:
printf("You input a wrong number!\n");
break;
}
}
void main()
{
initiation();
while (1)
{
menu();
showyou();
}
}
7.實(shí)驗(yàn)結(jié)果
11
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫(kù)試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫(kù)試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫(kù)試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫(kù)及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫(kù)含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案