内存池

不管是在面试中还是在项目中,都会遇到很多内存池的问题,下面就我项目中遇到的内存池做个记录,备忘。

内存池用链表存储内存段指针,每个内存节点的长度是固定的,存储的结构包括:

1.内存节点大小,内存节点个数,内存中常驻的节点数,这些是在内存池构造的时候初始化的。

2.当前节点编号,当前内存指针,当前节点剩余的内存长度,内存池中已有的节点数

3.指针数组,存储指向内存的指针;存储额外大空间的指针链表,当前使用内存的大小

内存池不会一开始就申请内存,会随着程序的执行,进行内存的分配。

内存池初始化时会指定bufferlist的节点数,节点buffer的大小和最小的节点数(在释放内存节点时,保留最小节点数)。

分配内存时,如果大于节点buffer的大小,回申请一块大的内存放到larger_list中。如果当前节点剩余buffer不够用,会用下一个节点,如果下一个节点不存在,就申请一块内存连接到buffer_list中。

释放时,整个larger_list全部释放,buffer_list会保留内存常驻的节点数,其余的释放。

 

例如上图:

内存池的节点数是10,内存中常驻的节点数是2,内存节点大小是1024,当前节点编号是2,当前节点剩余长度是700,内存池中已有的节点数是5,

假设要申请1000大小的buffer,则返回buffer_list中第4个节点的指针

假设要申请100大小的buffer,则返回当前内存的指针

假设要申请2048大小的buffer,则要申请2048大小的buffer连接到larger_list尾部,返回指针。

如果buffer_list满了,返回错误。

 

posted @ 2018-01-31 15:07  keke_hi  阅读(147)  评论(0)    收藏  举报