#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模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)的更多相关文章

  1. SQLite剖析之动态内存分配

    SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.保存查询结果. 1.特性    SQLite内核和它的内存分配子系统提供以下特性 ...

  2. Linux内核中常见内存分配函数【转】

    转自:http://blog.csdn.net/wzhwho/article/details/4996510 1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页 ...

  3. Linux内核中常见内存分配函数

    1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分 ...

  4. Java实现内存分配算法 FF(首次适应算法) BF(最佳适应算法)

    一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. MemoryAlgorithm类里只是和控制台输入输出有关的操作,而对内存的所有逻辑操作都是用Mem ...

  5. jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)

    1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的.(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个 ...

  6. 内存分配---FF、BF、WF三种算法

    动态分区分配是根据进程的实际需要,动态的为之分配内存空间.而在实现可变分区分配时,将涉及到分区分配中 所用的数据结构.分区分配算法和分区的分配与内存回收的过程. 分区分配中的数据结构:(1)描述空闲块 ...

  7. Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF

    1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是: BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...

  8. Buddy内存分配算法

    Buddy(伙伴的定义): 这里给出伙伴的概念,满足以下三个条件的称为伙伴:1)两个块大小相同:2)两个块地址连续:3)两个块必须是同一个大块中分离出来的: Buddy算法的优缺点: 1)尽管伙伴内存 ...

  9. Java垃圾回收算法和内存分配策略

    垃圾回收算法和内存分配策略 Java垃圾回收 垃圾收集,也就是GC并不是Java的伴生物,而对于GC的所需要完成任务主要就是: 1.哪些内存是需要回收的? 2.何时去回收这些内存? 3.以何种方式去回 ...

随机推荐

  1. 【SQL基础】三种类别语句

    SQL 语句主要可以划分为以下 3 个类别. DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段.数据库.表.列.索引等数据库对象的定义.常用的 ...

  2. 如何选择分布式事务形态(TCC,SAGA,2PC,基于消息最终一致性等等)

    各种形态的分布式事务 分布式事务有多种主流形态,包括: 基于消息实现的分布式事务 基于补偿实现的分布式事务 基于TCC实现的分布式事务 基于SAGA实现的分布式事务 基于2PC实现的分布式事务 这些形 ...

  3. Android:Building " " Gradle project info 问题

    Android Studio新建或者打开项目的时候,一直卡在Building "" Gradle project info 进度上不动,猜测是网络原因下载gradle不成功. 两种 ...

  4. RecyclerView分隔线定制

    分割线我们利用RecyclerView的addItemDecoration(ItemDecoration fromHtml) 新建一个类来看看到底是什么: public class CategoryI ...

  5. Ubuntu 16.04下 - vi编辑器使用【backspace】无法删除

    参考:https://blog.csdn.net/leiwangzhongde/article/details/83339589

  6. 【转】数据分析与处理之二(Leveldb 实现原理)

    郑重声明:本篇博客是自己学习 Leveldb 实现原理时参考了郎格科技系列博客整理的,原文地址:http://www.samecity.com/blog/Index.asp?SortID=12,只是为 ...

  7. Mysql性能监控项及sql语句

    推荐一款mysql监控软件MONyog 1.查询缓存: mysql> show variables like '%query_cache%'; 2.缓存在Cache中线程数量thread_cac ...

  8. .net通用类型转换方法

    由于数据类型多,要按照逐个类型写一个类型转换的方法的话一是代码量多,显得累赘. using System; using System.ComponentModel; using System.Glob ...

  9. ELK搭建实时日志分析平台之二Logstash和Kibana搭建

    本文书接前回<ELK搭建实时日志分析平台之一ElasticSearch> 文:铁乐与猫 四.安装Logstash logstash是一个数据分析软件,主要目的是分析log日志. 1)下载和 ...

  10. 内置数据结构(tuple)

    一.元组(tuple) 元组不能增.删和改,所以元组的元素只能查. tp = tuple()  #初始化一个元组 tp = () #同上 tp = (1, 2, 3, 4,) #错误的定义元组方式 t ...