基于链表的内存池算法

2023-05-16

#include "head.h"

#define INITPOOL 5000				//每个的内存池的初始大小
#define ADDPOOL 5000			    //每个新增的内存池的初始大小
#define Byte 44						//每个新分配内存字节数

typedef struct Memory_Block{					   //用户信息结构体
	char color;                                    //红黑树颜色域
    struct Memory_Block * p;                       //指向父节点指针
    struct Memory_Block * left;                    //指向左孩子指针
    struct Memory_Block * right;                   //指向右孩子指针
	
	int ID;                                        //数据域
	char Name[20];
	struct Memory_Block   *freeNext;	//free链表next值
}MemoryBlock;

typedef struct Memory_Pool{				//内存池
	MemoryBlock   *Init_Pool;			//池的内存数据
    MemoryBlock   *free;				//内存池中空闲数据链表
	int freeNum;						//空闲块数量
	struct Memory_Pool *PoolNext;		//串接内存池的链表
}MemoryPool;

MemoryPool Memory;						//内存池

void MemoryPool_init(MemoryPool *Mem )	//初始化内存池函数,第一次调用时需初始化Memory
{
	int i = 0;							//分配池的内存空间
	Mem->Init_Pool = (MemoryBlock *)malloc(INITPOOL * sizeof( MemoryBlock ));
	Mem->freeNum = INITPOOL;			//空闲大小
	Mem->PoolNext = NULL;				//下一个内存池指针
	Mem->free = &(Mem->Init_Pool[0]);	//空闲链表头指针
	for (i=1; i<INITPOOL; i++)			//组建free链表
	{
		(Mem->Init_Pool[i-1]).freeNext = &(Mem->Init_Pool[i]);
	}
	Mem->Init_Pool[INITPOOL-1].freeNext = NULL;//将Init_Pool数组串成free链表
}
void * MemoryPool_alloc( )				//申请内存"类似(malloc)作用"
{										//使用方法“MemoryBlock *XX = (MemoryBlock *)MemoryPool_alloc( );”
	MemoryPool *Temp = &Memory,*Bew;
	MemoryPool *AddPool;				//新增内存池
	MemoryBlock *Return;				//用于返回申请到的内存空间地址,
	while (Temp->freeNum == 0)			//当前内存池free内存空间为0时
	{					
		Bew = Temp;
		Temp = Temp->PoolNext;
		if (NULL == Temp)				//说明当前已有的内存池不够分配
		{								//新产生的内存池用于分配
			AddPool = ( MemoryPool * )malloc( sizeof( struct Memory_Pool )*1 );
			if (NULL == AddPool)
			{
					printf("Can`t get memory for that many value.\n" );
					return NULL;		//分配失败返回NULL
			}
			MemoryPool_init(AddPool);	//初始化新产生的内存池
			Temp = AddPool;
			Bew->PoolNext = Temp;		//将新产生的内存池插入到内存池链表上
		}
	}
	Return = Temp->free;				//获得返回分配到的内存地址
	Temp->free = (Temp->free)->freeNext;
	Temp->freeNum--;					//重构free链表
	return Return;
}
void Memory_recover(MemoryBlock *ptr)	//回收内存"类似(free)作用" 实际是将回收节点插进free链表中
{										//使用方法“Memory_recover(XX);”
	MemoryPool *Temp = &Memory,*Bew;
	MemoryBlock *ReFree;
	int num = 0;						
	while(NULL != Temp)					
	{
		
		ReFree = Temp->free;			
		num = (ptr - &(Temp->Init_Pool[0]));//通过判断内存地址定位回收内存存在于哪一个内存池中
		if (num<INITPOOL && num >= 0)	//找到内存池
		{	
			Temp->free = ptr;
			Temp->free->freeNext=ReFree;//将欲回收的内存重新放入free链表中
			Temp->freeNum++;
			if (INITPOOL == Temp->freeNum && &Memory != Temp)
			{							//此时说明当前内存池已空
				Bew->PoolNext = Temp->PoolNext;	
				free(Temp->Init_Pool);
				free(Temp);				//将整个内存池空间free掉,因为大快连续内存被free
			}							//故不会像零碎申请撤销内存时那样产生内存碎片问题
			return ;
		}
		Bew = Temp;
		Temp = Temp->PoolNext;			//重新组织内存池链表
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于链表的内存池算法 的相关文章

  • 虹科干货 | 打破传统!金融界黑科技—虹科Redis企业版数据库

    金融行业数字化转型浪潮来袭 xff0c 客户需求也正加速向在线金融服务转移 金融机构想要实现现代化改造技术堆栈 xff0c 为客户提供实时交互 欺诈检测等一系列个性化创新服务 xff0c 就必须重视遗留系统和传统数据库架构 老年病 问题 x
  • 虹科干货 | 零售业数智升级不掉队,get数据,get未来!

    电商崛起 xff0c 传统零售行业危机四伏 xff0c 全渠道盈利与可持续化成为难点 xff0c 库存管理这块难啃的 硬骨头 也同样让零售商倍感压力 背腹受敌的零售商 xff0c 如何才能在数字化转型道路上避免利润缩水 xff0c 与供应商
  • 什么是网络数据包?

    流经网络的一切都可以被归类为数据包中所包含数据的一部分 一个网络数据包或IP包可以被称为一个数据单元 xff08 约1KBS至1 5KBS xff09 xff0c 在互联网或分组交换网络内从原点流向目标地址 xff08 从发送方到接收方 x
  • md5.pro.js前端MD5加密插件

    下载地址 例如我们对abc进行md5加密 xff0c 则只需要调用hex md5 34 md5 34 xff0c 方法则会返回加密后的字符串900150983cd24fb0d6963f7d28e17f72 dd
  • 02.构建项目流程梳理及总结

    02 构建项目流程梳理及总结
  • windows 下gtk字体问题

    windows下运行gtk程序 xff0c 出现如下问题 xff1a PangoWarning couldn 39 t load font 34 微软雅黑 Not Rotated 9 34 falling back to 34 Sans N
  • Ubuntu,源码安装Node.js

    Ubuntu xff0c 源码安装Node js Ubuntu Linux下安装Node js xff0c 其他linux系统步骤类似 Github获取源码 sudo git clone https github com nodejs no
  • utf-8转换到utf-16的转换过程你懂吗?

    人生自是有情痴 xff0c 此恨不关风与月 唐代元稹 离思 从UTF 8编码的文件中读取文本并将其存储到Java的String对象中 xff0c 涉及到从字节序列到Unicode码点 xff0c 再到UTF 16编码的转换 以下是详细的步骤
  • TP5的select,find和get查询方法的使用

    select查询出的是多条数据 xff0c 需要在模版volist循环打印出来 find和get获取单条数据 xff0c 可直接在模版打印 xff1b user 61 User get span class hljs number styl
  • 两个类相互引用的解决方法

    1 问题提出 最近在编写 斗地主 游戏 xff0c 在程序中有一个 CDealer 类用来实现发牌等等功能 xff0c 还有一个 CPoker 类 xff0c 用来表示扑克牌 在CDealer类中包含了一个CPoker类指针的成员变量 xf
  • Android Studio中修改APP图标和APP名称

    Android Studio生成的 APP默认图标是经典的机器人图标 可以通过 Android Studio实现 APP图标和名称的修改 1 修改 APP 图标 在程序对应的 AndroidMenifest xml中指定了该 APP 的图标
  • python程序设计流程(九) ---循环结构

    本文思维导图 循环结构简介 xff1a 循环结构用来重复执行一条或者多条语句 xff0c 使用循环结构可以减少源程序重复书写的工作量 许多算法需要使用到循环结构 xff0c python使用for语句和while语句来实现循环结构 1 xf
  • Flask框架安装报错问题解决

    对于flask框架安装问题解决办法 falsk框架安装的方法有很多 xff0c 一开始我通过window终端进行安装 大约前前后后安装了有近百遍 xff0c 都是报同样的错误 time out 超时的错误 换了国内的下载源还是不行 于是我准
  • Could not parse the remainder: '=' from '=' 问题解决

    Could not parse the remainder 61 from 61 问题解决 在使用django框架内置模板渲染页面时出现了Could not parse the remainder 61 from 61 的问题 弄了半天发现
  • 纯css3炫酷科技感菜单

    下载地址 一款样式炫酷的旋转导航菜单 xff0c 纯css3代码实现的炫酷科技感菜单 xff0c 带css3旋转动画特效 dd
  • Linux 换源方法

    Linux 换源方法 换国内源 xff0c 最直接的就是上阿里 中科大的镜像官网 Ubuntu换国内源 sudo cp etc apt sources list etc apt sources list bak 备份原来的sorce文件su
  • (535, b'Login Fail. Please enter your authorization code to login. More information in http://servic

    535 b Login Fail Please enter your authorization code to login More information in http service mail qq com cgi bin help
  • django 网页获取访问者的IP地址及用户名

    django获取访问网页的电脑ip地址及用户名 1 先创建模型 class span class token function Viewip span span class token punctuation span models Mod
  • [Errno 5] Input/output error

    Errno 5 Input output error django上线项目报此错误 经过检查是将views py里的无用的print语句给注释掉就ok了 xff01
  • python中文数字转换为阿拉伯数字

    python中文数字转换为阿拉伯数字 中文数字与阿拉伯数字转换 只能转数字 传参中包含非数字会错 def zhuanhuan str zhong 61 39 零 39 0 39 一 39 1 39 二 39 2 39 三 39 3 39 四

随机推荐

  • Ajax通用数据提交

    Ajax通用数据提交 用于登录注册 xff0c 以及文字的添加 span class token punctuation span ajax span class token punctuation span span class toke
  • 利用scrapy框架获取全国的房价数据

    利用scrapy框架获取全国的房价数据 1 首先这里我是利用scrapy框架来进行爬取的 scrapy框架的使用可谓是既简单效率又高 xff0c 下面来一起爬取 2 直接上代码 xff1a span class token keyword
  • 2021-10-12

    入行两年感慨 xff1a 不知不觉间 xff0c 踏入程序员行业已有两年的时间 xff0c 两年时间说长不长说短也不是很短 xff0c 这两年内 xff0c 我的技术得到了不少的提升 从当初的小白渐渐入了门 先自我说明 xff1a 本人19
  • ubuntu安装chrome浏览器

    1 准备好linux版本的chrome xff0c 下载网址 xff1a https www chromedownloads net chrome64linux 可以通过xshell将本地下载好的上传服务器 xff0c 文件后缀为 deb
  • 7年厨师想转行程序员

    7年厨师想转行 xff0c 跟我学java 可是工资只有7千我惊呆了 xff0c 我还以为7年厨师工资至少1万多呢 看来每个行业都有工资高也有工资低的 xff0c 他可能属于厨师里工资低的吧
  • 什么是项目干系人(project stakeholder)?

    stakeholder理论起源于企业管理领域 xff0c 最早由斯坦福大学在20世纪60年代提出 xff0c 到20世纪年代80年代逐步发展完善 xff0c 成为公司治理和权益保护的理论依据 美国经济学家弗里曼给出的stakeholder定
  • Decoupling GCN with DropGraph Module for Skeleton-Based Action Recognition

    Decoupling GCN with DropGraph Module for Skeleton Based Action Recognition 原文地址 xff1a https www ecva net papers eccv 202
  • Linux—微服务启停shell脚本编写

    run sh bin sh 端口号 PORTS 61 80 模块 MODULES 61 gateway 模块名称 MODULE NAMES 61 网关服务 jar包数组 JARS 61 gateway 1 0 0 SNAPSHOT jar
  • ASP.NET 实现轮播图动态查询数据库加载图片效果HTML+JS+SqlServer+C#(超详细)

    ASP NET 实现轮播图动态查询数据库加载图片效果HTML 43 JS 43 SqlServer 43 C xff08 超详细 xff09 炒鸡详细的轮播图哦 xff01 应用于你的各个地方 效果大概是这样子的 xff1a 点击两侧的箭头
  • 机器学习中的End-to-End到底是怎么回事?

    简单讲就是 xff0c Input gt 系统 xff08 这里指神经网络 xff09 gt Output xff08 直接给出输入 xff0c NN神经网络就给出结果 xff0c 一气喝成 xff01 xff01 xff01 xff09
  • Ubuntu 18.04.3 LTS安装和分区方案

    Ubuntu 18 04 3 LTS安装和分区方案 1 选择Install Ubuntu 2 键盘选择 3 选择下载 4 Installation type 选择Something else 来自定义分区 5 Ubuntu详细分区方案 pa
  • Android 开发的技术方向

    xff11 应用开发 xff12 源码级开发 分为系统应用开发 xff0c Framework开发 xff0c 底层浏览器内核开发 xff0c 音视频编码开发 虚拟机开发 底层驱动开发等系统ROM相关的开发 3 安全 逆向 xff0c 病毒
  • Java内存优化和性能优化的几点建议

    1 没有必要时请不用使用静态变量 使用Java的开发者都知道 xff0c 当某个对象被定义为stataic变量所引用 xff0c 这个对象所占有的内存将不会被回收 有时 xff0c 开发者会将经常调用的对象或者变量定义为static xff
  • Windows下安装和配置WSL

    百度百科描述WSL xff1a Windows Subsystem for Linux xff08 简称WSL xff09 是一个在Windows 10上能够运行原生Linux二进制可执行文件 xff08 ELF格式 xff09 的兼容层
  • 利用STM32的HAL库驱动1.54寸 TFT屏(240*240 ST7789V)

    项目 xff1a 温湿度表 芯片 xff1a STM32F030C6T8 液晶 华迪1 54寸 TFT屏 温湿度传感器 xff1a SHT30 主要对液晶屏官方驱动代码进行了增加和修改 一 STM32CubeMX建立工程 I2C1 给SHT
  • 数组中删数

    题目描述 在给定的数组中删除一个数 输入 多组测试 xff0c 每组第一行输入1个整数n xff08 n lt 20 然后是n个整数 第二行输入1个整数m 输出 删除在第一行的n个整数中第一次出现数字m并删除 xff0c 然后按照顺序输出剩
  • 做程序媛这几年,感受?体验?

    首先 感受 和男程序员一个样 真不是废话 BUG是修不完的 但是不能放过它 因为你的内心会遭受煎熬 直接进入体验 就不用重复的文字去啰嗦了 直接上图哈 以下的这几种情况 在我的生活中 是真的不断出现 连样式都没变过 first 修电脑AND
  • 算法题:求从n个数组任意选取一个元素的所有组合

    http www cnblogs com shuaiwhu archive 2011 06 15 2081552 html http download csdn net detail gz434933205 8728787
  • Java高级特性泛型看这一篇就够了

    泛型在我们工作中用到的很多 xff0c 但是很多同学其实对泛型不怎么了解 xff0c 包括我 xff0c 所以我们来一起学习一下泛型 xff0c 主要是从以下几点来介绍一下泛型为什么需要泛型 泛型类和泛型接口的定义 xff0c 泛型方法的辨
  • 基于链表的内存池算法

    include 34 head h 34 define INITPOOL 5000 每个的内存池的初始大小 define ADDPOOL 5000 每个新增的内存池的初始大小 define Byte 44 每个新分配内存字节数 typede