内存池

一种简单定长管理的内存池实现

痞子三分冷 提交于 2020-02-13 08:18:43
借鉴ucos消息队列中的实现,对内存池只提供信息的管理头部,由用户管理内存的分配与释放。 借用了STL中的管理思路 typedef union object_t { union object_t *next; //下一个对象 char data[1]; }object_t; 注意其为union类型,next和data复用 typedef struct ares_block { size_t object_size; //单个对象的大小 size_t block_size; //占用的空间总数 size_t count; //剩余有多少个对象 object_t * free_list; //空闲的对象块 char *data; //实际指向缓冲区位置 struct list_head list_block;//多个内存块 }mem_block_t; 基本的管理块 mem_block_t的接口函数。 void memblock_init(mem_block_t *block,size_t object_size,size_t buf_len,char *data); void memblock_destroy(mem_block_t *block); char *memblock_alloc(mem_block_t *block,size_t object_size); void

转:C++内存池

半城伤御伤魂 提交于 2020-02-13 08:17:30
#ifndef _MEMPOOL_H_ #define _MEMPOOL_H_ /* 本类封装了一个内存池,采用模板类, 模板参数就是内存池中分配的对象类型 本类主要用链表来实现,适用于固定大小的内存块分配 */ #include <vector> using std::vector; template<typename T> class CMemPool { struct _MemNode { _MemNode *pPrev; char data[sizeof(T) - sizeof(_MemNode*)]; }; struct _MemBlock { _MemBlock *pPrev; _MemNode *pNode; }; _MemBlock *m_pBlockHeader; //大内存块链表头指针 _MemNode *m_FreeNodeHeader; //空闲的小块头指针 int m_BlockSize; //当前小内存块数量 private: void AllocBlocks(); //分配内存块 void ReallocBlocks(); //扩大内存池大小 public: //构造函数,nInitSize为初始内存块数 CMemPool(int nInitSize = 128) : m_BlockSize(nInitSize), m_pBlockHeader

Threadx 字节内存池内存释放_tx_byte_release

旧城冷巷雨未停 提交于 2020-02-11 12:30:12
_tx_byte_release _tx_byte_release用于内存释放,原理参考上篇博文: Threadx 内存管理-内存字节池 UINT _tx_byte_release ( VOID * memory_ptr ) { TX_INTERRUPT_SAVE_AREA REG_1 TX_BYTE_POOL * pool_ptr ; /* Pool pointer */ REG_2 TX_THREAD * thread_ptr ; /* Working thread pointer */ REG_3 CHAR_PTR work_ptr ; /* Working block pointer */ REG_4 TX_THREAD * susp_thread_ptr ; /* Suspended thread pointer */ UINT preempt = 0 ; /* Preemption counter */ /* Determine if the memory pointer is valid. */ #def 记录要释放内存起始地址 work_ptr = ( CHAR_PTR ) memory_ptr ; if ( work_ptr ) { /* Back off the memory pointer to pickup its header. */ #def

python小数据池、代码块、深浅拷贝与集合

我的梦境 提交于 2020-02-04 00:31:31
小数据池代码块、深浅拷贝与集合 小数据池和代码块 == id is a = 10 b = 10 print(a == b) a = "alex" b = "alex" print(a == b) name = "alex" print(id(name)) # 4327876736 a = 10 b = 10 print(id(a)) # 4304849568 print(id(b)) # 4304849568 print(a is b) # True # 获取的结果是True是因为a和b的内存地址是相同的 代码块简介: 代码块:Python程序是由代码块构造的。块是一个python程序的文本,他是作为一个单元执行的。 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块。 小数据池:小数据池,不同代码块的缓存机制,也称为小整数缓存机制,或者称为驻留机制等等 代码块的缓存机制 前提条件 :在同一个代码块内。 机制内容: Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。 换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新 的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例 子中,文件执行时(同一个代码块)会把i1

8.池化内存分配

我与影子孤独终老i 提交于 2020-01-31 19:56:11
netty内存管理思想 PooledByteBufAllocate PoolChunk Chunk初始化 PoolChunk分配内存 netty内存管理思想 java作为一门拥有GC机制的语言,长久以来它的使用者都不必手动管理内存,这比起c/c++是一个巨大的进步。但现在netty却反其道而行之,实现了一套不依赖GC而自行管理内存的机制。 那么netty为什么要这么做?众所周知netty是一个网络通信层框架,涉及到大量IO操作,对于此类操作,DirectByteBuffer无疑比起堆内存有更多性能上的优势。而与此同时,DirectByteBuffer也有自身的不足,那就是它的申请和释放成本更高。如果直接交给JVM管理,频繁的GC将使DirectByteBuffer的优势荡然无存。所以,对DirectByteBuffer进行池化管理,多次重用以减少申请、释放的想法就比较自然了。但是,不同于一般于我们常见的对象池、连接池等池化的案例,ByteBuffer有大小一说,且申请多大的内存进行管理也难以确定,如果大了会浪费,小了会导致频繁扩容和内存复制以及碎片化。因此netty需要在解决高效分配内存的同时又解决内存碎片化的问题,显然,它使用的算法就非常具有学习价值了。 由于内存管理有许多概念,有必要在前期做一些准备工作以帮助理解。 首先,考虑到netty是一个多线程环境

Nginx内存池源码解读

孤街醉人 提交于 2020-01-25 08:13:08
首先解释一下Nginx内存池的结构: 内存池接口概览 //内存池创建,重置和销毁 ngx_pool_t * ngx_create_pool ( size_t size , ngx_log_t * log ) ; void ngx_destroy_pool ( ngx_pool_t * pool ) ; void ngx_reset_pool ( ngx_pool_t * pool ) ; //内存分配 void * ngx_palloc ( ngx_pool_t * pool , size_t size ) ; void * ngx_pnalloc ( ngx_pool_t * pool , size_t size ) ; void * ngx_pcalloc ( ngx_pool_t * pool , size_t size ) ; void * ngx_pmemalign ( ngx_pool_t * pool , size_t size , size_t alignment ) ; ngx_int_t ngx_pfree ( ngx_pool_t * pool , void * p ) ; //内存池clean资源 ngx_pool_cleanup_t * ngx_pool_cleanup_add ( ngx_pool_t * p , size_t size ) ; void

python 第六章 小数据池+深浅拷贝+集合

本小妞迷上赌 提交于 2020-01-25 02:54:21
python 第六章 小数据池 # == 判断两边内容是否相等 a = 10 b = 10 print(a == b)# 判断a是否等于b # 输出 True # is 是 基于内存地址进行判断,用id判断 # 相同输出相同内容,否则输出id不同 # pring(id(数据类型)) # 查看内存地址 a = 10 b = 10 print(id(a)) # 输出4401028560 print(id(b)) # 输出4401028560 print(a is b) # 输出False # 代码块 -- 一个文件,函数,类,模块,终端的每一行 # 代码块支持范围: # 数字: # 同一代码块下,只要内容相同就采用相同的内存地址,-5以后就不是,正无穷 # 在做乘法的时候范围 -5~256 *** # 在做乘法的时候不能使用浮点系 # # 字符串: # 同一代码块下,只要内容相同就采用相同的内存地址 # 乘法的时候总长度不能超过20 # 乘法的时候中文,特殊符号只能乘以1或0 # # 布尔值: # 同一代码块下,只要内容相同就采用相同的内存地址 # # # 小数据池 -- 缓存机制(驻留机制) # 小数据池支持的范围 # 数字: # -5~256 *** # # # 字符串: # 同一代码块下,只要内容相同就采用相同的内存地址 # 乘法的时候总长度不能超过20 *** #

Python基础之小数据池及深浅拷贝

核能气质少年 提交于 2020-01-20 00:31:00
一、小数据池 == (等于) == 官方:判断等号两边的内容是否相同 ​ 白话:判断两个人长得是不是一样 is ​ 官方:判断两边的内容是不是一个 ​ 白话:判断这两个人是不是一个人 a = 10000 b = 10000 print(a == b) is 是通过内存地址进行判断 print(id(a),id(b)) 输出结果 ,内存地址一致 代码块:一个py文件,一个函数,一个模块,一个类,交互模式(终端)下的每一行 先执行代码块,然后小数据池! 代码块机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象, 满足缓存机制则他们在内存中只存在一个,即:id相同。 终端中测试的是小数据池缓存机制: ​ 数字: -5 ~ 256 ​ 字符串: ​ 定义时内容(除去中文,特殊符号)长度不限,内容相同,就进行驻留。 ​ python 3. 6解释器字符串进行乘法时(不能有中文和特殊符号),总长度不能超过20 ​ python 3. 7解释器字符串进行乘法时

nginx 内存池

谁说我不能喝 提交于 2020-01-16 11:22:43
目录 简述 几种数据结构 对外的方法 总结 参考 https://www.cnblogs.com/xiekeli/archive/2012/10/17/2727432.html?tdsourcetag=s_pctim_aiomsg 源码版本 nginx-1.12.2 简述 nginx 是一个http , 反向代理等的服务器,以其高效,稳定,低内存闻名。最具特点的是它不是以线程方式处理请求,而是采用了一种事件驱动异步架构的方式。这也就要求 整个内存池可以看作是由一个个内存块组成的链表。 几种数据结构 对外的方法 ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log);//创建内存池 void * ngx_palloc(ngx_pool_t *pool, size_t size);//内存申请(对齐) void * ngx_pnalloc(ngx_pool_t *pool, size_t size);//内存申请(不对齐) void * ngx_pcalloc(ngx_pool_t *pool, size_t size);//内存申请,并初始化为0 ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p);//释放内存 void ngx_reset_pool(ngx_pool_t *pool)

小数据池和代码块

帅比萌擦擦* 提交于 2020-01-11 23:20:57
id,is,== 什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存中,那么这个空间是有一个唯一标识的,就好比是身份证号,标识这个空间的叫做内存地址,也就是这个数据(对象)的id,那么你可以利用id()去获取这个数据的内存地址: name = '小冯' print(id(name)) # 1585831283968 == 是比较的两边的数值是否相等,而 is 是比较的两边的内存地址是否相等, 如果内存地址相等,那么这两边其实是指向同一个内存地址 a = 100 b = 100 print(a is b) # True 可以说如果内存地址相同,那么值肯定相同,但是如果值相同,内存地址不一定相同。 代码块 代码块:一个文件,一个函数,一个类,一个模块,终端中每一个行是一个代码块 前提条件:在同一个代码块内 非乘法得到的字符串都满足代码块的缓存机制: s1 = '@!#*qwe' s2 = '@!#*qwe' print(s1 is s2) # True 乘法得到的字符串分两种情况: 乘数为1时,任何字符串满足代码块的缓存机制: b1 = '@5847395QQ0743895*&^%$#((&_+(())' *1 a1 = '@5847395QQ0743895*&^%$#((&_+(())' *1 print(a1 is b1) #