bluestore自己管理裸盤的塊裝置,管理空閒空間的類是freelistmanager,所有的塊組成乙個bitmap,0為空閒,1為使用。
freelistmanager *freelistmanager::create(
cephcontext* cct,
string type,
keyvaluedb *kvdb,
string prefix)
從freelistmanager 的create函式可以看出目前空閒list只能由bitmapfreelistmanager 來管理,也就是說type只能是bitmap,否則會返回null
int bitmapfreelistmanager::create(uint64_t new_size, uint64_t min_alloc_size,
keyvaluedb::transaction txn)
dout(10) << __func__
<< " size 0x" << std::hex << size
<< " bytes_per_block 0x" << bytes_per_block
<< " blocks 0x" << blocks
<< " blocks_per_key 0x" << blocks_per_key
<< std::dec << dendl;
return 0;
}從bitmapfreelistmanager的create函式可以看出,塊裝置的元資料是用kv儲存的,預設有四個key,分別是bytes_per_block/blocks_per_key
/blocks/size
bitmapfreelistmanager 提供的申請塊裝置和釋放塊裝置的函式分別如下:可以看到無論申請還是釋放 都是通過xor來進行的
void bitmapfreelistmanager::allocate(
uint64_t offset, uint64_t length,
keyvaluedb::transaction txn)
void bitmapfreelistmanager::release(
uint64_t offset, uint64_t length,
keyvaluedb::transaction txn)
我們看看xor的實現
在xor中會針對申請的塊裝置的起始位址和size 來判斷要申請的塊裝置屬於哪個塊裝置組
我們這裡以最簡單的case為例,即要申請的塊裝置在同乙個組內
void bitmapfreelistmanager::_xor(
uint64_t offset, uint64_t length,
keyvaluedb::transaction txn)
string k;
make_offset_key(first_key, &k);
bufferlist bl;
dout(30) << __func__ << " 0x" << std::hex << first_key << std::dec << ": ";
bl.hexdump(*_dout, false);
*_dout << dendl;
#這裡的merge操作也是xor操作,表示和目前的value 來xor操作
txn->merge(bitmap_prefix, k, bl);
} else
從下面這個函式知道merge操作其實是呼叫xormergeoperator 來進行的
void bitmapfreelistmanager::setup_merge_operator(keyvaluedb *db, string prefix)
而xormergeoperator 的merge操作如下:可以看到也是進行xor操作
struct xormergeoperator : public keyvaluedb::mergeoperator
void merge(
const char *ldata, size_t llen,
const char *rdata, size_t rlen,
std::string *new_value) override
} }
空閒記憶體管理
學習自 現代作業系統 作業系統在動態分配記憶體時 malloc,new 需要對空間記憶體進行管理。一般採用了兩種方式 點陣圖和空間鍊錶。1 使用點陣圖的儲存管理 記憶體被劃分為若干個幾位元組大小的分配單元,每個分配單元是否是空閒的情況採用點陣圖來進行描述,如果已分配,相應位置1,未分配,置0。當需要...
作業系統的空閒記憶體管理
動態分配記憶體時,作業系統必須對空閒記憶體進行管理。使用點陣圖時,記憶體可能被劃分為很多個分配單元,每個分配單元對應點陣圖中的一位,0 表示空閒,1 表示占用。使用點陣圖時,關鍵問題在於分配單元大小的設計。分配單元越小,越可以精細分配記憶體。但這也意味著點陣圖越大,消耗的空間越大。使用鍊錶時,鍊錶中...
管理資料塊空間
使用資料塊引數 1.建立物件時指定快空間引數 當建立物件時,可以使用所有塊空間引數 當建立索引時,只能設定桉樹pctfree和initrans,而不能指定pctused引數。create cluster dept emp clu deptno number 3 pctfree 20 pctused ...