Swoole 源码分析3 - 动态内存管理
所谓动态内存管理,无非也就是内存的申请与释放。本文也是记录一下 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
,然后依次看看 GlobalMemory
、 FixedPool
、 RingBuffer
、 Buffer
和 Table
。
抽象基类 MemroyPool
公用类 SharedMemory
五种动态内存管理模式
GlobalMemory
只申请不释放。
FixedPool
固定大小的 slice 申请,双向链表保存,alloc 从头申请,申请 ok 取出来插入尾部。释放时先取出,取出后放到头部。那自然头部不是可用的就满了。
RingBuffer
比较奇怪的设计,每次获取都是接着向后取内存,释放都是简单的置为闲置状态,由 collect 负责整理。每次 collect 也是从上次的地方顺序往前推,知道确认被申请的都回收了,重置为初始状态。个人认为没有起到 RingBuffer 名字的效果。
Buffer
初始化后主要用来 append / pop 。自己提了 PR 也修了 bug ,比较熟悉。
Table
一种为 ext 提供的数据结构,直接服务 php-ext 。
设计用途
实现方案
总结
- ⇦ Swoole 源码分析2 - 线程锁的封装
- 没有了 ⇨
分类: 编程
标签: Swoole 源码分析