c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)
#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=;//记录可以使用的总空间量
printf("\n---------------------------------------------------\n");
printf("%5s%15s%15s%15s","Number","start","size","status");
printf("\n---------------------------------------------------\n");
for(i=; 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= {,,'e'};
//初始化空间信息表
for(i=; i<MEMSIZE; i++)
{
MemList[i]=temp;
}
//起始地址为0
MemList[].start=;
//空间初始为最大
MemList[].Size=MEMSIZE;
//状态为空闲
MemList[].status='f';
} /*最先适应算法*/ /*算法原理分析:
将空闲的内存区按其在储存空间中的起始地址递增的顺序排列,为作业分配储存空间时,从空闲区链的始端开始查找,选择第一个满足要求的空闲区,而不管它究竟有多大 优点:
1.在释放内存分区的时候,如果有相邻的空白区就进行合并,使其成为一个较大的空白区
2.此算法的实质是尽可能的利用储存器的低地址部分,在高地址部分则保留多的或较大的空白区,以后如果需要较大的空白区,就容易满足 缺点:
1.在低地址部分很快集中了许多非常小的空白区,因而在空白区分配时,搜索次数增加,影响工作效率。*/ void FirstFit_new()
{
int i,j,flag=;
int request;
printf("FirstFit_new:How Many MEMORY requir?\n");
scanf("%d",&request);
//遍历数组
for(i=; 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-; j>i; j--)
{
MemList[j+]=MemList[j];
} //将i分成两部分,使用低地址部分
MemList[i+].start=MemList[i].start+request;
MemList[i+].Size=MemList[i].Size-request;
MemList[i+].status='f';
MemList[i].Size=request;
MemList[i].status='u';
flag=;
}
break;
}
}
//没有找到符合分配的空间
if(flag!=||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=;
flag=;
k=;
//保存满足要求的最大空间
for(i=;i<MEMSIZE-&&MemList[i].status!='e';i++)
{
if(MemList[i].Size>=request&&MemList[i].status=='f')
{
flag=;
if(MemList[i].Size>k)
{
k=MemList[i].Size;
j=i;
}
}
}
i=j;
if(flag==)
{
printf("Not Enough Memory!\n");
j=i;
}else if(MemList[i].Size-request<=MINSIZE)
{
MemList[i].status='u';
}else
{
for(j=MEMSIZE-;j>i;j--)
{
MemList[j+]=MemList[j];
}
MemList[i+].start=MemList[i].start+request;
MemList[i+].Size=MemList[i].Size-request;
MemList[i+].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+].status=='f')//右侧空间为空则合并
{
MemList[number].Size+=MemList[number].Size;//大小合并
for(i=number+; i<MEMSIZE-&&MemList[i].status!='e'; i++) //i后面的空间信息表元素后移
{
if(i>)
{
MemList[i]=MemList[i+];
}
}
}
//左测空间空闲则合并
if(number>&&MemList[number-].status=='f')
{
MemList[number-].Size+=MemList[number].Size;
for(i=number; i<MEMSIZE-&&MemList[i].status!='e'; i++)
{
MemList[i]=MemList[i+];
}
}
}
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=;
flag=;
t=MEMSIZE;
//保存满足要求的最大空间
for(i=; i<MEMSIZE&&MemList[i].status!='e'; i++)
{
if(MemList[i].Size>=request&&MemList[i].status=='f')
{
flag=;
if(MemList[i].Size<t)
{
t=MemList[i].Size;
j=i;
}
}
}
i=j;
if(flag==)
{
printf("Not Enough Memory!\n");
j=i;
}
else if(MemList[i].Size-request<=MINSIZE) //如果小于规定的最小差则将整个空间分配出去
{
MemList[i].status='u';
}
else
{
//将i后的信息表元素后移
for(j=MEMSIZE-; j>i; j--)
{
MemList[j+]=MemList[j];
} //将i分成两部分,使用低地址部分
MemList[i+].start=MemList[i].start+request;
MemList[i+].Size=MemList[i].Size-request;
MemList[i+].status='f';
MemList[i].Size=request;
MemList[i].status='u';
}
Display();
} int main()
{
int x;
InitMemList();//变量初始化
while()
{
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 :
FirstFit_new();//首次适应算法
break;
case :
BestFit_new();//最佳适应算法
break;
case :
BadFit_new();//最坏适应算法
break;
case :
del_t();//删除已经使用完毕的空间
break;
case :
Display();//显示内存分配情况
break;
case :
exit();
}
}
return ;
}
c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)的更多相关文章
- SQLite剖析之动态内存分配
SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.保存查询结果. 1.特性 SQLite内核和它的内存分配子系统提供以下特性 ...
- Linux内核中常见内存分配函数【转】
转自:http://blog.csdn.net/wzhwho/article/details/4996510 1. 原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页 ...
- Linux内核中常见内存分配函数
1. 原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分 ...
- Java实现内存分配算法 FF(首次适应算法) BF(最佳适应算法)
一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. MemoryAlgorithm类里只是和控制台输入输出有关的操作,而对内存的所有逻辑操作都是用Mem ...
- jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)
1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的.(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个 ...
- 内存分配---FF、BF、WF三种算法
动态分区分配是根据进程的实际需要,动态的为之分配内存空间.而在实现可变分区分配时,将涉及到分区分配中 所用的数据结构.分区分配算法和分区的分配与内存回收的过程. 分区分配中的数据结构:(1)描述空闲块 ...
- Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF
1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是: BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...
- Buddy内存分配算法
Buddy(伙伴的定义): 这里给出伙伴的概念,满足以下三个条件的称为伙伴:1)两个块大小相同:2)两个块地址连续:3)两个块必须是同一个大块中分离出来的: Buddy算法的优缺点: 1)尽管伙伴内存 ...
- Java垃圾回收算法和内存分配策略
垃圾回收算法和内存分配策略 Java垃圾回收 垃圾收集,也就是GC并不是Java的伴生物,而对于GC的所需要完成任务主要就是: 1.哪些内存是需要回收的? 2.何时去回收这些内存? 3.以何种方式去回 ...
随机推荐
- HTML5 FormData实现文件上传实例
表单提交,文件上传是一个常用又十分麻烦的功能,以前要上传文件通常都是借助插件或者flash来实现,噼里啪啦的加载一大堆东西.自从有了HTML5的FormData后,老板再也不用担心我的上传了. For ...
- druapl7:"Notice: A non well formed numeric value encountered 在 _hierarchical_select_hierarchy_generate() "
这个是很诡异的一个Notice错误提醒,因为我在Drupal7.54+PHP7.0.1的环境下,并没有报这个错.但是我再Drupal7.59+PHP7.1.7的环境下就报错了.很奇怪,按照报错信息bi ...
- IT小鲜肉 widgets tree 三种格式数据源
昨天完成了下面几个功能,其中最麻烦的就是做图.边学GIMP用法边做图 1.使用GIMP软件G了几个图标 2.支持一维数组数据源,并按照指定的属性对数据源中的数据进行自动分组 运行效果: 3.支持由pi ...
- JS判断客户端是否是iOS或者Android端
通过判断浏览器的userAgent,用正则来判断手机是否是 IOS 和 Android 客户端. 代码如下: (function(){ var u = navigator.userAgent; var ...
- Spring Boot—21Actuator--监控
https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/ pom.xml <dependency&g ...
- ecloipse背景修改豆沙
Eclipse背景色的修改 Eclipse背景色的修改,修改为豆沙色 值是85 123 205 一.修改编辑区 ①这个比较简单一般都会不多说. 1.首先点击Window 然后选择Preferen ...
- Vue 框架-10-搭建脚手架 CLI
Vue 框架-10-搭建脚手架 CLI + 批处理快捷启动 脚手架是通过 webpack 搭建的开发环境 使用 ES6 语法 打包和压缩 JS 为一个文件 项目文件在环境中,而不是浏览器 实现页面自动 ...
- react的基本概念
数据流向 数据的改变发生通常是通过用户交互行为或者浏览器行为(如路由跳转等)触发的,当此类行为会改变数据的时候可以通过 dispatch 发起一个 action,如果是同步行为会直接通过 Reduce ...
- Oracle AP更新供应商
/*l_return_status:S l_msg_count:0 l_msg_data: l_vendor_id:133003 l_party_id:236055 */ DECLARE l_ ...
- 转: C# 的结构剖析
原文链接:http://www.cnblogs.com/jiajiayuan/archive/2011/09/20/2181582.html 本文意在巩固基础知识,并不是对其进行深入剖析,还望理解.本 ...