brpc源码学习(五)-IOBuf

article/2025/8/29 19:39:15

目录

Block

BlockRef

IOBuf

主要api

tls优化

IOPortal

protobuf接口


首先放上官方介绍:

brpc使用butil::IOBuf作为一些协议中的附件或http body的数据结构,它是一种非连续零拷贝缓冲,在其他项目中得到了验证并有出色的性能。IOBuf的接口和std::string类似,但不相同。

以及官方ppt的这张图

从上到下结构分别为IOBuf,BlockRef和Block。

 

Block

首先看下Block的结构,block就是一段内存,默认大小为8k,负责数据的实际存储。size表示使用了多少内存,cap为这段内存的容量,数据存储在data,portal_next指向在链表结构下的一块block。

创建一个block的接口为create_block,blockmem_allocate即为malloc,申请到8k内存mem后,在mem上调用placement new,因为block本身也占用了内存,因此实际数据存储data指向mem + sizeof(Block),容量大小为8k-sizeof(Block)。block的写入永远是追加写,不会修改已写入的内容;为了避免全局竞争带来的开销,block引入了tls优化。

block中的nshared字段表示当前block被多少个BlockRef所引用,初始值为1,当block没有被引用时便会被释放。

 

BlockRef

BlockRef引用了一个block,指向了一个block中的一段区域,开始位置为offset,长度为length。

 

IOBuf

然后看下IOBuf,IOBuf本质就是管理了多个BlockRef,IOBuf的主要结构为一个BigView和SmallView的联合体

sv表示两个Ref,而bv表示一个ref数组

 

主要api

然后介绍下IOBuf的主要api。

 

首先是默认构造函数,默认为sv

 

append一个IOBuf,不涉及到实际内存的拷贝,只要push下other的ref即可;遍历other所有的ref,然后调用_push_back_ref

如果当前iobuf为sv,那么调用_push_or_move_back_ref_to_smallview,流程如下:

  1. 如果当前iobuf没有ref,那么将sv[0]设置为r,并将r所引用的block进行inc_ref()
  2. 如果当前iobuf的ref[1]为空,那么判断ref[0]和r是否可以合并,如果两个ref引用的block一致,且两段区域连续,那么就将r合并到ref[0]上,否则将sv[1]设置为r
  3. 如果当前iobuf的ref均不为空,那么尝试合并r到ref[1],若无法合并,则将当前iobuf由sv转成bv,为bv申请一定量的ref数组,并将r添加到bv中

 

_push_or_move_back_ref_to_bigview则判断r是否能与bv的最后一个合并,若不能,则添加到bv最后。

 

append一个string,此时会涉及内存的拷贝

如果只append一个字符,就会调用push_back()接口,share_tls_block接口是获取到一个未满的block,这个接口后面再说,然后将这个字符加到block中,创建ref并push到当前iobuf中,即完成了append。

如果是append多个字符,那么循环调用share_tls_block得到未满的block,memcpy data到block中,直到拷贝完所有字符。

 

int IOBuf::appendv(const const_iovec* vec, size_t n)

该接口是将n个iovec的数据append到iobuf,和上述原理差不多。

 

对于cut类,pop类接口,原理和append也比较相近,不再赘述。

 

tls优化

然后看下之前提到的tls优化

TLSData就是一个block链表,每个线程有个tls的TLSData,num_blocks表示cache了多少个block,registered表示是否注册了线程退出对tls清理的函数。

然后看下上文提到的share_tls_block

首先是判断当前tls头结点,如果头结点b不是null且未满,那么直接返回b;如果b已经满了,那么将b从tls中移除,dec_ref,并走到b的下一个节点new_block;如果b是null,那么如果没注册线程退出函数就注册下,如果new_block为null,那么通过create_block申请一个block并加入到tls链表中。

 

而acquire_tls_block接口和share_tls_block类似,区别是acquire会将返回的block移除tls,而share不会移除。

release_tls_block,release_tls_block_chain则是将单个/多个block归还tls

这里申请和归还block并不能保证在同一个thread,可能会出现在A线程申请,在B线程归还的场景。

 

IOPortal

然后看下IOPortal,IOPortal是IOBuf的子类,可以从fd中读数据,一般用于和socket的交互

append_from_reader和pappend_from_file_descriptor逻辑差不多,区别是前者使用IReader的ReadV,后者使用系统调用readv或者preadv。

do while循环做的事情是不断申请block,直到这些block剩余空间能够存下max_count的数据;并初始化好iovec,iovec初始化为这些block;然后调用readv或者preadv,最后根据block生成blockref。

 

protobuf接口

最后是基于protobuf的IOBufAsZeroCopyInputStream和IOBufAsZeroCopyOutputStream,继承自google::protobuf::io::ZeroCopyInputStream 和google::protobuf::io::ZeroCopyOutputStream,目的是为了消除用户逻辑同stream交互时发生的拷贝,例如从stream的内存到用户的buf间的拷贝;具体做法为buf的内存不应该由用户逻辑管理,而是由stream来管理;对外暴露两个接口,分别为

bool Next(void** data, int* size),返回一段可写入的连续内存(*data),长度为(*size)

void BackUp(int count),归还不需要使用的内存。

然后解释下next接口:

其实就是申请一个block,然后返回,size为这个block的剩余空间,也因为这样,所以需要acquire来占住整个block。


http://chatgpt.dhexx.cn/article/hcBlB5tt.shtml

相关文章

BRPC学习

一 源码地址:GitHub - apache/incubator-brpc: brpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. "brpc"…

brpc源码解析(四)—— Bthread机制

目录 一、概述二、启动入口函数三、内部启动函数四、worker工作入口五、总结 Bthread是brpc用到的一个线程库,也是brpc的核心之一,默认情况下,包括用户代码在内的绝大部分代码都是运行在bthread里的,bthread也是brpc实现高性能的基…

Springboot集成Brpc

本文代码可在总结处自取。 1、为什么要写这篇文章 最近自己做的业务在和C团队对接,双方需要指定接口与传输协议。原本是直接使用http协议传输json数据,对双方来说都比较简单可接受。但是json数据传输效率实在令人堪忧,导致我们不得不另寻其道…

brpc源码学习(六)- brpc server 端整体流程

brpc的使用比较容易上手,以官方demo为例,因为brpc的数据序列化依赖protobuf,所以首先需要定义个proto 然后继承EchoService并实现Echo方法 然后是整体流程 启动还是比较简单的,定义server,AddService,然后S…

brpc源码解析(一)—— rpc服务添加以及服务器启动主要过程

目录 1.往Server里添加Service(业务代码)2.设置服务器参数3.启动服务器 平时的工作用到了baidu-rpc搭建rpc服务,作为戈君大神的大作,在没有开源的时候,这个c 的rpc框架在厂内就已经好评颇多,无论是性能、文…

brpc初步学习

一.BRPC介绍 BRPC百度开源的一个rpc框架,它具有以下特性: 基于protobuf接口的RPC框架,也提供json等其他数据格式的支持囊括baidu内部所有RPC协议,支持多种第三方协议模块化设计,层次清晰,很容易添加自定义…

brpc介绍、编译与使用

brpc又称为baidu-rpc,是百度开发一款“远程过程调用”网络框架。目前该项目已在github上开源——https://github.com/brpc/brpc。(转载请指明出于breaksoftware的csdn博客) 据目前公开的资料,我们发现百度内部从2010年开始&#x…

NB-IOT与物联网

1. 物联网的技术格局 短距离(智能家居/穿戴等) --- zigbee, wifi, BLE 长距离 (LPWA 低功耗广域) --- LORA, NB-IOT 关于LORA大致了解了一下情况 . Lora 其实已经是一个很成熟的技术方案. 国外已经大范围使用,国内也有不少公司在基于LORA运营物联网系统. LORA的系统结构…

lora和nbiot的相同点,它们之间有何区别和联系?

在物联网无线数据传输中,有诸多方式可以选择,包括蓝牙、WIFI、FSK、ASK/OOK、Lora、Zigbee、NB-iot、Z-Wave.等, 其中lora 和NBIot 是自2016年来比较热门的两个无线通讯方式。 我们今天就和大家简单的聊聊Lora 和NBiot。 我是在2016年接触…

NB-IOT开发|nbiot开发教程《三》AT指令类模组驱动-STM32实现AT指令状态机

嵌入式开发中我们要时刻保持代码的高效与整洁看之前,先点赞 好习惯,要养成 一、前言 嵌入式开发中我们要时刻保持代码的高效与整洁。在第一节中“NB-IOT开发|nbiot开发教程《一》AT指令类模组驱动解析”我们说到AT指令模组最好的驱动-状态机。本节我们就…

基于华为云IOT平台实现多节点温度采集(STM32+NBIOT)

一、前言 当前的场景是,在高速公路上部署温度采集设备,在高速路地表安装温度检测传感器,检测当前路段的路面实际温度。一段高速路上有多个地点需要采集温度数据。 采集温度数据需要上传到云平台进行数据存储,并且通过可视化界面展示温度变化曲线,支持查询最近几天的温度信…

NB-IoT的优势是什么?

NB-IoT的优势 : • 强链接:在同一基站的情况下,NB-IoT可以比现有无线技术提供50-100倍的接入数。一个扇区能够支持10万个连接,支持低延时敏感度、超低的设备成本、低设备功耗和优化的网络架构。举例来说,受限于带宽&a…

MN316_OPEN(NBIOT)物联网模块环境搭建

因为项目的需要,这里要使用NBIOT,踩了一些坑,这里总结一下! 编译 官方给的SDK如下: 按照说明,在该目录下直接运行如下指令:".\build.bat dlvs_h0 demo"即可成功编译,但是我编译的时候不成功,报错如下: 最后发现是因为我的目录太深的原因造成的,把"MN316_Op…

stm32毕业设计 NBIOT远程通信系统

文章目录 1 简介2 NBIOT 简介2.1 NBIOT 的特点2.2 NBIOT 的优点2.3 NBIOT能做什么 NBIOT 模块使用4 实现效果5 STM32 驱动NBIOT模块6 最后 1 简介 Hi,大家好,NBIOT是近几年不比较火的远程通信模块,是物联网的重要技术,今天学长向…

NB-IoT技术实战开发 ----- NB-IoT介绍

一.1------初识NB-IoT 1、NB-IoT介绍2、 物联网技术发展2.1有线物联网2.2 无线网络网 3、为什么需要NB-IOT4、NB-IOT优势5、NB-IOT解决方案亮点和价值5.1 广覆盖5.2 低功耗5.3低成本5.4 大连接 6、NB-IOT的应用1.智能抄表2.智能停车3.宠物跟踪4.else 1、NB-IoT介绍 NB-----Na…

【物联网】LoRa vs NBIoT

LoRa (Long Range) VS NB-IoT(Narrow Band Internet of Things) LoRa和NB-IoT是什么 通常物联网设备分为三类: 无需移动性,大数据量,需较宽频段;移动性强&#xff0…

物联网协议之NBIOT

什么是NBIOT 在物联网行业目前常用的网络通信技术主要有以下这些: nbiot属于一种LTE网络,LTE网络是目前主流的通信网络,覆盖完整、技术成熟,未来大量物联网设备都需要在LTE网络中实现通讯功能。Cat.X这个值是用来衡量用户终端设…

浅谈NBIOT

一、什么是NBIOT? 1、概念 窄带物联网(Narrow Band Internet of Things, NB-IoT),NB-IoT构建于蜂窝网络,只消耗大约180KHz的带宽,使用License频段,可采取带内、保护带或独立载波等三种部署方式…

【物联网毕设基础】NBIOT 窄带物联网

文章目录 1 简介2 NBIOT简介3NB的型号介绍3.1 BC95:3.2 BC35:3.3 BC28:3.4 BC26:3.5 BC20:3.6 BC30: 4 NB物联网卡5 OpenCPU6 BC260模块详解6.1 基本性能6.2 引脚介绍6.3 模块供电 7 其他注意点8 最后 1 简介 Hi&…

NB-IoT学习笔记 —— NB-IoT介绍

一、简介 NB-IoT 是指窄带物联网(Narrow Band Internet of Things)技术,是一种低功耗广域(LPWA)网络技术标准,基于蜂窝技术,用于连接使用无线蜂窝网络的各种智能传感器和设备,聚焦于…