動(dòng)態(tài)分區(qū)分配存儲(chǔ)管理系統(tǒng)_第1頁
動(dòng)態(tài)分區(qū)分配存儲(chǔ)管理系統(tǒng)_第2頁
動(dòng)態(tài)分區(qū)分配存儲(chǔ)管理系統(tǒng)_第3頁
動(dòng)態(tài)分區(qū)分配存儲(chǔ)管理系統(tǒng)_第4頁
動(dòng)態(tài)分區(qū)分配存儲(chǔ)管理系統(tǒng)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、淮北師范大學(xué)程序設(shè)計(jì)課程設(shè)計(jì)動(dòng)態(tài)分區(qū)分配存儲(chǔ)管理系統(tǒng)學(xué) 院 計(jì)算機(jī)科學(xué)與技術(shù)專 業(yè)學(xué) 號 學(xué) 生 姓 名指導(dǎo)教師姓名2012年3月 15 日一、設(shè)計(jì)目的與內(nèi)容用高級語言編寫和調(diào)試一個(gè)動(dòng)態(tài)分區(qū)內(nèi)存分配程序,演示實(shí)現(xiàn)下列兩種動(dòng)態(tài)分區(qū)分配算法1) 首次適應(yīng)算法2) 循環(huán)首次適應(yīng)算法1. 內(nèi)存中有0-100M 的空間為用戶程序空間,最開始用戶空間是空閑的。2. 作業(yè)數(shù)量、作業(yè)大小、進(jìn)入內(nèi)存時(shí)間、運(yùn)行時(shí)間需要通過界面進(jìn)行輸入。3. 可讀取樣例數(shù)據(jù)(要求存放在外部文件中)進(jìn)行作業(yè)數(shù)量、作業(yè)大小、進(jìn)入內(nèi)存時(shí)間、運(yùn)行時(shí)間的初始化。4. 根據(jù)作業(yè)進(jìn)入內(nèi)存的時(shí)間,采用簡單的先進(jìn)先出原則進(jìn)行從外存到內(nèi)存的調(diào)度,作業(yè)

2、具有等待(從外存進(jìn)入內(nèi)存執(zhí)行)、裝入(在內(nèi)存可執(zhí)行)、結(jié)束(運(yùn)行結(jié)束,退出內(nèi)存)三種狀態(tài)。5. 能夠自動(dòng)進(jìn)行內(nèi)存分配與回收,可根據(jù)需要自動(dòng)進(jìn)行緊湊與拼接操作。二、算法的基本思想1、定義基本結(jié)構(gòu):1作業(yè)結(jié)構(gòu):typedef struct JOBint num; /作業(yè)號int size; /作業(yè)大小int ctime; /作業(yè)進(jìn)入時(shí)間int rtime; /作業(yè)運(yùn)行時(shí)間int state; /作業(yè)狀態(tài)Job;2)分區(qū)結(jié)構(gòu):typedef struct DuLNodeint ID; /分區(qū)號int start; /開始地址int size; /大小int state; /0=尚未使用 1=使用 2

3、=釋放struct DuLNode *prior;/前驅(qū)指針struct DuLNode *next; /后即指針DuLNode, * DuLinkList;2、基本操作:int Firstfit(int);/首次適應(yīng)算法int Next_fit(int); /循環(huán)首次適應(yīng)算法void showJob(int); /顯示作業(yè)表void showPartiton(DuLinkList);/顯示分區(qū)表DuLinkList InitpartitionList(DuLinkList &p);/初始化void huishou(DuLinkList pl3,DuLinkList &pl);

4、/回收函數(shù)int Putin(int &n);/輸入函數(shù),輸入作業(yè)相關(guān)信息3、首次適應(yīng)算法空閑分區(qū)鏈以地址遞增的次序鏈接,分配內(nèi)存時(shí),從鏈?zhǔn)组_始順序查找,直至找到一個(gè)大小能滿足要求的空閑分區(qū)為止;然后再按照作業(yè)的大小,從該分區(qū)中劃出一塊內(nèi)存空間分配給請求者,取消的空閑分區(qū)仍留在空閑鏈中。若從鏈?zhǔn)字敝伶溛捕疾荒苷业揭粋€(gè)能滿足要求的分區(qū),則此次內(nèi)存分配失敗,返回。4、循環(huán)首次適應(yīng)算法在為進(jìn)程分配內(nèi)存空間時(shí),不再是每次都從鏈?zhǔn)组_始查找,而是從上次找到的空閑分區(qū)的下一個(gè)空閑分區(qū)開始查找,直至找到一個(gè)能滿足要求的空閑分區(qū),從中劃出一塊與請求大小相等的內(nèi)存空間分配給作業(yè)。三、主要功能模塊流程圖主函

5、數(shù):首次適應(yīng)算法: 循環(huán)首次適應(yīng)算法四、系統(tǒng)測試程序運(yùn)行實(shí)例如下:1、輸入界面,按要求輸入:2、選擇算法及分區(qū)首地址:3、運(yùn)行結(jié)束后顯示,并繼續(xù)選擇:4、退出:五、結(jié)論作業(yè)采用數(shù)組形式進(jìn)行存儲(chǔ),起初想用數(shù)組模擬分區(qū),但劃分記錄比較不易,時(shí)間空間復(fù)雜度較大,容易混亂,遂決定用鏈表形式模擬分區(qū)情況。基本能運(yùn)行符合要求,能模擬出動(dòng)態(tài)分區(qū)過程及最終結(jié)果。六、源程序及系統(tǒng)文件使用說明#include <stdio.h>#include <stdlib.h>#include <iostream.h>#include <windows.h>#define Fr

6、ee 0#define Use 1#define MAX_length 100 /最大內(nèi)存空間為100MB/-作業(yè)結(jié)構(gòu)體數(shù)組-typedef struct JOBint num; /作業(yè)號 int size; /作業(yè)大小 int ctime; /作業(yè)進(jìn)入時(shí)間 int rtime; /作業(yè)運(yùn)行時(shí)間 int state; /作業(yè)狀態(tài)Job;typedef struct DuLNodeint ID; /分區(qū)號int start; /開始地址 int size; /大小 int state; /0=尚未使用 1=使用 2=釋放 struct DuLNode *prior;/前驅(qū)指針 struct Du

7、LNode *next; /后即指針DuLNode, * DuLinkList;/-int Firstfit(int);/首次適應(yīng)算法int Next_fit(int); /循環(huán)首次適應(yīng)算法void showJob(int); /顯示作業(yè)表void showPartiton(DuLinkList);/顯示分區(qū)表/-/-全局變量-int f;Job *A; /排序前Job *a; /排序后Job *temp;/-功能函數(shù)- void delay()/- /-初始化- DuLinkList InitpartitionList(DuLinkList &p)p=(DuLinkList)mall

8、oc(sizeof(DuLNode);/申請空間 if(!p) exit(0); p->size=100; /初始化大小 printf("輸入分區(qū)首地址:"); scanf("%d",&p->start); p->state=0; /狀態(tài)置空閑 p->ID=0; /分區(qū)號 p->next=NULL; p->prior=NULL; for(int x = 10000;x>0;x-) for(int y = 1000;y>0;y-);return p;/-/-輸入函數(shù)- int Putin(int &a

9、mp;n)int i; Job temp; printf("請輸入任務(wù)數(shù)目:"); scanf("%d",&n); a=(Job*)malloc(n*sizeof(Job); A=(Job*)malloc(n*sizeof(Job); for(i=0;i<n;i+) printf("n"); printf("信息輸入:nn"); printf("作業(yè)號:"); scanf("%d",&ai.num); printf("作業(yè)大小:");

10、 scanf("%d",&ai.size); printf("作業(yè)進(jìn)入時(shí)間:"); scanf("%d",&ai.ctime); printf("作業(yè)運(yùn)行時(shí)間:"); scanf("%d",&ai.rtime); ai.state=0; /默認(rèn)狀態(tài)為Free Ai = ai; for(int j = 0;j < n;j+) for(i = j;i< n;i+) if(aj.ctime > ai.ctime) temp = aj; aj = ai; ai

11、= temp; /冒泡排序 freopen("data.txt","w",stdout); for (i = 0;i < n;i+) printf("%d %d %d %dn",ai.num,ai.size,ai.ctime,ai.rtime); fclose(stdout); freopen("CON","w",stdout); printf("保存成功nn"); return 1;/- /-讀文件- int order(int &n)Job temp; pr

12、intf("Input the number of the task:n"); scanf("%d",&n); a=(Job*)malloc(n*sizeof(Job); freopen("data.txt","r",stdin); for(int i=0;i<n;i+) scanf("%d",&ai.num); scanf("%d",&ai.size); scanf("%d",&ai.ctime); scanf(&q

13、uot;%d",&ai.rtime); fclose(stdin); freopen("CON","r",stdin); for(int j = 0;j < n;j+) for(i = j;i< n;i+) if(aj.ctime > ai.ctime) temp = aj; aj = ai; ai = temp;return 1;/- /-顯示分區(qū)- void showPartition(DuLinkList pl)printf("nttt分區(qū)表n"); printf("t-n"

14、;); printf("t 開始地址t分區(qū)號t大小 狀態(tài) n"); printf("t-n"); while(pl) printf("t %dtt%dt%dt",pl->start,pl->ID,pl->size); if(pl->state = 0) printf("空閑 n"); if(pl->state = 1) printf("已分配 n"); pl=pl->next; printf("t-n");/-/-回收函數(shù)- void hu

15、ishou(DuLinkList pl3,DuLinkList &pl)while(pl3)if(pl3->state=0)if(pl3->next&&pl3->prior&&pl3->prior->state=0&&pl3->next->state=1) pl3->size+=pl3->prior->size; pl3->start=pl3->prior->start; pl3->state=0; pl3->ID=0; if(pl3->pri

16、or->prior) pl3->prior->prior->next=pl3; pl3->prior=pl3->prior->prior; else pl3->prior=pl3->prior->prior; pl=pl3; pl3=pl; else if(pl3->prior&&pl3->next&&pl3->next->state=0&&pl3->prior->state=1) else if(!pl3->prior) if(pl3->

17、next->state=0) pl3->size+=pl3->next->size; pl3->state=0; pl3->ID=0; if(pl3->next->next) else pl3->next->next->prior=pl3; pl3->next=pl3->next->next; pl3->size+=pl3->next->size; pl3->state=0; pl3->ID=0; if(pl3->next->next) pl3->next->

18、;next->prior=pl3; else pl3->next=pl3->next->next; pl3->next=pl3->next->next; pl3->state=0; else if(!pl3->next) if(pl3->prior->state=0) pl3->size+=pl3->prior->size; pl3->state=0; pl3->ID=0; pl3->start=pl->start; if(pl3->prior->prior) pl3->

19、;prior->prior->next=pl3; pl3->prior=pl3->prior->prior; else pl3->state=0; else pl3->prior=NULL; pl=pl3; pl3=pl; else if(pl3->next&&pl3->prior&&pl3->next->state=0&&pl3->prior->state=0) pl3->size=pl3->size+pl3->next->size+pl3-&

20、gt;prior->size; pl3->state=0; pl3->ID=0; pl3->start=pl3->prior->start; if(pl3->next->next) pl3->next->next->prior=pl3; if(pl3->prior->prior) pl3->prior->prior->next=pl3; pl3->next=pl3->next->next; pl3->prior=pl3->prior->prior; else pl

21、3->next=pl3->next->next; pl3->prior=pl3->prior->prior; pl=pl3; pl3=pl; pl3=pl3->next; /- /-首次適應(yīng)算法- void Firstfit(DuLinkList block_first,int n)int t=1; int num=n; while(t&&num) for(int m=0;m<n;m+) if(t=am.ctime+am.rtime) num-=1; am.state=2; while(q) if(q->ID=am.num)

22、 q->state=Free; q=q->next; DuLinkList pl1=block_first,pl2,pl3=block_first; printf("時(shí)鐘:%dn",t); DuLNode *p=block_first; DuLNode *q=block_first; showJob(n); showPartition(block_first); for( m=0;m<n;m+) if(am.ctime=t) am.state=1; printf("作業(yè):%d開始運(yùn)行,對其分配!",am.num); for( m=0;m

23、<n;m+) if(t=am.ctime) while(pl1&&(pl1->state = 1|pl1->size<am.size) pl1=pl1->next; if(pl1) pl2=(DuLinkList)malloc(sizeof(DuLNode); pl2->start=pl1->start+am.size; pl2->state=0; pl2->ID=0; pl2->size=pl1->size-am.size; if(pl2->size>5) else pl1->state=1;

24、 pl1->ID=am.num; pl1->size=am.size; pl1->state=1; pl1->ID=am.num; if(pl1->next) pl1->next->prior=pl2; pl2->next=pl1->next; pl2->prior=pl1; pl1->next=pl2; pl1=block_first; showJob(n); showPartition(block_first); else cout<<"內(nèi)存不足,等待釋放"<<endl; for(

25、int i=m;i<n;i+) ai.ctime+=1; p=block_first; huishou(p, block_first); t+=1;/- /-顯示作業(yè)-void showJob(int n)printf("nttt作業(yè)表:n");printf("t-n"); printf("t 作業(yè)號t大小t進(jìn)入時(shí)間t運(yùn)行時(shí)間t狀態(tài) n"); printf("t-n"); for(int m=0;m<n;m+) printf("t %dt %dt%dt %dt",am.num,am.

26、size,am.ctime,am.rtime); if(am.state = 0) printf(" 等待 n"); if(am.state = 1) printf(" 裝入 n"); if(am.state = 2) printf(" 結(jié)束 n"); printf("t-n");/-/- 循 環(huán) 首 次 適 應(yīng) 算 法 - void Nextfit(DuLinkList block_first,int n)int t=1; int num=n; DuLinkList flag; flag=block_first;

27、 while(t&&num) DuLinkList pl1=block_first,pl2,pl3=block_first; printf("時(shí)鐘:%dn",t); DuLNode *p=block_first; DuLNode *q=block_first; for(int m=0;m<n;m+) if(t=am.ctime+am.rtime) num-=1; am.state=2; while(q) if(q->ID=am.num) q->state=Free; q=q->next; showJob(n); showPartiti

28、on(block_first);for( m=0;m<n;m+) for( m=0;m<n;m+) if(t=am.ctime) while(flag&&(flag->state = 1|flag->size<am.size) flag=flag->next; pl1=flag; if(pl1) else pl2=(DuLinkList)malloc(sizeof(DuLNode); pl2->start=pl1->start+am.size; pl2->state=0; pl2->ID=0; pl2->size

29、=pl1->size-am.size; if(pl2->size>5) else flag=pl2; showJob(n); showPartition(block_first); pl1->state=1; pl1->ID=am.num; pl1->size=am.size; pl1->state=1; pl1->ID=am.num; if(pl1->next) pl1->next->prior=pl2; pl2->next=pl1->next; pl2->prior=pl1; pl1->next=pl2; pl1=block_first; i

溫馨提示

  • 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)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論