#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. UVAlive6807 Túnel de Rata (最小生成树)

    题意 题目链接 Sol 神仙题Orz 我们考虑选的边的补集,可以很惊奇的发现,这个补集中的边恰好是原图中的一颗生成树: 并且答案就是所有边权的和减去这个边集中的边的权值: 于是我们只需要求最大生成树就 ...

  2. css-扩展选择器

    (1)关联选择器 <div><p>aaaaaaaaaaaa</p></div> * 设置div标签里面p标签的样式,嵌套标签里面的样式 div p{ b ...

  3. p2p项目工具类

    1.用于存放当前用户的上下文UserContext package com.xmg.p2p.base.util; import javax.servlet.http.HttpSession; impo ...

  4. Action 中获取表单数据的三种方式

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/53138905  冷血之心的博客) Action 中获取表单提交数据 ...

  5. Kriging插值计算

      参考论文:      http://people.ku.edu/~gbohling/cpe940 # -*- coding: utf-8 -*- # ----------------------- ...

  6. 关于Datastage资料库的一点小发现

    这里的资料库,指的是Datastage Metadata层,在Datastage7.5以后,需要在安装Datastage时安装一个数据库用于存放用户数据. 昨天领导要求安装Datastage集群/高可 ...

  7. redis 持久化策略、aof配置、测试、手动持久化、aof文件体积优化

    redis持久化策略 1.数据文件.rdb 2.更新日志.aof 设置aof 1.命令方式config set appendonly noconfig rewrite2.配置文件方式 redis持久化 ...

  8. 签署您的应用--手动签署 APK

    签署您的应用 本文内容 证书和密钥库 签署您的调试构建 调试证书的有效期 管理您的密钥 使用 Google Play 应用签名 自行管理您的密钥和密钥库 签署 APK 生成密钥和密钥库 手动签署 AP ...

  9. 6.Spring MVC SSM整合问题总结

    1.Cannot find class [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter] for ...

  10. java并发之同步辅助类CyclicBarrier和CountDownLatch

    CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门, ...