c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)
生活随笔
收集整理的這篇文章主要介紹了
c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#include<bits/stdc++.h>
using namespace std;
/*定義內(nèi)存的大小為100*/
#define MEMSIZE 100
/*如果小于此值,將不再分割內(nèi)存*/
#define MINSIZE 2/*內(nèi)存分區(qū)空間表結(jié)構(gòu)*/
typedef struct _MemoryInfomation
{/*起始地址*/int start;/*大小*/int Size;/*狀態(tài) F:空閑(Free) U:占用(Used) E 結(jié)束(End)*/char status;
} MEMINFO;/*內(nèi)存空間信息表*/
MEMINFO MemList[MEMSIZE];/*顯示內(nèi)存狀態(tài)*/
void Display()
{int i,used=0;//記錄可以使用的總空間量printf("\n---------------------------------------------------\n");printf("%5s%15s%15s%15s","Number","start","size","status");printf("\n---------------------------------------------------\n");for(i=0; i<MEMSIZE&&MemList[i].status!='e'; i++){if(MemList[i].status=='u'){used+=MemList[i].Size;}printf("%5d%15d%15d%15s\n",i,MemList[i].start,MemList[i].Size,MemList[i].status=='u'?"USED":"FREE");}printf("\n----------------------------------------------\n");printf("Totalsize:%-10d Used:%-10d Free:%-10d\n",MEMSIZE,used,MEMSIZE-used);
}/*初始化所有變量*/
void InitMemList()
{int i;MEMINFO temp= {0,0,'e'};//初始化空間信息表for(i=0; i<MEMSIZE; i++){MemList[i]=temp;}//起始地址為0MemList[0].start=0;//空間初始為最大MemList[0].Size=MEMSIZE;//狀態(tài)為空閑MemList[0].status='f';
}/*最先適應(yīng)算法*//*算法原理分析:
將空閑的內(nèi)存區(qū)按其在儲(chǔ)存空間中的起始地址遞增的順序排列,為作業(yè)分配儲(chǔ)存空間時(shí),從空閑區(qū)鏈的始端開始查找,選擇第一個(gè)滿足要求的空閑區(qū),而不管它究竟有多大優(yōu)點(diǎn):
1.在釋放內(nèi)存分區(qū)的時(shí)候,如果有相鄰的空白區(qū)就進(jìn)行合并,使其成為一個(gè)較大的空白區(qū)
2.此算法的實(shí)質(zhì)是盡可能的利用儲(chǔ)存器的低地址部分,在高地址部分則保留多的或較大的空白區(qū),以后如果需要較大的空白區(qū),就容易滿足缺點(diǎn):
1.在低地址部分很快集中了許多非常小的空白區(qū),因而在空白區(qū)分配時(shí),搜索次數(shù)增加,影響工作效率。*/void FirstFit_new()
{int i,j,flag=0;int request;printf("FirstFit_new:How Many MEMORY requir?\n");scanf("%d",&request);//遍歷數(shù)組for(i=0; i<MEMSIZE&&MemList[i].status!='e'; i++){//滿足所需要的大小,且是空閑空間if(MemList[i].Size>=request&&MemList[i].status=='f'){//如果小于規(guī)定的最小差則將整個(gè)空間分配出去if(MemList[i].Size-request<=MINSIZE){MemList[i].status='u';}else{//將i后的信息表元素后移for(j=MEMSIZE-2; j>i; j--){MemList[j+1]=MemList[j];}//將i分成兩部分,使用低地址部分MemList[i+1].start=MemList[i].start+request;MemList[i+1].Size=MemList[i].Size-request;MemList[i+1].status='f';MemList[i].Size=request;MemList[i].status='u';flag=1;}break;}}//沒有找到符合分配的空間if(flag!=1||i==MEMSIZE||MemList[i].status=='e'){printf("Not Enough Memory!!\n");}Display();
}
/*最壞適應(yīng)算法算法原理分析:
掃描整個(gè)空閑分區(qū)或者鏈表,總是挑選一個(gè)最大的空閑分區(qū)分割給作業(yè)使用優(yōu)點(diǎn):可以使得剩下的空閑分區(qū)不至于太小,產(chǎn)生碎片的幾率最小,對(duì)中小作業(yè)有利,同時(shí)該算法的查找效率很高缺點(diǎn):會(huì)使得儲(chǔ)存器中缺乏大的空閑分區(qū)
*/
void BadFit_new()
{int i,j,k,flag,request;printf("BadFit_new:How Many MEMORY requir?\n");scanf("%d",&request);j=0;flag=0;k=0;//保存滿足要求的最大空間for(i=0;i<MEMSIZE-1&&MemList[i].status!='e';i++){if(MemList[i].Size>=request&&MemList[i].status=='f'){flag=1;if(MemList[i].Size>k){k=MemList[i].Size;j=i;}}}i=j;if(flag==0){printf("Not Enough Memory!\n");j=i;}else if(MemList[i].Size-request<=MINSIZE){MemList[i].status='u';}else{for(j=MEMSIZE-2;j>i;j--){MemList[j+1]=MemList[j];}MemList[i+1].start=MemList[i].start+request;MemList[i+1].Size=MemList[i].Size-request;MemList[i+1].status='f';MemList[i].Size=request;MemList[i].status='u';}Display();
}//釋放一塊內(nèi)存
void del_t()
{int i,number;printf("\nplease input the NUMBER you want stop:\n");scanf("%d",&number);//輸入的空間是使用的if(MemList[number].status=='u'){MemList[number].status='f';//標(biāo)志為空閑if(MemList[number+1].status=='f')//右側(cè)空間為空則合并
{MemList[number].Size+=MemList[number].Size;//大小合并for(i=number+1; i<MEMSIZE-1&&MemList[i].status!='e'; i++) //i后面的空間信息表元素后移
{if(i>0){MemList[i]=MemList[i+1];}}}//左測(cè)空間空閑則合并if(number>0&&MemList[number-1].status=='f'){MemList[number-1].Size+=MemList[number].Size;for(i=number; i<MEMSIZE-1&&MemList[i].status!='e'; i++){MemList[i]=MemList[i+1];}}}else{printf("This Number is Not Exist or is Not Used!\n");}Display();
}/*最佳適應(yīng)算法算法原理分析:
從全部空閑區(qū)中找出滿足作業(yè)要求的,且大小最小的空閑分區(qū)的一種計(jì)算方法,這種方法能使得碎片盡量小,為適應(yīng)此算法,空閑分區(qū)表中的空閑分區(qū)要按從小到大進(jìn)行排序,自表頭開始查找第一個(gè)滿足要求的自由分區(qū)分配優(yōu)點(diǎn):能使得碎片盡量的小,保留了最大空閑區(qū)缺點(diǎn):造成了許多小的空閑區(qū)
*/
void BestFit_new()
{int i,j,t,flag,request;printf("BestFit_new How Many MEMORY requir?\n");scanf("%d",&request);j=0;flag=0;t=MEMSIZE;//保存滿足要求的最大空間for(i=0; i<MEMSIZE&&MemList[i].status!='e'; i++){if(MemList[i].Size>=request&&MemList[i].status=='f'){flag=1;if(MemList[i].Size<t){t=MemList[i].Size;j=i;}}}i=j;if(flag==0){printf("Not Enough Memory!\n");j=i;}else if(MemList[i].Size-request<=MINSIZE) //如果小于規(guī)定的最小差則將整個(gè)空間分配出去
{MemList[i].status='u';}else{//將i后的信息表元素后移for(j=MEMSIZE-2; j>i; j--){MemList[j+1]=MemList[j];}//將i分成兩部分,使用低地址部分MemList[i+1].start=MemList[i].start+request;MemList[i+1].Size=MemList[i].Size-request;MemList[i+1].status='f';MemList[i].Size=request;MemList[i].status='u';}Display();
}int main()
{int x;InitMemList();//變量初始化while(1){printf("=================================================\n");printf(" 1.Get a block use the FIRSTFIT method\n");printf(" 2.Get a block use the BESTFIT method\n");printf(" 3.Get a block use the BadFIT method\n");printf(" 4.Free a block\n");printf(" 5.Dispaly Mem info \n");printf(" 6.Exit \n");printf("=================================================\n");scanf("%d",&x);switch(x){case 1:FirstFit_new();//首次適應(yīng)算法break;case 2:BestFit_new();//最佳適應(yīng)算法break;case 3:BadFit_new();//最壞適應(yīng)算法break;case 4:del_t();//刪除已經(jīng)使用完畢的空間break;case 5:Display();//顯示內(nèi)存分配情況break;case 6:exit(0);}}return 0;
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/yinbiao/p/9021517.html
總結(jié)
以上是生活随笔為你收集整理的c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux学习 命令部分
- 下一篇: 前端 javascript 数据类型 布