《Ceph原始碼分析》 第2章,第2節Buffer

2021-09-23 16:43:53 字數 1596 閱讀 2626

2.2 buffer

buffer就是乙個命名空間,在這個命名空間下定義了buffer相關的資料結構, 這些資料結構在ceph的源**中廣泛使用。下面介紹的buffer::raw類是基礎類,其子類完成了buffer資料空間的分配,buffer::ptr類實現了buffer內部的一段資料,buffer::list封裝了多個資料段。

2.2.1 buffer::raw

類buffer::raw是乙個原始的資料buffer,在其基礎之上新增了長度、引用計數和額外的crc校驗資訊,結構如下:

`class buffer::raw

下列類都繼承了buffer::raw,實現了data對應記憶體空間的申請:

類raw_malloc實現了用malloc函式分配記憶體空間的功能。

類class buffer::raw_mmap_pages實現了通過mmap來把記憶體匿名對映到程序的位址空間。

類class buffer::raw_posix_aligned呼叫了函式posix_memalign來申請記憶體位址對齊的記憶體空間。

類class buffer::raw_hack_aligned是在系統不支援記憶體對齊申請的情況下自己實現了記憶體位址的對齊。

類class buffer::raw_pipe實現了pipe做為buffer的記憶體空間。

類class buffer::raw_char使用了c++的new操作符來申請記憶體空間。

2.2.2 buffer::ptr

類buffer::ptr就是對於buffer::raw的乙個部分資料段。結構如下:

`class ceph_buffer_api ptr `

ptr是raw裡的乙個任意的資料段,_off是在_raw裡的偏移量,_len是ptr的長度。raw和ptr的示意圖如圖2-1所示。

圖2-1 raw和ptr示意圖

}`新增乙個raw到list頭部中,先構造乙個ptr,後新增list中:

`void push_front(raw *r) `

判斷記憶體是否以引數align對齊,每乙個ptr都必須以align對齊:

`bool buffer::list::is_aligned(unsigned align) const

``記憶體對齊:有些情況下,需要記憶體位址對齊,例如當以directio方式寫入資料至磁碟時,需要記憶體位址按記憶體頁面大小(page)對齊,也即buffer::list的記憶體位址都需按page對齊。函式rebuild用來完成對齊的功能。其實現的方法也比較簡單,檢查沒有對齊的ptr,申請一塊新對齊的記憶體,把資料拷貝過去,釋放記憶體空間就可以了。

buffer::list還整合了其他額外的一些功能:

把資料寫入檔案或從檔案讀取資料的功能。

計算資料的crc32校驗。

《Ceph原始碼分析》 第2章,第1節Object

第2章 ceph通用模組2.1 object 物件object是預設為4mb大小的資料塊。乙個物件就對應本地檔案系統中的乙個檔案。在 實現中,有object sobject hobject ghobject等不同的類。結構object t對應本地檔案系統的乙個檔案,name就是物件名 struct ...

第2章 演算法分析

知識點 2.1 數學基礎 法則1 如果t1 n o f n 且t2 n o g n 那麼 a t1 n t2 n o f n g n 或者t1 n t2 n o max f n g n b t1 n t2 n o f n g n 法則2 如果t n 是乙個k次多項式,則t n n k 法則3 對於任...

第2章 演算法分析

最大子串行和問題的求解 演算法1 時間複雜度為o n 3 1 public static int maxsubsum1 int a 21617 return maxsum 18 演算法2 時間複雜度為o n 2 1 public static int maxsubsum2 int a 216 171...