LevelDB 源码分析 (二)
内存管理 - Arena
内存频繁创建和释放的地方一定会有内存池的出现,如在 levelDB 中 im/memtable 组件中,会有大量内存创建(数据的持续 put)和释放(dump到磁盘后释放内存)。其基本原理为:
levelDB 中内存管理的 component 为 Arena
,其成员变量在 arena.h
中,log_format.h
中规定其块大小为 4K: kBlockSize=32768
。
在实现 Arena (arena.cc
)中,当内存剩余字节数小于所需分配时,根据所需分配字节是否大于 $kBlockSize/4$ 来确定是否需要使用当前块的剩余字节。
引用计数
levelDB 中,memtable/version 等组件可能被多个线程共享,不能直接删除。而是需要等到无线程占用时,才能删除。
Key 和 Compare
前置知识
SequenceNumber
递增的 uint64 整数,相同 key 按照其降序,最大值为:
1
2
3// We leave eight bits empty at the bottom so a type and sequence#
// can be packed together into 64-bits.
static const SequenceNumber kMaxSequenceNumber = ((0x1ull << 56) - 1);计算方式: WriteBatch + 1
kValueTypeForSeek
记录当前操作类型,后续压缩根据这个类型作相应操作
各类 key
dbformat.h
关于 key 的关系表示为:
各类 compare
comparator.h
levelDB 中,通过基类 Comparator 作 key 之间的比较,用于插入 key 和删除 key 的操作。
疑问
- DecodeFixed64 是做什么的
- seq 和 type 分别用于表示?
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Sicilienne!
评论
Valine# ValineDisqus