leveldb第二章 Arena 内存池原理

 

我相信很多人都听到过线程池,内存池这种概念。

你说我知道吗,抱歉,我也不知道。

所以今天一起来学习一下。

为什么讲leveldb先讲内存池呢?

因为源码中,我先看了SkipList其中涉及Arena,所以我就先讲这个了。

1. 什么叫Arena

我一开始看到这个单词,我连它的意思都不知道,去谷歌一下原来中文叫——竞技场。

好吧,跟内存还是没有半毛钱关系,只能硬记了!

什么叫内存池

一种预先分配一大块内存并且可以重复利用的技术。

有什么用

提高内存分配效率,减少内存碎片。

2. 传统的内存池

2.1 为什么要建立内存池

要了解为什么要建立内存池,我们先要知道,传统的C/C++怎么使用内存。

我们知道,C、C++在使用时会频繁的使用 malloc/free 或者 new/delete 来进行内存的分配和释放。

从操作系统角度来看,会产生一些问题:

  1. 性能问题:
    • malloc/free 设计操作,涉及复杂的数据管理和系统调用,影响性能。其次频繁地分配/释放内存,malloc可能会变慢。
  2. 内存碎片:
    • 用free或delete释放的内存块不连续,导致系统内存碎片化,影响大内存块的分配。
  3. 不可预测的延迟:
    • 内存操作执行时间不稳定,对低延迟的场景不友好。

所以为了应对以上的一些问题,内存池技术随着产生。

2.2 传统内存池的原理(leveldb的不是这个)

注意,其实leveldb中的内存池设计不同于传统的,下一节讲解。

一般的内存池:

预先分配一块大内存,并在程序运行过程中重复利用这块内存,而不是每次都去malloc/free申请和释放。

基本步骤

  1. 初始化
    • 向系统申请一大块内存(比如 1MB)
    • 将这块大内存分成固定大小的小块(比如 256KB 一块)
  2. 分配(allocate)
    • 当需要内存时,从内存池里取出一块
  3. 释放(deallocate)
    • 内存释放时,并不真正free(),而是放回池中,以便下次复用
  4. 销毁
    • 退出程序或者不需要内存池时,才真正free()整个内存池

ok,这就是简单讲解了一下传统内存池的原理,实现步骤。

下一节开始,我们将正式讲解leveldb中Arena的实现。

参考
  1. 《精通leveldb》
  2. chatgpt