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.以何种方式去回 ...
随机推荐
- 转:nginx 官方drupal 配置 - Drupal | NGINX
#参考:nginx 官方drupal 配置 - Drupal | NGINX server { server_name example.com; root /var/www/drupal8; ## & ...
- js面向对象设计之class类
class 相对 function 是后出来的,既然 class 出来了,显然是为了解决 function 在处理面向对象设计中的缺陷而来.下面通过对比,来看看 class 作为 ES6 中的重大升级 ...
- 一步一步pwn路由器之uClibc中malloc&&free分析
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 栈溢出告一段落.本文介绍下 uClibc 中的 malloc 和 ...
- Android ListView的XML属性
1.ListView的XML属性 android:divider //在列表条目之间显示的drawable或color android:dividerHeight //用来指定divider的高度 a ...
- Mongodb的入门(1)window安装mongodb
mongodb: Mongodb,分布式文档存储数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数 ...
- 【日常记录】【unity3d】 2D跳跃过快导致角色某帧陷入地面
如果角色运动过快会导致嵌入地面再反弹出来 : 可以使用更高质量的检测方式 "Continuous" :就可以解决这个问题
- linux soft
1.gdebi:可以使用gdebi来安装deb包,默认的deb安装使用的dpkg,dpkg 安装的缺点就是不解决包依赖关系 sudo apt-get install gdebi 当然也可以通过命令,使 ...
- 搜索菜单栏侧滑效果控件SearchView
搜索菜单栏侧滑效果控件SearchView 本人视频教程系类 iOS中CALayer的使用 效果1: 效果2: 项目中用到的图片 bgImg@2x.png: 源码: SearchView.h + ...
- SCCM OS播发
SCCM OS播发1.在分发点启用PXE支持2.将启动映像包分发到分发点:需要将x86和x64都分发到分发点,如果只分发x64,在客户端pxe启动时会出现 no response from wds s ...
- 铁乐学python_Day39_多进程和multiprocess模块2
铁乐学python_Day39_多进程和multiprocess模块2 锁 -- multiprocess.Lock (进程同步) 之前我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发 ...