我相信很多人都听到过线程池,内存池这种概念。
你说我知道吗,抱歉,我也不知道。
所以今天一起来学习一下。
为什么讲leveldb先讲内存池呢?
因为源码中,我先看了SkipList其中涉及Arena,所以我就先讲这个了。
1. 什么叫Arena
我一开始看到这个单词,我连它的意思都不知道,去谷歌一下原来中文叫——竞技场。
好吧,跟内存还是没有半毛钱关系,只能硬记了!
什么叫内存池
一种预先分配一大块内存并且可以重复利用的技术。
有什么用
提高内存分配效率,减少内存碎片。
2. 传统的内存池
2.1 为什么要建立内存池
要了解为什么要建立内存池,我们先要知道,传统的C/C++怎么使用内存。
我们知道,C、C++在使用时会频繁的使用 malloc/free 或者 new/delete 来进行内存的分配和释放。
从操作系统角度来看,会产生一些问题:
- 性能问题:
- malloc/free 设计操作堆,涉及复杂的数据管理和系统调用,影响性能。其次频繁地分配/释放内存,malloc可能会变慢。
- 内存碎片:
- 用free或delete释放的内存块不连续,导致系统内存碎片化,影响大内存块的分配。
- 不可预测的延迟:
- 内存操作执行时间不稳定,对低延迟的场景不友好。
所以为了应对以上的一些问题,内存池技术随着产生。
2.2 传统内存池的原理(leveldb的不是这个)
注意,其实leveldb中的内存池设计不同于传统的,下一节讲解。
一般的内存池:
预先分配一块大内存,并在程序运行过程中重复利用这块内存,而不是每次都去malloc/free申请和释放。
基本步骤
- 初始化
- 向系统申请一大块内存(比如 1MB)
- 将这块大内存分成固定大小的小块(比如 256KB 一块)
- 分配(allocate)
- 当需要内存时,从内存池里取出一块
- 释放(deallocate)
- 内存释放时,并不真正free(),而是放回池中,以便下次复用
- 销毁
- 退出程序或者不需要内存池时,才真正free()整个内存池
ok,这就是简单讲解了一下传统内存池的原理,实现步骤。
下一节开始,我们将正式讲解leveldb中Arena的实现。
参考
- 《精通leveldb》
- chatgpt
PREVIOUSleveldb第一章 leveldb是什么