所谓动态内存管理,无非也就是内存的申请与释放。本文也是记录一下 Swoole 在实现上具体是怎么设计的,其实从文件名上就可以看出大体划分。本文首先看一下整体设计,然后依次看一下各部分具体实现。

占坑,有空了再写完。。。。

整体设计

整体逻辑用一张结构图来表示就很清晰:

classDiagram direction LR class MemoryPool { virtual void *alloc(uint32_t size) = 0; virtual void free(void *ptr) = 0; } class GlobalMemory class FixedPool class RingBuffer MemoryPool <|-- GlobalMemory: 继承 MemoryPool <|-- FixedPool: 继承 MemoryPool <|-- RingBuffer: 继承 class SharedMemory class Buffer class Table GlobalMemory ..> SharedMemory: 可能用到 FixedPool ..> SharedMemory: 可能用到 RingBuffer ..> SharedMemory: 可能用到 Buffer ..> SharedMemory: 可能用到 Table ..> SharedMemory: 可能用到

所以接下来先分析抽象基类和 SharedMemory ,然后依次看看 GlobalMemoryFixedPoolRingBufferBufferTable

抽象基类 MemroyPool

公用类 SharedMemory

五种动态内存管理模式

GlobalMemory

只申请不释放。

FixedPool

固定大小的 slice 申请,双向链表保存,alloc 从头申请,申请 ok 取出来插入尾部。释放时先取出,取出后放到头部。那自然头部不是可用的就满了。

RingBuffer

比较奇怪的设计,每次获取都是接着向后取内存,释放都是简单的置为闲置状态,由 collect 负责整理。每次 collect 也是从上次的地方顺序往前推,知道确认被申请的都回收了,重置为初始状态。个人认为没有起到 RingBuffer 名字的效果。

Buffer

初始化后主要用来 append / pop 。自己提了 PR 也修了 bug ,比较熟悉。

Table

一种为 ext 提供的数据结构,直接服务 php-ext 。

设计用途

实现方案

总结