#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. AIX修改时区,配置NTP服务

    AIX修改时区 smitty --> System Environments -->Change/Show Data and Time -->Change Time Zone Usi ...

  2. OAuth2学习笔记

    参考:https://aaronparecki.com/oauth-2-simplified/ 1.角色定义 应用程序(客户) 需要获取用户的账号信息,获得相关权限. API服务器 资源服务器就是AP ...

  3. 【webpack】从零开始学webpack

    背景:目前公司的项目全是用vue写的,建项目的话使用的是用vue-cli直接配置好的webpack,进行打包.现在我就是想实现自己写一个类似vue-cli的架子 一.安装全局依赖 npm instal ...

  4. web项目启动时,自动执行代码的几种方式

    在项目开发过程中,往往需要一些功能随着项目启动而优先启动,下面我总结几种方式(非spring boot) spring boot的参考 spring boot 学习之路9 (项目启动后就执行特定方法) ...

  5. leetCode题解之Contains Duplicate

    1.题目描述 2.题目分析 直接使用hashTable 计数,超过1 则返回true,最后返回 false即可. 3.代码 bool containsDuplicate(vector<int&g ...

  6. ssm单项目整合

    目录 前言 创建maven项目 添加依赖 配置文件 总览 jdbc配置 mybatis配置 dao层配置 service层配置 事务配置 controller配置 web.xml 使用 前言 spri ...

  7. Oracle EBS 复制用户职责

    DECLARE l_new_user_name ) := 'HAND_HYL'; l_new_password ) :'; l_new_user_id NUMBER; l_user_name_copy ...

  8. 【gp数据库】OLTP和OLAP区别详解

    原来一直使用Oracle,新公司使用greenplum后发现系统的并发性差很多,后来才了解因为Oracle属于OLTP类型,而gp数据库属于OLAP类型的.具体了解如下: 数据库系统一般分为两种类型, ...

  9. wxpython 窗口排版- proportion/flag/border参数说明

    新学习wxpython,一直纠结于窗口控件的排版,经过几天的查资料.试验,总结如下. 1.需求实例 来个实例,窗口有3行控件 第一行是文本提示(大小不变,文字左对齐,控件居左). 第二行依次为文本提示 ...

  10. asp.net core中DockerFile文件中的COPY

    今天在ubuntu系统中使用docker部署asp.net core时遇到了一个问题,docker build 的时候总会在最后一步提示 lstat obj/Docker/publish: no su ...