計(jì)算機(jī)操作系統(tǒng)內(nèi)存分配實(shí)驗(yàn)源代碼_第1頁
計(jì)算機(jī)操作系統(tǒng)內(nèi)存分配實(shí)驗(yàn)源代碼_第2頁
計(jì)算機(jī)操作系統(tǒng)內(nèi)存分配實(shí)驗(yàn)源代碼_第3頁
計(jì)算機(jī)操作系統(tǒng)內(nèi)存分配實(shí)驗(yàn)源代碼_第4頁
計(jì)算機(jī)操作系統(tǒng)內(nèi)存分配實(shí)驗(yàn)源代碼_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、#include<stdio.h>#include<stdlib.h>#define OK 1 / 完成#define ERROR 0 / 出錯(cuò)typedef int Status;typedef struct free_table/定義一個(gè)空閑區(qū)說明表結(jié)構(gòu)int num; 分區(qū)序號(hào)long address; 起始地址long length; / 分區(qū)大小int state; /分區(qū)狀態(tài)ElemType;線性表的雙向鏈表存儲(chǔ)結(jié)構(gòu)前趨指針后繼指針typedef struct Node/ElemType data;struct Node *prior; /struct No

2、de *next; / Node,*LinkList;LinkList first; / 頭結(jié)點(diǎn)LinkList end; / 尾結(jié)點(diǎn)int flag;/記錄要?jiǎng)h除的分區(qū)序號(hào)Status Initblock()/開創(chuàng)帶頭結(jié)點(diǎn)的內(nèi)存空間鏈表first=(LinkList)malloc(sizeof(Node);end=(LinkList)malloc(sizeof(Node);first->prior=NULL;first->next=end;end->prior=first;end->next=NULL;end->data.num=1;end->data.a

3、ddress=40;end->data.length=600;end->data.state=0; return OK; void sort()分區(qū)序號(hào)重新排序Node *p=first->next,*q;q=p->next;for(;p!=NULL;p=p->next)for(q=p->next;q;q=q->next)if(p->data.num>=q->data.num)q->data.num+=1;/顯示主存分配情況void show() int flag=0;/用來記錄分區(qū)序號(hào)Node *p=first;p->d

4、ata.num=0;p->data.address=0; p->data.length=40; p->data.state=1;sort();printf("ntt»主存空間分配情況n");printf( "*nn");printf("分區(qū)序號(hào)t起始地址t分區(qū)大小t分區(qū)狀態(tài)nn");while(p)printf("%dtt%dtt%d",p->data.num,p->data.address,p->data.length);if(p->data.state=0)

5、printf("tt空閑 n'n");else printf("tt p=p->next;已分配nn");printf( "*nn");/首次適應(yīng)算法Status First_fit(int request)/為申請作業(yè)開辟新空間且初始化Node *p=first->next;LinkList temp=(LinkList)malloc(sizeof(Node);temp->data.length=request;temp->data.state=1;p->data.num=1;while(p)i

6、f(p->data.state=0)&&(p->data.length=request)/有大小恰好合適的空閑塊p->data.state=1;return OK;break;else if(p->data.state=0) && (p->data.length>request)/有空閑塊能滿足需求且有剩余temp->prior=p->prior;temp->next=p;temp->data.address=p->data.address;temp->data.num=p->data

7、.num;p->prior->next=temp;p->prior=temp;p->data.address=temp->data.address+temp->data.length;p->data.length-=request;p->data.num+=1;return OK;break;p=p->next;return ERROR;/最佳適應(yīng)算法Status Best_fit(int request)int ch; /記錄最小剩余空間Node *p=first;Node *q=NULL; 記錄最佳插入位置LinkList temp=(

8、LinkList)malloc(sizeof(Node);temp->data.length=request;temp->data.state=1;p->data.num=1;while(p) /初始化最小空間和最佳位置if(p->data.state=0) && (p->data.length>=request)if(q=NULL) q=p;ch=p->data.length-request;else if(q->data.length > p->data.length)q=p;ch=p->data.lengt

9、h-request;p=p->next;if(q=NULL) return ERROR;/ 沒有找到空閑塊 else if(q->data.length=request) q->data.state=1;return OK; else temp->prior=q->prior;temp->next=q;temp->data.address=q->data.address;temp->data.num=q->data.num;q->prior->next=temp;q->prior=temp;q->data.ad

10、dress+=request;q->data.length=ch;q->data.num+=1;return OK;return OK;/最差適應(yīng)算法Status Worst_fit(int request)int ch; / 記錄最大剩余空間Node *p=first->next;Node *q=NULL; 記錄最佳插入位置LinkList temp=(LinkList)malloc(sizeof(Node);temp->data.length=request;temp->data.state=1;p->data.num=1;while(p) /初始化最大

11、空間和最佳位置if(p->data.state=0 && (p->data.length>=request) if(q=NULL) q=p;ch=p->data.length-request; else if(q->data.length < p->data.length) q=p;ch=p->data.length-request; p=p->next;if(q=NULL) return ERROR;/沒有找到空閑塊else if(q->data.length=request) q->data.length=1

12、;return OK; else temp->prior=q->prior;temp->next=q;temp->data.address=q->data.address;temp->data.num=q->data.num;q->prior->next=temp;q->prior=temp;q->data.address+=request;q->data.length=ch;q->data.num+=1;return OK; return OK;/分配主存Status allocation(int a)int re

13、quest;/ 申請內(nèi)存大小printf("請輸入申請分配的主存大小(單位:KB):");scanf("%d",&request);if(request<0 |request=0)printf("分配大小不合適,請重試!");return ERROR;switch(a)case 1: /默認(rèn)首次適應(yīng)算法if(First_fit(request)=OK) printf("t*else printf("t*內(nèi)存不足,分配失敗!return OK;break;case 2: 選擇最佳適應(yīng)算法if(Best_

14、fit(request)=OK) printf("t*else printf("t*內(nèi)存不足,分配失敗!return OK;break;case 3: /選擇最差適應(yīng)算法if(Worst_fit(request)=OK) printf("t*else printf("t*內(nèi)存不足,分配失敗!return OK;break;分配成功!*");*");分配成功! *");* 分配成功!*");* Status deal1(Node *p)/ 處理回收空間 Node *q=first;for(;q!=NULL;q=q-&

15、gt;next) if(q=p) if(q->prior->data.state=0&&q->next->data.state!=0) q->prior->data.length+=q->data.length; q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag-1;if(q->prior->data.state!=0&&q-

16、>next->data.state=0) q->data.length+=q->next->data.length;q->next=q->next->next;q->next->next->prior=q;q->data.state=0;q->data.num=flag;)if(q->prior->data.state=0&&q->next->data.state=0)q->prior->data.length+=q->data.length;q->pr

17、ior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag-1;)if(q->prior->data.state!=0&&q->next->data.state!=0)q->data.state=0;)return OK;)Status deal2(Node *p)/ 處理回收空間Node *q=first;for(;q!=NULL;q=q->next)if(q=p)if(q->

18、prior->data.state=0&&q->next->data.state!=0)q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=p->prior;q->data.state=0;q->data.num=flag-1;)if(q->prior->data.state!=0&&q->next->data.state=0)q

19、->data.state=0;)if(q->prior->data.state=0&&q->next->data.state=0)q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag-1; if(q->prior->data.state!=0&&q-

20、>next->data.state!=0)q->data.state=0; return OK;/主存回收Status recovery(int flag) Node *p=first;for(;p!=NULL;p=p->next) if(p->data.num=flag)if(p->prior=first)if(p->next!=end)/ 當(dāng)前P指向的下一個(gè)不是最后一個(gè)時(shí) if(p->next->data.state=0) /與后面的空閑塊相連p->data.length+=p->next->data.length;p

21、->next->next->prior=p;p->next=p->next->next;p->data.state=0;p->data.num=flag; else p->data.state=0;if(p->next=end)/ 當(dāng)前P指向的下一個(gè)是最后一個(gè)時(shí) p->data.state=0; / 結(jié)束 if(p->prior=block_first) 的情況else if(p->prior!=first)if(p->next!=end)deal1(p);elsedeal2(p);/ 結(jié)束 if(p->

22、prior!=block_first)的情況/ 結(jié)束 if(p->data.num=flag) 的情況printf("t* return OK;/主函數(shù)void main()int i; /回收成功*");操作選擇標(biāo)記算法選擇標(biāo)記printf("*printf("ttprintf("t(1)用以下三種方法實(shí)現(xiàn)主存空間的分配*n");n");首次適應(yīng)算法t(2)最佳適應(yīng)算法t(3)最差適應(yīng)算法n");printf("*n");printf("n");printf(&quo

23、t;請輸入所使用的內(nèi)存分配算法:");scanf("%d",&a);while(a<1|a>3)printf("輸入錯(cuò)誤,請重新輸入所使用的內(nèi)存分配算法:n");scanf("%d",&a);switch(a)case 1:printf("nt*case 2:printf("nt* case 3:printf("nt*Initblock(); while(1) show();,*,*開創(chuàng)空間表使用首次適應(yīng)算法:使用最佳適應(yīng)算法:使用最壞適應(yīng)算法:*n");b

24、reak;*n");break;*n");break;int a;/printf("t1:分配內(nèi)存t2: 回收內(nèi)存t0: 退出n");printf("請輸入您的操作:");scanf("%d",&i);if(i=1) allocation(a); /else if(i=2) /printf("分配內(nèi)存 內(nèi)存回收請輸入您要釋放的分區(qū)號(hào):");scanf("%d",&flag); recovery(flag);else if(i=0)printf("n

25、退出程序 n");break; 退出else /printf("continue;輸入操作有誤輸入有誤,請重試!”);執(zhí)行結(jié)果和結(jié)果分析初始化首次適應(yīng)算法:睛輸入所使用的內(nèi)存分配算法ri*使用首次適應(yīng)算法:*«主存空間分配情況分區(qū)序號(hào)起始地址分區(qū)大小分區(qū)狀態(tài)a040已分配140600空閑0 :退出當(dāng)作業(yè)1、2、3順利分配內(nèi)存空間后:1;方那內(nèi)存2:回收內(nèi)存的操信1清分配的主任大小單位工KBf酶 配成功! *至存空間分配情況XKXMEKNMEJtKMEmaiEm 魏 X<aiEmaX<M:J<<>EX<>E<J<W:X3<>EXa<3*X3<>tX3XiWiM 箕:MXatXXJE分區(qū)序號(hào)起始地址分區(qū)大小分區(qū)狀態(tài)R040已分配140130已分配217060已分配3230100已分配433U310空閑XKMMEKXMEXMMEXXMEXMMEXMXMXXKXXJOEXXaCXXXXXatXXJEXiMaCXiMitNiMJfXWXiMJfXiMJE回收序號(hào)2里面的內(nèi)存:1:分配內(nèi)存2=回收內(nèi)存麟I舞iU、區(qū)號(hào).20:退出王存空間分配情況M:MXM:KX>C:MKl>EX>C>EKlE>

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論