《Ceph源碼分析》——第2章,第2節Buffer

本節書摘來自華章出版社《Ceph源碼分析》一書中的第2章,第2.2節Buffer,作者常濤,更多章節內容可以訪問云棲社區“華章計算機”公眾號查看

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 {
public:

char *data;      //數據指針
unsigned len;    //數據長度
atomic_t nref;   //引用計數`mutable RWLock crc_lock;   //讀寫鎖,保護crc_map
map<pair<size_t, size_t>, pair<uint32_t, uint32_t> > crc_map;
//crc校驗信息,第一個pair為數據段的起始和結束(from,to),第二個pair是crc32校驗碼,pair的第一字段為base crc32校驗碼,第二個字段為加上數據段后計算出的crc32校驗碼。

……
}
下列類都繼承了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 {
raw *_raw;
unsigned _off, _len;
……
}`
ptr是raw里的一個任意的數據段,_off是在_raw里的偏移量,_len是ptr的長度。raw和ptr的示意圖如圖2-1所示。
圖2-1 raw和ptr示意圖


f10e533701339fc790de68b22cc0f1b93f370d17

2.2.3 buffer::list
類buffer::list是一個使用廣泛的類,它是多個buffer::ptr的列表,也就是多個內存數據段的列表。結構如下:
`class CEPH_BUFFER_API list {
std::list _buffers; //所有的ptr
unsigned _len; //所有的ptr的數據總長度
unsigned _memcopy_count; //當調用函數rebuild用來內存對齊時,需要內存拷貝的數據量
ptr append_buffer; //當有小的數據就添加到這個buffer里
mutable iterator last_p; //訪問list的迭代器
……
}`
buffer::list的重要的操作如下所示。
添加一個ptr到list的頭部:
`void push_front(ptr& bp) {
if (bp.length() == 0)

return;

_buffers.push_front(bp);
_len += bp.length();
}`
添加一個raw到list頭部中,先構造一個ptr,后添加list中:
`void push_front(raw *r) {
ptr bp(r);
push_front(bp);
}`
判斷內存是否以參數align對齊,每一個ptr都必須以align對齊:
`bool buffer::list::is_aligned(unsigned align) const
{
for (std::list::const_iterator it = _buffers.begin();

it != _buffers.end();
++it) if (!it->is_aligned(align))
return false;
return true;

}`
添加一個字符到list中,先查看append_buffer是否有足夠的空間,如果沒有,就新申請一個4KB大小的空間:
``void buffer::list::append(char c)
{
// 檢查當前的append_buffer是否有足夠的空間
unsigned gap = append_buffer.unused_tail_length();
if (!gap) {

// 如果沒有空間,就申請一個append_buffer!

append_buffer = create_aligned(CEPH_BUFFER_APPEND_SIZE,

                             CEPH_BUFFER_APPEND_SIZE);
append_buffer.set_length(0);   //到目前為止,沒有用到

}`

append(append_buffer, append_buffer.append(c) - 1, 1);
// 把該數據段添加到append_buffer中

}``
內存對齊:有些情況下,需要內存地址對齊,例如當以directIO方式寫入數據至磁盤時,需要內存地址按內存頁面大小(page)對齊,也即buffer::list的內存地址都需按page對齊。函數rebuild用來完成對齊的功能。其實現的方法也比較簡單,檢查沒有對齊的ptr,申請一塊新對齊的內存,把數據拷貝過去,釋放內存空間就可以了。
buffer::list還集成了其他額外的一些功能:
把數據寫入文件或從文件讀取數據的功能。
計算數據的crc32校驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282181.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282181.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282181.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

eclipse在server中tomcat server找不到的問題

想要在eclipse的server新建tomcat服務器然而不知道怎么回事找不到Tomcat 7.0 Server 下面的紅圈是tomcat server服務器&#xff08;更新后才出現&#xff09; 網上找的很久&#xff0c;只是找到在eclipse中安裝tomcat插件的方法 Tomcat免安裝版的環境變量配置以及Eclipse下的To…

Sysbench 1.0.15安裝及使用

Sysbench是一款開源的多線程性能測試工具&#xff0c;可以執行CPU/內存/線程/IO/數據庫等方面的性能測試&#xff0c;數據庫目前支持MySQL/Oracle/PostgreSQL。 一、安裝&#xff1a; Github地址&#xff1a;https://github.com/akopytov/sysbench RHEL/CentOS&#xff1a; cur…

PHP根據指定url生成二維碼圖片

一、composer安裝 http://packagist.p2hp.com/packages/codeitnowin/barcode 二、使用 調用generateQrCode()方法即可實現生成二維碼圖片并輸出下載給用戶 <?php namespace manage\Test;use CodeItNow\BarcodeBundle\Utils\QrCode; use common\extensions\Helper; use y…

CA 周記 - 派福利!通過 Azure 零成本進入 CUDA 編程

我們在配置深度學習環境的時候&#xff0c;除了安裝各種庫和框架外&#xff0c;如果需要 GPU 加速&#xff0c;還需要配置 CUDA 。那 CUDA 是什么 &#xff1f;它的作用是什么 &#xff1f;CUDA 編程介紹01什么是 CUDA&#xff1f;CUDA (Compute Unified Device Architecture) …

《視圖更新與關系數據庫理論》——2.1 關系和關系變量

本節書摘來自異步社區出版社《視圖更新與關系數據庫理論》一書中的第2章&#xff0c;第2.1節&#xff0c;作者&#xff1a;【美】C.J. Date&#xff08;達特&#xff09;&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.1 關系和關系變量 每一個關系都有一…

盜取手機敏感信息,Android 6.0之上兼容

盜取手機敏感信息&#xff0c;Android 6.0之上兼容 項目介紹 盜取信息包含&#xff1a; 手機中所有照片手機中所有視頻手機中所有通訊錄手機中所有短信手機中所有通話記錄手機中所有安裝應用兼容Android 6.0及之上版本動態權限申請工具開放效果展示 1.照片信息 MaterialBean{mL…

再記一次Memory Leak分析

性能是優化出來的&#xff0c;不管是在上生產前&#xff0c;還是在上生產后。大部分性能在性能測試階段就能發現問題&#xff0c;但也有一些性能問題&#xff0c;結合生產的環境&#xff0c;生產數據才能表現出來&#xff0c;成為一個顯著的瓶頸。這次是生成pdf造成的內存泄露&…

PHP格式化全國省市區列表

一、代碼部分 /*** 獲取全國省市區列表&#xff08;格式化后&#xff09;*/public function getRegionList(){$data CoreRegion::find()->select([national_code, region_name, parent_id, region_level])->asArray()->all();$data $this->assembleRegionData($…

《C語言開發從入門到精通》一2.4 技術解惑

本節書摘來自異步社區《C語言開發從入門到精通》一書中的第2章&#xff0c;第2.4節&#xff0c;作者王長青 , 韓海玲&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.4 技術解惑 2.4.1 安裝Visual Studio的幾個常見問題 Visual Studio 2010容量巨大&…

POM思想__首頁頁面元素查找、功能點實現進行封裝

一、代碼如下 package www.gui.huohu.pom;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.sele…

061_Apex 異常捕捉

Trigger 中的錯誤處理 在 Trigger 中&#xff0c;我們可以為進行操作的數據進行驗證&#xff0c;類似于驗證規則。如果遇到不符合條件的數據&#xff0c;可以通過 addError() 函數來將錯誤顯示給用戶&#xff0c;并記錄日志。 在如下代碼中&#xff0c;當一個“業務機會”對象被…

從 C# 崩潰異常 中研究 頁堆 布局

一&#xff1a;背景 1.講故事最近遇到一位朋友的程序崩潰&#xff0c;發現崩潰點在富編輯器 msftedit 上&#xff0c;這個不是重點&#xff0c;重點在于發現他已經開啟了 頁堆 &#xff0c;看樣子是做了最后的掙扎。0:000> !analyze -v EXCEPTION_RECORD: (.exr -1) Except…

Win10筆記本不顯示wifi列表

一、問題描述 1、連接有線網絡時&#xff0c;只顯示連接到的有線網絡&#xff0c;而不顯示wifi列表 2、不連接有線網絡時&#xff0c;同樣不顯示wifi列表 二、解決方案 1、Win R 打開運行&#xff0c;并輸入services.msc 2、回車確定&#xff0c;找到WLAN AutoConfig項&…

《游戲大師Chris Crawford談互動敘事》一22.1 互動敘事前途無量

本節書摘來異步社區《游戲大師Chris Crawford談互動敘事》一書中的第22章&#xff0c;第22.1節&#xff0c;作者&#xff1a; 【美】Chris Crawford譯者&#xff1a; 方舟 責編&#xff1a; 陳冀康&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 22.1 互動…

交換兩個局部變量Integer的值

反射是很強大的&#xff0c;誰說的final修飾的就不能改變&#xff0c; 通過反射獲取成員變量&#xff0c;之后可以取消訪問修飾符&#xff0c;也就是說private的也可以訪問&#xff0c; 在修改常量&#xff08;final修飾的&#xff09;&#xff0c;之后就可以對其做任何操作了 …

搭建WeApacheb網站服務器

本地yum源安裝mkdir /opt/dvd (先用mkdir去根下opt目錄下建一個名字叫dvd的目錄)mount /dev/sr0 /opt/dvd (用mount命令&#xff0c;掛載光盤設備&#xff08;/dev/sr0&#xff09;,將光盤掛載到剛剛建立的dvd目錄下&#xff08;/opt/dvd&#xff09;)寫yum源配置文件|-cd…

PHP的構成及生命周期

一、PHP開源源代碼下載地址&#xff1a; https://github.com/php/php-src.git 二、PHP的構成 1、目錄結構 2、目錄分析 &#xff08;1&#xff09;sapi目錄是PHP的應用接口層。 &#xff08;2&#xff09;main為php的主要代碼&#xff0c;主要是輸入/輸出、Web通信、PHP框架…

《Adobe After Effects CS6完全剖析》——動畫:最重要的是關系

本節書摘來自異步社區《Adobe After Effects CS6完全剖析》一書中的第2章&#xff0c;動畫&#xff1a;最重要的是關系&#xff0c;作者 【美】Mark Christiansen&#xff08;馬克克里斯琴森&#xff09;&#xff0c;譯者 苗玉敏&#xff0c;郭圣路&#xff0c;曹玉臣&#xff…

Oracle即將發布的全新Java垃圾收集器 ZGC

Java 11的特性集合已經確定&#xff0c;其中包含了一些非常棒的特性。新版本提供了一個全新的垃圾回收器ZGC&#xff0c;它由甲骨文開發&#xff0c;承諾在TB級別的堆上實現非常低的停頓時間。在本文中&#xff0c;我們將介紹甲骨文開發ZGC的動機、ZGC的技術概覽以及ZGC帶來的一…

如何獲取 OSS AccessKeyId、AccessKeySecret

開通阿里云oss&#xff1a;https://www.aliyun.com/product/oss 1、點擊概覽 — AccessKey 注&#xff1a;官方鏈接 2、出現下圖&#xff0c;選擇“開始使用子用戶Access Key” 3、填寫用戶名&#xff0c;并點擊確定 4、這時會給你的手機發送驗證碼確定是本人操作&#xff0c;…