loki::allocator

发布时间 2023-08-23 10:13:25作者: stu--wy

 

  • 三个class,第一层是chunk,第二层是vector<chunk> FixedAllocator,第三层是vector<vector<chunk>> SmallObjallocator。第一层的chunk负责实际内存的管理,一个chunk管理一个unsigned char[blockSize * blocks]数组,第二层的vector<chunk>管理相同大小区块的内存,第三层vector<vector<chunk>>管理不同大小区块所有的内存。
  • chunk中含有 指向区块的指针pData &  firstAvailableBlock 下一个分配区块索引值 & blocksAvailable 未分配区块数量。借用区块数组中的第一个byte做索引值(类似于嵌入式指针),初始化流水号标识索引,通过索引值组织成单向链表。firstAvailableBlock链表头索引,分配的时候,取出链表头索引对应的区块,然后更新链表头索引;释放一个区块的时候,先计算出释放的区块对应的索引值,然后更新链表头索引,类似头插法。判断是否还能分配或者全回收看blocksAvailable值。
  • FixedAllocator 中有指向分配和释放的两根指针(标出最近有分配动作的chunk,标出最近有释放动作的chunk)和 vector<chunk>。分配时候首先查看最近有分配动作的chunk是否还有空闲区块,如果没有就for遍历,找到就分配,找不到就再push_back一个chunk到该vector<chunk>中,交给下一层做分配动作。释放先找到释放的区块是在哪一个chunk中,然后交给下一层做释放区块动作。
  • SmallObjallocator 层管理不同大小区块所有的内存,每一个vector<chunk> 负责不同大小区块的管理。
  • 特点:精简强悍,使用索引实现链表,有缓式回收设计。使用容器作为设计基础,设计出来的分配器也为容器服务,两者不相干扰。