leveldb原始碼 資料結構之Arena

2021-08-25 02:51:34 字數 1233 閱讀 9421

leveldb中的記憶體管理主要是通過arena。arena管理記憶體的思想是用乙個vector來管理申請的block

// array of new allocated memory blocks

std::vectorblocks_;

每個block的大小為4096byte。

用char*型別的alloc_ptr_指向block中可用的剩餘記憶體的首位址,size_t型別的alloc_bytes_remaining_管理block中剩餘記憶體的數量。

// allocation state

char* alloc_ptr_; // 剩餘可分配的記憶體的首位址

size_t alloc_bytes_remaining_; // 剩餘記憶體數量

申請記憶體的原則:

1、如果需要使用的記憶體小於剩餘記憶體,直接分配

inline char* arena::allocate(size_t bytes) 

// 大於

return allocatefallback(bytes);

}

2、 如果大於剩餘記憶體並大於1/4 的blocksize,直接分配一塊block,上一塊block中剩餘的仍可以使用(即alloc_ptr_所指向的位址仍為上一塊未使用完的block中剩餘的首位址)

3、如果大於剩餘記憶體並小於等於1/4的blocksize,分配一塊新的block,上一塊block中剩餘的不使用(上一塊block中剩餘的記憶體小於1/4的blocksize,直接浪費了)

char* arena::allocatefallback(size_t bytes) 

// we waste the remaining space in the current block.

// 如果小於等於1/4的blocksize,分配一塊新的block

// 上一塊block中剩餘的不使用(直接浪費浪費了)

alloc_ptr_ = allocatenewblock(kblocksize);

alloc_bytes_remaining_ = kblocksize;

char* result = alloc_ptr_;

alloc_ptr_ += bytes;

alloc_bytes_remaining_ -= bytes;

return result;

}

Redis原始碼 資料結構之Adlist雙端鍊錶

鍊錶節點定義 typedef struct listnode listnode 鍊錶定義 typedef struct list list 其中的三個函式指標先不用管,後面遇到了再看具體是幹什麼的,另外還實現了乙個迭代器,有點c 的味道在裡面 typedef struct listiter list...

LevelDB原始碼剖析之Memtable 1

memtable是leveldb很重要的一塊,leveldb的核心之一。我們肯定關注kv資料在memtable中是如何組織的,秘密在skip list中。在leveldb中,所有記憶體中的kv資料都儲存在memtable中,物理disk則儲存在sstable中。在系統執行過程中,如果memtable...

leveldb原始碼分析之Arena

arena 是 leveldb 專案裡面使用的輕量級的記憶體池物件,leveldb 用這個物件來管理記憶體的分配,簡化了 new 和 delete 的呼叫,我們也可以從這個輕量級的記憶體池物件學習 google 大神工程師是如何管理記憶體的。arena 記憶體管理模型 arena 使用下面幾個成員變...