#include<bits/stdc++.h>
using namespace std;
/*定义内存的大小为100*/
#define MEMSIZE 100
/*如果小于此值,将不再分割内存*/
#define MINSIZE 2/*内存分区空间表结构*/
typedef struct _MemoryInfomation
{/*起始地址*/int start;/*大小*/int Size;/*状态 F:空闲(Free) U:占用(Used) E 结束(End)*/char status;
} MEMINFO;/*内存空间信息表*/
MEMINFO MemList[MEMSIZE];/*显示内存状态*/
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;//状态为空闲MemList[0].status='f';
}/*最先适应算法*//*算法原理分析:
将空闲的内存区按其在储存空间中的起始地址递增的顺序排列,为作业分配储存空间时,从空闲区链的始端开始查找,选择第一个满足要求的空闲区,而不管它究竟有多大优点:
1.在释放内存分区的时候,如果有相邻的空白区就进行合并,使其成为一个较大的空白区
2.此算法的实质是尽可能的利用储存器的低地址部分,在高地址部分则保留多的或较大的空白区,以后如果需要较大的空白区,就容易满足缺点:
1.在低地址部分很快集中了许多非常小的空白区,因而在空白区分配时,搜索次数增加,影响工作效率。*/void FirstFit_new()
{int i,j,flag=0;int request;printf("FirstFit_new:How Many MEMORY requir?\n");scanf("%d",&request);//遍历数组for(i=0; i<MEMSIZE&&MemList[i].status!='e'; i++){//满足所需要的大小,且是空闲空间if(MemList[i].Size>=request&&MemList[i].status=='f'){//如果小于规定的最小差则将整个空间分配出去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();
}
/*最坏适应算法算法原理分析:
扫描整个空闲分区或者链表,总是挑选一个最大的空闲分区分割给作业使用优点:可以使得剩下的空闲分区不至于太小,产生碎片的几率最小,对中小作业有利,同时该算法的查找效率很高缺点:会使得储存器中缺乏大的空闲分区
*/
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();
}//释放一块内存
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';//标志为空闲if(MemList[number+1].status=='f')//右侧空间为空则合并
        {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];}}}//左测空间空闲则合并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();
}/*最佳适应算法算法原理分析:
从全部空闲区中找出满足作业要求的,且大小最小的空闲分区的一种计算方法,这种方法能使得碎片尽量小,为适应此算法,空闲分区表中的空闲分区要按从小到大进行排序,自表头开始查找第一个满足要求的自由分区分配优点:能使得碎片尽量的小,保留了最大空闲区缺点:造成了许多小的空闲区
*/
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)  //如果小于规定的最小差则将整个空间分配出去
    {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();//首次适应算法break;case 2:BestFit_new();//最佳适应算法break;case 3:BadFit_new();//最坏适应算法break;case 4:del_t();//删除已经使用完毕的空间break;case 5:Display();//显示内存分配情况break;case 6:exit(0);}}return 0;
}

转载于:https://www.cnblogs.com/yinbiao/p/9021517.html

c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)相关推荐

  1. 操作系统C语言模拟内存分配算法的模拟实现

    使用一个一维数组来模拟内存储空间,建立内存块来记录内存分配使用情况,通过随机产生进程及其所需要的内存来模拟真实的进程.通过给进程分配内存及回收来实现对动态不等长存储管理方法. 代码 #include ...

  2. 连续分配管理方式的动态分区分配算法(首次适应、最佳适应、最坏适应、邻接适应算法)

    一.动态分区分配算法(连续分配管理方式) 动态分区分配算法:在动态分区分配方式中, 当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配? (一)首次适应算法 算法思想:每次都从低地址开始查找,找 ...

  3. 最佳适应算法模拟内存分配

    最佳适应算法 从全部空闲区中找出能满足作业要求的,且大小最小的空闲分区,这种方法能使碎片尽量小. 问题描述 Given five memory partitions of 100 KB, 500 KB ...

  4. 操作系统之内存管理:2、内存管理的功能(内存分配回收、扩充、地址转化、存储保护)

    2.内存管理的功能 功能1:内存空间的分配与回收 连续分配管理: 方法1:单一连续分配 方法2:固定分区分配 方法3:动态分区分配 1.什么是动态分区分配? 2.系统用什么样的数据结构记录内存使用情况 ...

  5. 动态分区最佳适应算法c语言,使用最佳适应算法对内存实现模拟动态分区管理...

    摘要: 内存动态分区管理的算法是操作系统课程中一个重要内容,理解和学习不同的分区算法能够为深入学习操作系统等知识提供一定的理论知识和实践依据.本文采用C语言程序设计出最佳适应算法来模拟计算机内存分区管 ...

  6. 操作系统【动态分区分配算法——首次适应算法、最佳适应算法、最坏适应算法、临近适应算法】

    学习地址(哔哩哔哩网站--王道论坛):https://www.bilibili.com/video/BV1YE411D7nH?p=37 目录 1.首次适应算法(First Fit) 2.最佳适应算法( ...

  7. 操作系统——动态分配算法(首次适应算法,最佳适应算法,最坏适应算法及回收)

    操作系统--动态分配 写的时间早了,有些许漏洞和不足,请大家不要介意 分配方式可分为四类:单一连续分配.固定分区分配.动态分区分配以及动态可重定位分区分配算法四种方式,其中动态分区分配算法就是此实验的 ...

  8. 【操作系统/OS笔记04】内存分层体系、地址生成、连续内存分配概论

    本次笔记内容: 3.1 计算机体系结构及内存分层体系 3.2 地址空间和地址生成 3.3 连续内存分配:内存碎片与分区的动态分配 3.4 连续内存分配:压缩式与交换式碎片整理 文章目录 物理内存 计算 ...

  9. JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)

    一个类创建实例的时候,需要经过多个步骤,比如我们调用new的时候经过了哪些流程,本文就来详细分析下 专业术语 逃逸分析算法 逃逸分析其实就是分析java对象的动态作用域, 如果一个对象被定义之后,被外 ...

最新文章

  1. python里面map函数_python中的map()函数
  2. 微软10亿美元投资的OpenAI如何组织员工学习新知识?这里有一份课程与书籍清单...
  3. 吴恩达机器学习(第五章)——Logistic回归
  4. python常用模块(一)
  5. Your CPU supports instructions that this TensorFlow binary was not compiled to use AVX AVX2
  6. gcc中的内嵌汇编语言(Intel i386平台)
  7. python怎么发送微信给自己_Python新手教程:Python微信定时自动给【女朋友】发送天气预报...
  8. 1085. Perfect Sequence (25)-PAT甲级真题
  9. [转载]依赖注入那些事
  10. Spring AOP高级——源码实现(2)Spring AOP中通知器(Advisor)与切面(Aspect)
  11. 【问题6】Redis 的过期策略都有哪些?内存淘汰机制都有哪些?
  12. 笔记本使用Nsight注意事项
  13. python tkinter:单位换算小工具完整代码
  14. 汽车软件行业工程师详细介绍?(上)
  15. android m1卡读写
  16. Docker之MySQL主从连接提示:Communications link failure
  17. 做不好资产清点的网络安全防护都是耍流氓
  18. 英语46级报名考试系统
  19. 6-7 BMI计算(类与对象) (10分)
  20. 微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析

热门文章

  1. python小游戏之三
  2. 1.6 编程基础之一维数组 11 大整数减法
  3. 12产品经理要懂的-人性满足思维
  4. laravel使用php artisan migrate 报错 SQLSTATE[42000]的解决方式
  5. js前端实现多图图片上传预览的两个方法
  6. Mysql数据库常用命令,mysql速学实用教程。
  7. Spring Boot文档阅读笔记-构建SOAP的web Service服务
  8. Java基础入门笔记-整数+小数+字符串+打印
  9. android 侧滑效果,android 侧滑效果
  10. python虚拟环境拷贝到另一台电脑,不能直接使用的问题