内存池数据结构

内存池(定长)

内存池是由一个个固定大小的内存块组成,所以应用每次获取的内存块长度是固定的。

常见内存池形状:

此内存池方案参考来源为 RT-Thread 的内存管理方案,同时也是市面上大部分的内存池解决类似方案。

             内存块1                            内存块2                                            内存块n
       +----------------+                +----------------+                                  +----------------+
pool1  | 指针位 | 数据块 |---物理连续----> | 指针位 | 数据块 |--物理连续-->   ...  --物理连续--> | 指针位 | 数据块 |     
       +----------------+                +----------------+                                  +----------------+

             内存块1                            内存块2                                            内存块n
       +----------------+                +----------------+                                  +----------------+
pool2  | 指针位 | 数据块 |---物理连续----> | 指针位 | 数据块 |--物理连续-->   ...  --物理连续--> | 指针位 | 数据块 |     
       +----------------+                +----------------+                                  +----------------+
       

pooln  ...

一般用户只会使用到一个内存池,也就是上图中的 pool1。

一个池子内的所有内存块都是物理上连续的,但常常会出现**“使用中”“空闲中”**的内存块并不刚好是物理有序的前后状态。比如内存块1使用中,内存块2空闲,内存块3使用中……

上述情况下,当用户需要获取一个空闲的内存块时,若是按物理连续的逻辑来找**“空闲中”的内存块,无论使用任何搜索办法,都无法达到 O(1) 的查找效率。那么,内存块中的指针位在这时就发挥作用了,我们可以将一个池子中的“空闲中”**内存块用一个链表串起来。程序某时刻链表的形象图如下:

                               +-----------------------+
                               |                       |
            block 4            |     block 1           v     block x
       +----------------+      +----------------+      +----------------+
pool1  | 指针位 | 数据块 |      | 指针位 | 数据块 |      | 指针位 | 数据块 |          NULL
       +----------------+      +----------------+      +----------------+           ^
       |                       ^                       |                            |
       |                       |                       |                            |
       +-----------------------+                       +----------------------------+

这样一来,每次获取空闲块直接从表头拿就行了,时间复杂的是明确的 O(1)。被分离出的空闲块指针位指向 pool 对象本体,便于后续“物归”时找到“原主”

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值