版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)四 主存空間的分配和回收1. 目的和要求1.1. 實(shí)驗(yàn)?zāi)康挠酶呒?jí)語言完成一個(gè)主存空間的分配和回收程序,以加深對(duì)動(dòng)態(tài)分區(qū)分配方式及其算法的理解。1.2. 實(shí)驗(yàn)要求采用連續(xù)分配方式之動(dòng)態(tài)分區(qū)分配存儲(chǔ)管理,使用首次適應(yīng)算法、最佳適應(yīng)算法2種算法完成設(shè)計(jì)。(1)*設(shè)計(jì)一個(gè)作業(yè)申請(qǐng)隊(duì)列以及作業(yè)完成后的釋放順序,實(shí)現(xiàn)主存的分配和回收。采用分區(qū)說明表進(jìn)行。(2)或在程序運(yùn)行過程,由用戶指定申請(qǐng)與釋放。(3)設(shè)計(jì)一個(gè)空閑區(qū)說明表,以保存某時(shí)刻主存空間占用情況。把空閑區(qū)說明表的變化情況以及各作業(yè)的申請(qǐng)、釋放情況顯示。提示:(1 動(dòng)態(tài)分區(qū)(可變分區(qū)方式)是按作業(yè)需要的主存空間大小來分割分區(qū)的。當(dāng)要
2、裝入一個(gè)作業(yè)時(shí),根據(jù)作業(yè)需要的主存容量查看是否有足夠的空閑空間,若有,則按需分配,否則,作業(yè)無法裝入。假定內(nèi)存大小為256KB,空閑區(qū)說明表格式為:·起始地址指出空閑區(qū)的起始地址;·長(zhǎng)度一個(gè)連續(xù)空閑區(qū)的長(zhǎng)度;·狀態(tài)有兩種狀態(tài),一種是“已分配”狀態(tài);另一種是“空表目”狀態(tài),表示該表項(xiàng)目前沒有使用。(2 采用首次適應(yīng)算法分配回收內(nèi)存空間。運(yùn)行時(shí),輸入一系列分配請(qǐng)求和回收請(qǐng)求。要求能接受來自鍵盤的空間申請(qǐng)及釋放請(qǐng)求,能顯示分區(qū)分配及回收后的內(nèi)存布局情況。2、源程序代碼#include "stdio.h"#include #include
3、#include "iostream.h"#define getjcb(type (type*malloc(sizeof(type#define getsub(type (type*malloc(sizeof(type#define NULL 0int num,num2; /要調(diào)度的作業(yè)數(shù)和要回收的區(qū)域數(shù)int m=0; /已分配作業(yè)數(shù)int flag; /分配成功標(biāo)志int isup,isdown; /回收區(qū)域存在上鄰和下鄰的標(biāo)志int is=0;struct jcbchar name10;char state;int ntime; /所需時(shí)間int size; /所需空
4、間大小int addr; /所分配分區(qū)的首地址struct jcb *link; *ready =NULL, *p,*q,*as=NULL;/作業(yè)隊(duì)列ready,已分配作業(yè)隊(duì)列astypedef struct jcb JCB;struct subarea /分區(qū)塊char name10;int addr; /分區(qū)首地址int size; /分區(qū)大小char state;struct subarea *link; *sub=NULL,*r,*s,*cur;/空閑分區(qū)隊(duì)列sub,當(dāng)前分區(qū)指針curtypedef struct subarea SUB;void sort_sub( /*對(duì)空閑分區(qū)按從
5、小到大排序*/ SUB *first,*second;int insert=0;if(sub=NULL|(s->size<(sub->size /*插在隊(duì)列之首*/s->link=sub;sub=s;elsefirst=sub; /*尋找適當(dāng)?shù)奈恢貌迦?/second=first->link;while(second!=NULLif(s->size<(second->sizes->link=second;first->link=s;second=NULL;insert=1;elsefirst=first->link;second
6、=second->link;if(insert=0first->link=s; /*插在隊(duì)尾*/ void sort_sub( /*對(duì)空閑分區(qū)按從小到大排序*/sort*/JCB *first;if(ready=NULL ready=p;elsefirst=ready;while(first->link!=NULLfirst=first->link;first->link=p;p->link=NULL;void lastsort( /*建立對(duì)已分配作業(yè)隊(duì)列的排列函數(shù),直接插在隊(duì)列之尾sort3*/JCB *fir;if(as=NULL as=q;elsefi
7、r=as;while(fir->link!=NULLfir=fir->link;fir->link=q;q->link=NULL;m+;void input( /* 建立作業(yè)控制塊函數(shù)*/int i;printf("n請(qǐng)輸入要調(diào)度的總作業(yè)數(shù):"scanf("%d",#for(i=0;i printf("n作業(yè)號(hào)No.%d:n",i;p=getjcb(JCB;printf("n輸入作業(yè)名:"scanf("%s",&p->name;printf("n輸
8、入作業(yè)的大小:"scanf("%d",&p->size;printf("n輸入作業(yè)所需運(yùn)行時(shí)間:"scanf("%d",&p->ntime;p->state='w'p->link=NULL;firstsort(; /* 調(diào)用sort函數(shù)*/printf("n 按任一鍵繼續(xù).n"getch(;void input2( /*建立要回收區(qū)域的函數(shù)*/JCB *k;int has;q=getjcb(JCB;printf("n輸入?yún)^(qū)域名(作業(yè)名:&q
9、uot;scanf("%s",&q->name;p=as;while(p!=NULLif(strcmp(p->name,q->name=0 /*在已分配作業(yè)隊(duì)列中尋找*/q->addr=p->addr;q->size=p->size;has=1; /*輸入作業(yè)名存在標(biāo)志位*/if(p=as as=p->link; /*在已分配作業(yè)隊(duì)列中刪除該作業(yè)*/elsek=as;while(k->link!=p k=k->link;k->link=k->link->link; /*刪除*/printf
10、("輸出該作業(yè)首地址:%dn",q->addr;printf("輸出該作業(yè)大小:%dnn",q->size;q->link=NULL;break;elsep=p->link; has=0; /*輸入作業(yè)名不存在標(biāo)志*/if(has=0printf("n輸入作業(yè)名錯(cuò)誤!請(qǐng)重新輸入!n"input2(; void init_sub( /*初始化空閑分區(qū)表*/r=getsub(SUB;strcpy(r->name,"one" r->addr=5; r->size=10; r-&g
11、t;state='n'sub=r;s=getsub(SUB;strcpy(s->name,"two" s->addr=20; s->size=120; s->state='n'sub->link=s;r=s;s=getsub(SUB;strcpy(s->name,"three" s->addr=160; s->size=40; s->state='n' r->link=s;r=s;s=getsub(SUB;strcpy(s->name,&qu
12、ot;four" s->addr=220; s->size=10; s->state='n' r->link=s;r=s;s=getsub(SUB;strcpy(s->name,"five" s->addr=250; s->size=20; s->state='n' r->link=s;void disp( /*空閑分區(qū)表的顯示函數(shù)*/printf("tt 分區(qū) 首地址 長(zhǎng)度 狀態(tài) n"r=sub;while(r!=NULLprintf("tt %s
13、tt%dtt%dtt%cn",r->name,r->addr,r->size,r->state;r=r->link;printf("n"void disp2( /*顯示已分配內(nèi)存的作業(yè)表函數(shù)*/printf("tt 作業(yè)名 首地址 長(zhǎng)度 狀態(tài) n"p=as;while(p!=NULLprintf("tt %stt%dtt%dtt%cn",p->name,p->addr,p->size,p->state;p=p->link;printf("nn"v
14、oid perfit(JCB *pr /*最佳適應(yīng)作業(yè)分區(qū)assign*/SUB *k;r=sub;while(r!=NULLif(r->size>(pr->size&&(r->state='n' /*有空閑分區(qū)大于作業(yè)大小的情況*/pr->addr=r->addr;r->size-=pr->size;r->addr+=pr->size;if(r=sub sub=r->link; /*刪除空閑分區(qū)*/ else s=sub;while(s->link!=r s=s->link;s-&g
15、t;link=s->link->link; /*刪除空閑分區(qū)*/ flag=1; /*分配成功標(biāo)志位置1*/q=pr;lastsort(; /*插入已分配作業(yè)隊(duì)列*/重新插入剩余空閑分區(qū),插在合適位置if(r->size size /* 插入隊(duì)首*/r->link=sub;sub=r;else /*插在適當(dāng)?shù)奈恢?/s=sub;while(s->size<=(r->size s=s->link;k=sub;if(k=s r->link=sub->link; sub=r; /*插在隊(duì)首的后一個(gè)位置*/else /*第二個(gè)以后的位置*/w
16、hile(k->link!=s k=k->link;r->link=s; k->link=r; printf("作業(yè)%s的分區(qū)為%s,首地址為%d.n",p->name,r->name,pr->addr; break; else if(r->size=(pr->size&&(r->state='n' /*有空閑分區(qū)等于作業(yè)大小的情況*/pr->addr=r->addr;flag=1; /*分配成功標(biāo)志位置1*/q=pr;lastsort(; /*插入已分配作業(yè)隊(duì)列*/s=
17、sub; /*空閑分區(qū)已完成分配,應(yīng)刪除*/while(s->link!=r s=s->link;keep an eye on 刪除空閑分區(qū)*/ make a face 做鬼臉 %s 的分區(qū)為 %s, 首地址為 %d.n",p->name,r->name,pr->addr; break;( ) else 著火,開始燃燒 r=r->link; flag=0;with)*/作業(yè)%s長(zhǎng)度過大,內(nèi)存不足,分區(qū)分配出錯(cuò)與 is=1;make fun of void firstfit(JCB *pr /*首次適應(yīng)作業(yè)分區(qū)*/保持鎮(zhèn)靜 SUB *k;in the
18、 world 究竟,到底 lose sbs head 慌亂,倉(cāng)皇失措從空閑表頭開始尋找*/lose heart 喪失勇氣,失去信心 if(r->size>(pr->size&&(r->state='n' /*有空閑分區(qū)大于作業(yè)大小的情況*/take hold of 抓住,得到 pr->addr=r->addr;r->size-=pr->size;r->addr+=pr->size;throwcast light on1*/upon 使人了解,闡明 q=pr; 記住插入已分配作業(yè)隊(duì)列*/have in m
19、ind 考慮到,想到 %smake up ones mind 下定決心,打定主意%d.n",p->name,r->name,pr->addr;bringput into operation 實(shí)施,使生效,使運(yùn)行 else if(r->size=(pr->size&&(r->state='n' /*有空閑分區(qū)等于作業(yè)大小的情況go into operation keep pace (with與()齊步前進(jìn),與()并駕齊驅(qū) lastsort(; /*插入已分配作業(yè)隊(duì)列*/起作用,參與,扮演角色s=sub; /*空閑分區(qū)已
20、完成分配,發(fā)生,進(jìn)行,舉行 take the place of 代替,取代put into practice 實(shí)施,實(shí)行 */make progress 作業(yè)%sgive rise to 引起,導(dǎo)致為的原因 break;make sense elsecatch sight of 發(fā)現(xiàn),突然看見 if(flag=0 /*)printf("take ones time 不著急,不慌忙!n",p->name;keep track of 與保持聯(lián)系lose track of void cyclefit(JCB *pr的聯(lián)系,不能跟上的進(jìn)展 make use of 利用r=cu
21、r; /*put to use 使用 while(r!=NULLgive way 讓路;屈服,讓步;倒塌,坍陷 if(r->size>(pr->size&&(r->state='n' /*有空閑分區(qū)大于作業(yè)大小的情況make way 讓路,騰出地方或位置 pr->addr=r->addr;。名詞詞組的其他形式 r->addr+=pr->size;appeal to 呼吁,懇求 flag=1; /*分配成功標(biāo)志位置1*/attitude to/towards 態(tài)度,看法 a great/good deal of in
22、fluence in 插入已分配作業(yè)隊(duì)列*/printf("作業(yè)%sa lot (of) break;fall in love 愛上(某人)reply to 回答,答復(fù) trolley bus cur=r;q=pr;I。D。 card 身份證 s=sub; /*空閑分區(qū)已完成分配,應(yīng)刪除no doubt while(s->link!=r s=s->link;s->link=s->link->link; /*out of doors 在戶外printf("face to face 面對(duì)面地 a few 有些,幾個(gè) quite a few 不少,相
23、當(dāng)多 a little 一點(diǎn),一些 little by little 逐漸地,一點(diǎn)點(diǎn)地 quite a little 相當(dāng)多,不少 no matter 無論下鄰標(biāo)志位置fair play 公平競(jìng)賽,公平對(duì)待 rest room 廁所,盥洗室 if(s->addr+(s->size=(pr->addr /*有下鄰又有上鄰*/s->size+=pr->size;k=sub;while(k->link!=r k=k->link;k->link=k->link->link;side by side 肩并肩地,一起 break;else 逐步地
24、 s=s->link; isup=0; /*上鄰標(biāo)志位置0*/ all the time once upon a time 從前 once in a while 偶爾 r->size=pr->size;break; else r=r->link; isdown=0; /*下鄰標(biāo)志位置0*/ if(isdown=0 /*區(qū)域無下鄰*/ s=sub; while(s!=NULL if(s->addr+(s->size=(pr->addr /*無下鄰但有上鄰*/ s->size+=pr->size; isup=1; /*上鄰標(biāo)志位置1*/brea
25、k;else s=s->link; isup=0; /*上鄰標(biāo)志位置0*/ if(isup=0 /*無下鄰且無上鄰*/ k=getsub(SUB; /*重新生成一個(gè)新的分區(qū)結(jié)點(diǎn)*/strcpy(k->name,pr->name;k->addr=pr->addr;k->size=pr->size;k->state='n'r=sub;while(r!=NULLif(r->size>(k->size /*按分區(qū)大小排列,回收區(qū)域插在合適的位置*/if(r=sub /*第一個(gè)空閑分區(qū)大于回收區(qū)域的情況*/ k->l
26、ink=r; sub->link=k; elses=sub;while(s->link!=r s=s->link; k->link=r;s->link=k; break; else r=r->link;if(r=NULL /*所有空閑分區(qū)都大于回收區(qū)域的情況*/ s=sub;while(s->link!=NULL s=s->link;s->link=k;k->link=NULL; printf("n區(qū)域%s己回收.",pr->name; void reclfirst(JCB *pr /*首次適應(yīng)與循環(huán)首次適應(yīng)
27、區(qū)域回收*/SUB *k;r=sub;while(r!=NULLif(r->addr=(pr->addr+(pr->size /*回收區(qū)域有下鄰*/pr->size+=r->size;s=sub;isdown=1; /*下鄰標(biāo)志位置1*/while(s!=NULLif(s->addr+(s->size=(pr->addr /*有下鄰又有上鄰*/s->size+=pr->size;k=sub;while(k->link!=r k=k->link;k->link=k->link->link;isup=1; /
28、*上鄰標(biāo)志位置1*/break;elses=s->link; isup=0; /*上鄰標(biāo)志位置0*/ if(isup=0 /*有下鄰無上鄰*/ r->addr=pr->addr;r->size=pr->size;break; else r=r->link; isdown=0; /*下鄰標(biāo)志位置0*/ if(isdown=0 /*區(qū)域無下鄰*/ s=sub;while(s!=NULL if(s->addr+(s->size=(pr->addr /*無下鄰但有上鄰*/s->size+=pr->size; isup=1; /*上鄰標(biāo)志
29、位置1*/break;else s=s->link; isup=0; /*上鄰標(biāo)志位置0*/if(isup=0 /*無下鄰且無上鄰*/ k=getsub(SUB; /*重新生成一個(gè)新的分區(qū)結(jié)點(diǎn)*/strcpy(k->name,pr->name;k->addr=pr->addr;k->size=pr->size;k->state='n'r=sub;while(r!=NULLif(r->addr>(k->addr /*按分區(qū)首地址排列,回收區(qū)域插在合適的位置*/if(r=sub /*第一個(gè)空閑分區(qū)首址大于回收區(qū)域的情
30、況*/ k->link=r; sub->link=k; elses=sub;while(s->link!=r s=s->link; k->link=r;s->link=k;break;else r=r->link;if(r=NULL /*所有空閑分區(qū)的首址都大于回收區(qū)域首址的情況*/s=sub;while(s->link!=NULL s=s->link;s->link=k;k->link=NULL; printf("n區(qū)域%s己回收.",pr->name;void print( /初始化界面printf
31、("nnnn"printf("tt*n"printf("ttt主存空間的分配與回收演示n"printf("tt*nnn"printf("tttt藍(lán)小花n"printf("tttt計(jì)算機(jī)學(xué)院n"printf("tttt軟件4班n"printf("tttt3204007102n"printf("tttt2006年12月n"printf("nnn"printf("ttt按任意鍵進(jìn)入演示&quo
32、t;getch(;system("cls"void init(printf("nnnnttt 1. 顯示空閑分區(qū) n"printf("ttt 2. 分配作業(yè) n"printf("ttt 3. 回收作業(yè) n"printf("ttt 0. 返回菜單 n"printf("ttt請(qǐng)選擇你要的操作:"firstfitf( /首次適應(yīng)算法init(;switch(getchar(case '1':system("cls"disp(;getch(;sys
33、tem("cls"firstfitf(;break;case '2':system("cls"system("cls"input(;printf("n"while(num!=0p=ready;ready=p->link;p->link=NULL;firstfit(p;num-;getch(;printf("ntt 完成分配后的空閑分區(qū)表 n"disp(;printf("ntt 已分配作業(yè)表 n"disp2(;if(is=0printf("
34、n 全部作業(yè)已經(jīng)被分配內(nèi)存."else printf("n 作業(yè)沒有全部被分配內(nèi)存.n"getch(;system("cls"firstfitf(;break;case '3':system("cls"disp2(;printf("nn按任意鍵進(jìn)行區(qū)域回收."printf("n"while(as!=NULLgetch(;input2(;printf("按任意鍵繼續(xù)."getch(;printf("n"reclfirst(q;get
35、ch(;printf("ntt 回收后的空閑分區(qū)表 n"disp(;printf("ntt 已分配作業(yè)表 n"disp2(;printf("n繼續(xù)回收.(Enter"printf("n所有已分配作業(yè)已完成!"printf("nPress any key to return."getch(;system("cls"firstfitf(;break;case '0':break;default:getch(;system("cls"firstf
36、itf(;break;cyclefirstf( /循環(huán)首次適應(yīng)算法init(;switch(getchar(case '1':system("cls"disp(;getch(;system("cls"cyclefirstf(;break;case '2':system("cls"cur=sub;input(;printf("n"while(num!=0p=ready;ready=p->link;p->link=NULL;cyclefit(p;num-;getch(;pri
37、ntf("ntt 完成分配后的空閑分區(qū)表 n"disp(;printf("ntt 已分配作業(yè)表 n"disp2(;if(is=0printf("n 全部作業(yè)已經(jīng)被分配內(nèi)存."else printf("n 作業(yè)沒有全部被分配內(nèi)存.n" getch(;system("cls"cyclefirstf(;break;case '3':system("cls"disp2(;printf("nn按任意鍵進(jìn)行區(qū)域回收."while(as!=NULLget
38、ch(;printf("n"input2(;printf("按任意鍵繼續(xù)."getch(;printf("n"reclfirst(q;getch(;printf("ntt 回收后的空閑分區(qū)表 n"disp(;printf("ntt 已分配作業(yè)表 n"disp2(;printf("n繼續(xù)回收.(Enter"printf("n所有已分配作業(yè)已完成!"getch(;system("cls"cyclefirstf(;break;case
39、9;0':break;default:getch(;system("cls"cyclefirstf(;break;perfitf( /最佳適應(yīng)算法init(;switch(getchar(case '1':system("cls"less_to_more(;disp(;getch(;system("cls"perfitf(;break;case '2':system("cls"cur=sub;input(;printf("n"while(num!=0p=r
40、eady;ready=p->link;p->link=NULL;less_to_more(; /*重新排列分區(qū),按從小到大排列*/perfit(p;num-;getch(;printf("nntt 完成分配后分區(qū)表(分區(qū)按由小到達(dá)排列 n"disp(;printf("ntt 已分配作業(yè)表 n"disp2(;if(is=0printf("n 全部作業(yè)已經(jīng)被分配內(nèi)存."else printf("n 作業(yè)沒有全部被分配內(nèi)存.n"getch(;system("cls"perfitf(;bre
41、ak;case '3':system("cls"disp2(;printf("nn按任意鍵進(jìn)行區(qū)域回收."while(as!=NULLgetch(;printf("n"input2(;printf("按任意鍵繼續(xù)."getch(;printf("n"reclperfit(q;getch(;printf("ntt 回收后的空閑分區(qū)表 n"disp(;printf("ntt 已分配作業(yè)表 n"disp2(;printf("n繼續(xù)回收.(Enter"printf("n所有已分配作業(yè)已完
溫馨提示
- 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. 人人文庫(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 包頭2025年內(nèi)蒙古包頭鐵道職業(yè)技術(shù)學(xué)院赴鐵路院校招聘急需專業(yè)教師28人筆試歷年參考題庫(kù)附帶答案詳解
- 云浮廣東云浮郁南縣產(chǎn)業(yè)園區(qū)工會(huì)聯(lián)合會(huì)招聘社會(huì)化工會(huì)工作者筆試歷年參考題庫(kù)附帶答案詳解
- 樂山2025上半年四川樂山市招聘事業(yè)單位工作人員854人筆試歷年參考題庫(kù)附帶答案詳解
- 房產(chǎn)銷售員培訓(xùn)教程課件
- 艾滋病病人治療培訓(xùn)課件
- 評(píng)估指南培訓(xùn)
- 護(hù)理評(píng)估與溝通技巧
- 設(shè)計(jì)院培訓(xùn)課件
- 消防維修技術(shù)培訓(xùn)課件
- 孩子不能參加軍訓(xùn)請(qǐng)假條
- 人工智能整合多組學(xué)數(shù)據(jù)優(yōu)化糖尿病診療
- 舒百寧納豆紅曲膠囊課件
- 2026年張家界航空工業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試必刷測(cè)試卷附答案
- 新版二年級(jí)道德與法治《我們都是中國(guó)人》教學(xué)設(shè)計(jì)(2課時(shí))
- XX企業(yè)核心優(yōu)勢(shì)與戰(zhàn)略發(fā)展
- 2025年中國(guó)低氘水行業(yè)市場(chǎng)全景分析及前景機(jī)遇研判報(bào)告
- 管道區(qū)段長(zhǎng)管理辦法
- 2025年江西公務(wù)員考試(財(cái)經(jīng)管理)測(cè)試題及答案
- CRT-YS4690消防控制室圖形顯示裝置使用說明書-營(yíng)口賽福德
- 植筋工程施工驗(yàn)收記錄表范例
- 2025至2030年中國(guó)冷凍食品行業(yè)市場(chǎng)調(diào)研及行業(yè)投資策略研究報(bào)告
評(píng)論
0/150
提交評(píng)論