leveldb原始碼分析 記憶體池 Arena

2021-09-25 07:31:12 字數 1284 閱讀 3682

模組資訊

util/arena.h

util/arena.cc

模組概要

用於實現乙個簡單的記憶體池,有兩種記憶體分配方式,一種是普通分配,一種是對齊分配

主要介面

方法說明

char* arena::allocate(size_t bytes)

普通方式分配記憶體

char* arena::allocatealigned(size_t bytes)

對齊方式分配記憶體

char* arena::allocatefallback(size_t bytes)

記憶體追加

char* arena::allocatenewblock(size_t block_bytes)

建立新的記憶體塊

原始碼分析

arena::allocate

inline char* arena::allocate(size_t bytes) 

//否則要新申請空間

return allocatefallback(bytes);

}

arena::allocatefallback
char* arena::allocatefallback(size_t bytes) 

//如果需求空間比剩餘空間大,且需求空間小於1k,這也說明剩餘空間比1k小,就可以申請塊大小的空間

//雖然也會浪費部分空間,但是浪費的空間小於1k

alloc_ptr_ = allocatenewblock(kblocksize);

alloc_bytes_remaining_ = kblocksize;

char* result = alloc_ptr_;

alloc_ptr_ += bytes;

alloc_bytes_remaining_ -= bytes;

return result;

}

arena::allocatenewblock
char* arena::allocatenewblock(size_t block_bytes)
arena::allocatealigned
char* arena::allocatealigned(size_t bytes)  else 

assert((reinterpret_cast(result) & (align - 1)) == 0);

return result;

}

to_do

leveldb原始碼分析之記憶體池Arena

這篇部落格主要講解下leveldb記憶體池,記憶體池很多地方都有用到,像linux核心也有個記憶體池。記憶體池的存在主要就是減少malloc或者new呼叫的次數,較少記憶體分配所帶來的系統開銷。arena類採用vector來儲存每次分配記憶體的指標,每一次分配的記憶體,我們稱為乙個塊block。bl...

leveldb原始碼分析1

leveldb是乙個key value型的儲存引擎,由google開發,並宣布在bsd許可下開放源 plain git clone plain cd leveldb make all 此時生成libleveldb.a庫檔案。拷貝leveldb的標頭檔案到 usr include下 plain cp ...

levelDB原始碼分析 SSTable

sstable是bigtable中至關重要的一塊,對於leveldb來說也是如此,對leveldb的sstable實現細節的了解也有助於了解bigtable中一些實現細節。本節內容主要講述sstable的靜態布局結構,sstable檔案形成了不同level的層級結構,至於這個層級結構是如何形成的我們...