版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、內(nèi)存的動(dòng)態(tài)存儲(chǔ)管理一、實(shí)驗(yàn)內(nèi)容編寫程序?qū)崿F(xiàn)動(dòng)態(tài)分區(qū)存儲(chǔ)管理方式的主存分配與回收。具體內(nèi)容包括:首先確定主存空間分配表;然后采用最先適應(yīng)算法完成主存空間的分配與回收;最后編寫主函數(shù)對(duì)所做工作進(jìn)行測試二、實(shí)驗(yàn)原理模擬存儲(chǔ)管理中內(nèi)存空間的管理和分配內(nèi)存空間的管理分為固定分區(qū)管理方式,可變分區(qū)管理方式,頁式存儲(chǔ)管理,段式存儲(chǔ)管理。題目:模擬內(nèi)存分配與回收三、實(shí)驗(yàn)步驟(或過程)在MicrosoftVisualC+6.0環(huán)境下運(yùn)行1 設(shè)計(jì)一個(gè)空閑分區(qū)表,空閑分區(qū)表通過空閑分區(qū)鏈表來管理,在進(jìn)行內(nèi)存分配時(shí),系統(tǒng)優(yōu)先使用空閑分區(qū)低端的空間。 2 設(shè)計(jì)一個(gè)內(nèi)存分區(qū)表,可用鏈表管理,用以表示當(dāng)前以內(nèi)存使用情況。
2、3 設(shè)計(jì)一個(gè)進(jìn)程申請(qǐng)隊(duì)列以及進(jìn)程完成后的釋放順序,實(shí)現(xiàn)主存的分配和回收。 4 要求每次分配和回收后把空閑分區(qū)的變化情況以及各進(jìn)程的申請(qǐng)、釋放情況以及各進(jìn)程的申請(qǐng)、釋放情況以圖形方式顯示、打印出來。最佳適應(yīng)算法:該算法總是把滿足要求、又是最小的空閑區(qū)分配給作業(yè)。檢查空閑區(qū)說明表是否有滿足作業(yè)要求的空閑區(qū),也分為三種情況:大于,等于,小于。若檢查到有“等于”的情況,就可以直接分配,若沒有,則繼續(xù)檢查是否有“大于”的情況代碼實(shí)現(xiàn)如下:#include #include #include #define n 64 /定義內(nèi)存的大小int an,count=0;/數(shù)組a用來保存內(nèi)存使用狀況1為已分配0為
3、未分配,count用來記name數(shù)組中元素個(gè)數(shù)char namen;/已分配內(nèi)存的名稱(字符類型)typedef struct linknode char pid; int start; int length; struct linknode *left,*right;de_node; /進(jìn)程節(jié)點(diǎn)結(jié)構(gòu)體定義/head1表示未分配內(nèi)存隊(duì)列頭指針,head2便是已分配進(jìn)程隊(duì)列頭指針de_node *head1,*head2=NULL;struct linknode* creat()/創(chuàng)建一個(gè)進(jìn)程節(jié)點(diǎn) int len,flag1=1;/用于表示進(jìn)程是否可以創(chuàng)建 char id; struct lin
4、knode* p; p = (de_node *)malloc(sizeof(de_node);/試圖在系統(tǒng)內(nèi)存中開辟空間創(chuàng)建一個(gè)進(jìn)程 if (p=NULL) /p為空,說明系統(tǒng)沒有可用內(nèi)存用于創(chuàng)建此模擬進(jìn)程 printf(系統(tǒng)沒有足夠的內(nèi)存可供使用!n);/輸出return(NULL);/返回空指針 printf(請(qǐng)輸入進(jìn)程id(字符類型)和長度:);/為進(jìn)程輸入id和分配的長度 scanf(%c %d,&id,&len); fflush(stdin);/清除輸入緩存 if(id=a&id=A&id0) for(int i=0;ipid=id; /id p-start=0; /初始開始內(nèi)存位
5、置,在以后會(huì)修改 p-length=len;/長度 p-left=NULL;/左指針 p-right=NULL;/右指針 namecount+=id;/將id存入數(shù)組,count自加 return(p); /返回創(chuàng)建的進(jìn)程的地址 else printf(輸入進(jìn)程格式有誤n); free(p); return (NULL); /分配內(nèi)存空間void distribute(de_node *p) de_node *q=head1,*temp; int flag=0; do/do_while循法/判斷當(dāng)前指向的內(nèi)存空間的長度是否滿足p所申請(qǐng)的長度,大于就分配 if(q-length=p-length
6、) p-start=q-start;/把進(jìn)程的內(nèi)存開始地址指向內(nèi)存的可用開始地址處 q-start+=p-length;/可用地址起始改變 q-length-=p-length;/可用內(nèi)存長度修改 for(int i=p-start;istart+p-length;i+)/將已分配的內(nèi)存空間全部置1 ai=1; flag=1;/表示內(nèi)存可分配 /隊(duì)列不止一個(gè)進(jìn)程,第一個(gè)滿足條件,并且剛好分配完,修改指針指向 if(q-length=0&q-right!=q) if(q=head1)/如果第一個(gè)滿足,修改頭指針指向 head1=q-right; q-left-right=q-right; q-r
7、ight-left=q-left; free(q);/把這個(gè)已分配完的空間指針釋放 if(flag=1)/已做完處理直接跳出循環(huán) break; if(flag=0)/當(dāng)前指向的內(nèi)存不滿足,指向下一個(gè),繼續(xù)判斷是否滿足 q=q-right; while(q!=head1);/搜索一遍可用內(nèi)存序列 if(flag=0)/沒有可用的內(nèi)存 printf(沒有滿足的內(nèi)存!n); count-;/由于創(chuàng)建時(shí)加1,但在分配內(nèi)存時(shí)失敗,把1又減掉 free(p);/把這個(gè)未分配到內(nèi)存的進(jìn)程釋放 if(flag=1)/表示上面已分配好內(nèi)存,并已修改內(nèi)存鏈表,下面修改已分配內(nèi)存的進(jìn)程隊(duì)列 temp=head2;/
8、把已分配內(nèi)存的進(jìn)程隊(duì)列賦值給臨時(shí)指針 if(temp=NULL)/如果還還沒有存在的任何的進(jìn)程,說明當(dāng)前是第一個(gè) head2=p;/讓頭指針指向第一個(gè)進(jìn)程 p-left=p;/雙向隊(duì)列第一個(gè)左右指針都指向自己 p-right=p;/雙向隊(duì)列第一個(gè)左右指針都指向自己 else if(temp!=NULL)/已存在隊(duì)列,把當(dāng)前直接鏈到第一個(gè),與上面的區(qū)別是指針指向 head2=p;/讓頭指針指向p指向的進(jìn)程 p-left=temp-left;/p進(jìn)程左邊為原來第一個(gè)的左邊 p-right=temp;/p進(jìn)程右邊指向第一個(gè) temp-left-right=p;/原來第一個(gè)的左邊為p temp-lef
9、t=p;/原來第一個(gè)的左邊的進(jìn)程為p /對(duì)進(jìn)程的回收void reclaim() char id; int flag=0; de_node *q=head2,*p=head1; if(head2=NULL)/表示當(dāng)前沒有進(jìn)程 printf(已沒有進(jìn)程!n); else /已分配內(nèi)存隊(duì)列如果不為空printf(輸入要回收的進(jìn)程id:);/輸入要回收進(jìn)程的idscanf(%c,&id);fflush(stdin);for(int i=0;icount;i+)/雙重循環(huán)把要回收的進(jìn)程找出來,并把記錄的id去掉 if(namei=id)/判斷當(dāng)前的進(jìn)程是否滿足要求for(int j=i;jpid=id
10、&q-right=q&head2=q) head2=NULL;/把已分配隊(duì)列直接置空flag=1;/表示找到滿足條件的進(jìn)程 if(flag=0)/上面的都沒找到 do if(q-pid=id)/如果找到 if(q=head2) head2=q-right; q-left-right=q-right;/修改指針指向 q-right-left=q-left;flag=1;break;else q=q-right;while(q!=head2); /如果找到或是遍歷一遍結(jié)束 if(flag=0) printf(沒有此進(jìn)程號(hào)!n);/沒有找到滿足的進(jìn)程if(flag=1)/表示找到了for(int i
11、=q-start;istart+q-length;i+)/釋放占有的內(nèi)存ai=0;/接下來修改可用內(nèi)存的隊(duì)列,while(q-startp-start&p-right!=head1)/從第一個(gè)開始找到回收回來的內(nèi)存開始地址大的那個(gè)隊(duì)列 p=p-right; if(p=head1)/表示比第一個(gè)的開始還小,那么就要修改頭地址head1=q;/其他情況不用修改頭地址,只需找到應(yīng)該的位置,把此進(jìn)程插進(jìn)去 q-left=p-left;/修改指針的指向 q-right=p; p-left-right=q; p-left=q; if(q-start+q-length=p-start)/可以與后面合并的情況
12、 q-length+=p-length;/修改指針的指向 p-right-left=q; q-right=p-right;free(p); if(q-left-start+q-left-length=q-start)/可以與前面合并的情況 q-left-length+=q-length;/修改指針的指向 q-left-right=q-right; q-right-left=q-left;free(q); /打印輸出 void print() de_node *q=head2,*p=head1;if(count=0)printf(沒有進(jìn)程占有內(nèi)存。n);else printf(輸出進(jìn)程id號(hào):n
13、);for(int i=0;icount;i+) printf(%ct,namei);printf(n);printf(輸出內(nèi)存當(dāng)前使用情況:n);for(int j=0;jpid,p-start,p-length);p=p-right; while(p!=head1);printf(n);printf(已分配進(jìn)程隊(duì)列:n);do /已分配進(jìn)程隊(duì)列 if(q!=NULL) printf(進(jìn)程id:%c 開始地址:%d 長度%dn,q-pid,q-start,q-length); q=q-right;while(q!=head2); /主函數(shù)void main() int x;de_node *
14、point,*p1;/創(chuàng)建內(nèi)存的初始狀態(tài) point=(struct linknode*)malloc(sizeof(struct linknode); head1=point; point-pid=i; point-start=0; point-length=n; head1-left=point; head1-right=point; print(); while(1) printf( -MENU-n); printf(1-distribute(分配)n); printf(2-reclaim(回收)n); printf(3-view (瀏覽)n); printf(4-exit(退出)n); printf(請(qǐng)輸入上面的選項(xiàng)(1-4):n); scanf(%d,&x); fflush(stdin); switch(x)case 1: p1=creat(); if(p1=NULL) printf(創(chuàng)建進(jìn)程失敗。n);else distribute(p1); x=0; break;case 2: reclaim(); x=0;break; case 3: print(); x=0;break; case 4: printf(Thanks;Bye-bye!);exit(0); x=0;break;default:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 童話館管理制度及流程(3篇)
- 船舶建造技術(shù)管理制度(3篇)
- 2026年及未來5年市場數(shù)據(jù)中國外墻保溫材料行業(yè)市場競爭格局及發(fā)展趨勢預(yù)測報(bào)告
- 《GA 563-2009警服 春秋執(zhí)勤服》專題研究報(bào)告
- 《GAT 760.4-2008公安信息化標(biāo)準(zhǔn)管理分類與代碼 第4部分:法律文件代碼》專題研究報(bào)告:深度與前瞻應(yīng)用
- 兼職救護(hù)隊(duì)培訓(xùn)課件
- 兼職培訓(xùn)師培訓(xùn)
- 2026年及未來5年市場數(shù)據(jù)中國報(bào)廢船舶行業(yè)市場運(yùn)行態(tài)勢與投資戰(zhàn)略咨詢報(bào)告
- 信息保密制度
- 企業(yè)員工獎(jiǎng)懲與激勵(lì)制度
- 石子廠規(guī)范管理制度
- 大數(shù)據(jù)驅(qū)動(dòng)下的塵肺病發(fā)病趨勢預(yù)測模型
- 成都2025年四川成都市新津區(qū)招聘衛(wèi)生專業(yè)技術(shù)人才21人筆試歷年參考題庫附帶答案詳解
- 2026屆廣東省高考英語聽說考試備考技巧講義
- 炎德英才大聯(lián)考雅禮中學(xué)2026屆高三月考試卷英語(五)(含答案)
- 2026年經(jīng)營人員安全生產(chǎn)責(zé)任制范文
- T-CEPPEA 5002-2019 電力建設(shè)項(xiàng)目工程總承包管理規(guī)范
- 暫緩行政拘留申請(qǐng)書
- 示波器說明書
- 談心談話記錄100條范文(6篇)
- 微電影投資合作協(xié)議書
評(píng)論
0/150
提交評(píng)論