ceph源码阅读 buffer
ceph::buffer是ceph非常底层的实现,负责管理ceph的内存。ceph::buffer的设计较为复杂,但本身没有任何内容,主要包含buffer::list、buffer::ptr、buffer::hash。这三个类都定义在src/include/buffer.h和src/common/http://buffer.cc中。
buffer::raw:负责维护物理内存的引用计数nref和释放操作。
buffer::ptr:指向buffer::raw的指针。
buffer::list:表示一个ptr的列表(std::list<bufferptr>),相当于将N个ptr构成一个更大的虚拟的连续内存。
buffer::hash:一个或多个bufferlist的有效哈希。
buffer::raw
bufferlist是基于bufferptr和bufferraw实现的,所以先分析buffer::raw。
class raw {public:std::aligned_storage<sizeof(ptr_node),alignof(ptr_node)>::type bptr_storage;char *data;unsigned len;std::atomic<unsigned> nref { 0 };int mempool;std::pair<size_t, size_t> last_crc_offset {std::numeric_limits<size_t>::max(), std::numeric_limits<size_t>::max()};std::pair<uint32_t, uint32_t> last_crc_val;mutable ceph::spinlock crc_spinlock;...
}
成员变量:
data:指向原始数据raw的指针。
len:原始数据raw的长度。
nref:引用计数。
mempool:其对应的内存池的index,这个和data空间的分配有关。
crc_spinlock:读写锁。
buffer::ptr
bufferptr是基于bufferraw,bufferptr是bufferraw的指针,指向buffer::raw的一部分数据段。
class CEPH_BUFFER_API ptr {raw *_raw;public: // dirty hack for testing; if it works, this will be abstractedunsigned _off, _len;...}
成员变量:
_raw:指向raw的指针
_off:数据偏移量
_len:数据长度
buffer::list
在list类前面定义了链表的结构体struct ptr_hook。
struct ptr_hook {mutable ptr_hook* next;ptr_hook() = default;ptr_hook(ptr_hook* const next): next(next) {}};
buffer::list是由ptr组成的链表
class buffers_t {// _root.next can be thought as _headptr_hook _root;ptr_hook* _tail;std::size_t _size;...
}
_root:链表头
_tail:链表尾
_size:链表节点数
bufferlist将数据以不连续链表的方式存储。
bufferlist的迭代器
template <bool is_const>class CEPH_BUFFER_API iterator_impl: public std::iterator<std::forward_iterator_tag, char>{protected:bl_t *bl;list_t *ls; // meh.. just here to avoid an extra pointer dereference..unsigned off; // in bllist_iter_t p;unsigned p_off; // in *p......};
bl:指针,指向bufferlist
ls:指针,指向bufferlist的成员 _buffers
p: 类型是std::list::iterator,用来迭代遍历bufferlist中的bufferptr
p_off:当前位置在对应的bufferptr中的偏移量
off:当前位置在整个bufferlist中的偏移量
buffer常见的函数
void buffer::list::substr_of()
获取子字符串
other:指向原数据的bufferlist指针
off:数据的偏移
len:数据截取长度
void buffer::list::substr_of(const list& other, unsigned off, unsigned len){if (off + len > other.length())throw end_of_buffer();clear();// skip off//curbuf获得other的链表头auto curbuf = std::cbegin(other._buffers);//找到和off对应的链表节点while (off > 0 && off >= curbuf->length()) {// skip this buffer//cout << "skipping over " << *curbuf << std::endl;off -= (*curbuf).length();++curbuf;}ceph_assert(len == 0 || curbuf != std::cend(other._buffers));//截取所需要的长度,创建新的节点加入到链表尾while (len > 0) {// partial?if (off + len < curbuf->length()) {//cout << "copying partial of " << *curbuf << std::endl;_buffers.push_back(*ptr_node::create( *curbuf, off, len ).release());_len += len;break;}// through end//cout << "copying end (all?) of " << *curbuf << std::endl;unsigned howmuch = curbuf->length() - off;_buffers.push_back(*ptr_node::create( *curbuf, off, howmuch ).release());_len += howmuch;len -= howmuch;off = 0;++curbuf;}}
buffer::create_aligned()
预对齐内存的分配
len:分配内存的大小
align:内存对齐的倍数
ceph::unique_leakable_ptr<buffer::raw> buffer::create_aligned(unsigned len, unsigned align) {return create_aligned_in_mempool(len, align,mempool::mempool_buffer_anon);
}
void buffer::list::claim_append(list& bl, unsigned int flags)
将bl的数据复制_buffers的尾部/头部,然后接bl的数据清空。
void buffer::list::rebuild(
std::unique_ptr<buffer::ptr_node, buffer::ptr_node::disposer> nb)
将bufferlist中_buffers链表中所有的ptr中的数据存到一个ptr中,并将_buffers原有数据clear,然后将新的单个ptr push到_buffers中。
相关文章:
ceph源码阅读 buffer
ceph::buffer是ceph非常底层的实现,负责管理ceph的内存。ceph::buffer的设计较为复杂,但本身没有任何内容,主要包含buffer::list、buffer::ptr、buffer::hash。这三个类都定义在src/include/buffer.h和src/common/http://buffer.cc中。 buffe…...
基本介绍——数据挖掘
1.数据挖掘的定义 数据挖掘是采用数学的、统计的、人工智能和神经网络等领域的科学方法,如记忆推理、聚类分析、关联分析、决策树、神经网络、基因算法等技术,从大量数据中挖掘出隐含的、先前未知的、对决策有潜在价值的关系、模式和趋势,并…...
Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
当使用 Navicat 连接 PostgreSQL 数据库时出现 ‘datlastsysoid does not exist’ 的错误报错,这可能是由于 Navicat 版本与 PostgreSQL 版本不兼容所致。 这是因为在较新的 PostgreSQL 版本中移除了 ‘datlastsysoid’ 列,但可能较旧版本的 Navicat 尚…...
冯诺依曼体系结构/什么是OS?
一、体系结构图 示意图 控制器可以控制其它4个硬件,四个硬件直接可以进行数据传输。 5大硬件 但是这些个体需要用“线”连接。 为什么要有存储器? 如果没有,实际速度则为输入、输出设备的速度。 加上后,变为内存的速度。&#…...
SD卡/TF卡简记
文章目录 MicroSD卡与SD卡关系与区别对比NM卡、XQD卡、CFexpress卡SD规格标识FAQ拍摄1080p或2k视频需要什么速度的sd卡?拍摄4k视频需要什么速度的sd卡?拍摄8k视频需要什么速度的sd卡? MicroSD卡与SD卡关系与区别 MicroSD卡原名为Trans-flash…...
Dockerfile COPY的奇怪行为:自动解包一级目录
记录一下今天遇到的坑:Dockerfile 这两天在部署项目的时候,新加进去了一个驱动,需要将2个文件夹以及1个文件COPY进镜像,大刀阔斧一个Dockerfile就写完了,结果COPY进去的文件有问题,Dockerfile的内容如下&am…...
【每日一题Day311】LC1761一个图中连通三元组的最小度数 | 枚举
一个图中连通三元组的最小度数【LC1761】 给你一个无向图,整数 n 表示图中节点的数目,edges 数组表示图中的边,其中 edges[i] [ui, vi] ,表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 三个 节点组成的集合且这三个点…...
前端日期减一天的笑话
vue日期减一天 给大家讲一个真实的笑话。最近做的一个项目,要统计不同年月日期的关联交易数量,由于和银行内数据对接取得数据都是T-1的,所以在首页根据日期统计一些交易数据量时默认是统计昨日的数据量。所以当时和前端约定好的让前端的妹子做…...
高效能,一键批量剪辑,AI智剪让创作更轻松
在今天的数字化时代,视频制作已经成为各种行业和领域的必备技能。然而,视频剪辑过程往往繁琐且耗时,大大降低了我们的工作效率。幸运的是,随着人工智能技术的发展,我们有了新的解决方案——AI智剪软件。 AI智剪软件&am…...
手写Mybatis:第15章-返回Insert操作自增索引值
文章目录 一、目标:Insert自增索引值二、设计:Insert自增索引值三、实现:Insert自增索引值3.1 工程结构3.2 Insert自增索引值类图3.3 修改执行器3.3.1 修改执行器接口3.3.2 抽象执行器基类 3.4 键值生成器3.4.1 键值生成器接口3.4.2 不用键值…...
【数据结构】动态数组(vector)的基本操作,包括插入、删除、扩容、输出、释放内存等。以下是代码的解释和注释:
这段C代码实现了一个动态数组(vector)的基本操作,包括插入、删除、扩容、输出、释放内存等。以下是代码的解释和注释: // 引入标准输入输出库和标准库函数,用于后续的内存分配和打印输出等操作 #include <stdio.…...
[unity]三角形顶点顺序
序 详见官方文档:Unity - Manual: Mesh data (unity3d.com) Topology:拓扑结构 翻译: 拓扑描述网格具有的面类型。 网格的拓扑定义了索引缓冲区的结构,索引缓冲区又描述了顶点位置如何组合成面。每种类型的拓扑都使用索引数组中…...
【python爬虫】14.Scrapy框架讲解
文章目录 前言Scrapy是什么Scrapy的结构Scrapy的工作原理 Scrapy的用法明确目标与分析过程代码实现——创建项目代码实现——编辑爬虫代码实现——定义数据代码实操——设置代码实操——运行 复习 前言 前两关,我们学习了能提升爬虫速度的进阶知识——协程…...
功率放大器主要作用是什么呢
功率放大器是一种电子设备,主要作用是将输入信号的功率增加到更高的水平,以便能够驱动高功率负载。在许多应用中,信号源产生的信号往往具有较低的功率,无法直接满足一些要求较高的设备或系统的需求。而功率放大器则可以增强信号的…...
SpringBoot ApplicationEvent详解
ApplicationStartingEvent 阶段 LoggingApplicationListener#onApplicationStartingEvent 初始化日志工厂,LoggingSystemFactory接口,可以通过spring.factories进行定制 可以通过System.setProperty("org.springframework.boot.logging.LoggingSystem",&q…...
WebSocket 报java.io.IOException: 远程主机强迫关闭了一个现有的连接。
在客户端强制关闭时,或者窗口强制关闭时,后端session没有关闭。 有时还会报:java.io.EOFException: 这个异常 前端心跳没有收到信息,还在心跳。 CloseReason close new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, &…...
关于git约定式提交IDEA
背景 因为git提交的消息不规范导致被乱喷,所以领导统一规定了约定式提交 官话 约定式提交官网地址 约定式提交规范是一种基于提交信息的轻量级约定。 它提供了一组简单规则来创建清晰的提交历史; 这更有利于编写自动化工具。 通过在提交信息中描述功能…...
【计算机网络】http协议
目录 前言 认识URL URLEncode和URLDecode http协议格式 http方法 GET POST GET与POST的区别 http状态码 http常见header 简易的http服务器 前言 我们在序列化和反序列化这一章中,实现了一个网络版的计算器。这个里面设计到了对协议的分析与处…...
仓库太大,clone 后,git pull 老分支成功,最新分支失败
由于 git 仓库太大,新加入的小伙伴在拉取时,无法切换到最新的分支,报错如下: fetch-pack: unexpected disconnect while reading sideband packet fatal: early EOF fatal: fetch-pack: invalid index-pack output在此记录解决步…...
javafx Dialog无法关闭
// 生成二维码图片String qrCodeText "https://example.com";DialogPane grid new DialogPane();grid.setPadding(new Insets(5));VBox vBox new VBox();vBox.setAlignment(Pos.CENTER);Image qrCodeImage generateQRCodeImage(qrCodeText);ImageView customImag…...
低噪放(LNA)关键参数在5G通信电路设计中的优化策略
1. 5G时代LNA设计的核心挑战 当你用手机刷短视频时,可能不会想到信号要经历一场"马拉松"——从基站出发,穿过建筑、树木、甚至雨雾,最终到达你掌心大小的设备。而这场马拉松的第一棒选手,就是藏在手机射频前端的低噪声…...
17 指挥AI写Mamba相关模型代码,快速适配大模型场景
指挥AI写Mamba相关模型代码,快速适配大模型场景 摘要 本文为《30天掌控AI编程:从指令到落地,手把手教你指挥AI写代码》系列第十七篇,属于第三阶段多场景实战核心内容。本篇聚焦当下大模型领域热门的Mamba架构,针对零基础大模型开发、无深度学习基础的使用者,拆解指挥AI…...
layout中节点不显示,也没解决,就是记录一下。
现象是:并没有继承过来。排查步骤:1. 先看是否是 layout XL 打开的2.其次点击笑火花 重新抽取下connectivity3.Q 一下 M2 看属性 链接性没吃到4.再次画一下M2 打孔不要用 自动打孔 手动画一下。无变化。5.再次点击小火花,点击Options 将Extra…...
windows系统部署funrec项目:安装WSL2
注意:WSL系统与Windows系统环境是完全隔离开的,只有代码文件可以互通 windows的anaconda、python、uv、torch、tensorflow等,WSL都不能用,都需要另外安装 WSL 可以访问 Windows 的项目文件(比如 /mnt/d/MyProject/……...
为什么99%的视频系统都是假的?——没有空间数据的视频,只是一个会动的PPT
一、开头:你看到的“监控”,其实什么都没看见你有没有这种感觉:城市里到处都是摄像头 监控系统越来越多 画面越来越清晰(甚至4K、8K)但一旦真的发生事情:👉 找不到人 👉 跟不上路径 …...
量子囚笼小说(理论分析)
1,困顿 最近,地球物理研究所的研究员李吕薇媛,心头始终萦绕着一团难解的烦恼。当下的世界,正浮现着种种诡异的失衡与怪象:有人坐拥无尽财富,生活极尽繁华优渥;有人却深陷困顿,日子举…...
拆解 OpenHands(8)--- CodeActAgent
在 OpenHands 智能框架的生态中,CodeActAgent 占据着核心地位,它是基于 CodeAct 理念构建的核心代理模块。其设计初衷极具巧思:将各类复杂任务统一转化为 “代码执行” 的形式来完成,同时兼顾自然语言对话的交互特性。这一设计既保…...
全栈实战:在快马平台从零到一开发一个可部署的极客日报应用
今天想和大家分享一个最近在InsCode(快马)平台上完成的实战项目——极客日报全栈应用开发。这个项目从零开始,完整实现了前后端分离的Web应用开发流程,特别适合想系统性学习全栈开发的同学参考。 项目架构设计 整个应用采用经典的三层架构:前…...
Dress Code高分辨率虚拟试衣数据集:计算机视觉时尚研究的终极实战指南
Dress Code高分辨率虚拟试衣数据集:计算机视觉时尚研究的终极实战指南 【免费下载链接】dress-code 项目地址: https://gitcode.com/gh_mirrors/dre/dress-code Dress Code是由意大利摩德纳大学研究团队开发的高分辨率多类别虚拟试衣数据集,为计…...
Linux上使用apt-file查找编译时缺失的依赖库
前言:在Linux上做开发时会遇到依赖库缺失与环境配置问题,如报"fatal error:xxxxxxx.h:没有那个文件或者目录"等错误,此时则只能通过提示中缺失的头文件"xxxxxxx.h"进行缺失依赖库的定位,若错误提示的头文件为…...
