thrift的TTransport层的缓存传输类TBufferedTransport和缓冲基类TBufferBase

本节主要介绍缓冲相关的传输类,缓存的作用就是为了提高读写的效率。Thrift在实现缓存传输的 时候首先建立一个缓存的基类,然后需要实现缓存功能的类都可以直接从这个基类继承。下面就详细分 析这个基类以及一个具体的实现类。

缓存基类TBufferBase

缓存基类就是让传输类所有的读写函 数都提供缓存来提高性能。它在通常情况下采用memcpy来设计和实现快路径的读写访问操作,这些操作 函数通常都是小、非虚拟和内联函数。TBufferBase是一个抽象的基类,子类必须实现慢路径的读写函 数等操作,慢路径的读写等操作主要是为了在缓存已经满或空的情况下执行。首先看看缓存基类的定义 ,代码如下:

class TBufferBase : public TVirtualTransport<TBufferBase> {
 public:
  uint32_t read(uint8_t* buf, uint32_t len) {//读函数
    uint8_t* new_rBase = rBase_ + len;//得到需要读到的缓存边界
    if (TDB_LIKELY(new_rBase <= rBound_)) {//判断缓存是否有足够的数据可读,采用了分支预测技术
      std::memcpy(buf, rBase_, len);//直接内存拷贝
      rBase_ = new_rBase;//更新新的缓存读基地址
      return len;//返回读取的长度
    }
    return readSlow(buf, len);//如果缓存已经不能够满足读取长度需要就执行慢读
  }
  uint32_t readAll(uint8_t* buf, uint32_t len) {
    uint8_t* new_rBase = rBase_ + len;//同read函数
    if (TDB_LIKELY(new_rBase <= rBound_)) {
      std::memcpy(buf, rBase_, len);
      rBase_ = new_rBase;
      return len;
    }
    return apache::thrift::transport::readAll(*this, buf, len);//调用父类的
  }
  void write(const uint8_t* buf, uint32_t len) {//快速写函数
    uint8_t* new_wBase = wBase_ + len;//写入后的新缓存基地址
    if (TDB_LIKELY(new_wBase <= wBound_)) {//判断缓存是否有足够的空间可以写入
      std::memcpy(wBase_, buf, len);//内存拷贝
      wBase_ = new_wBase;//更新基地址
      return;
    }
    writeSlow(buf, len);//缓存空间不足就调用慢写函数
  }
  const uint8_t* borrow(uint8_t* buf, uint32_t* len) {//快速路径借
    if (TDB_LIKELY(static_cast<ptrdiff_t>(*len) <= rBound_ - rBase_)) {//判断是否足够借的长度
      *len = static_cast<uint32_t>(rBound_ - rBase_);
      return rBase_;//返回借的基地址
    }
    return borrowSlow(buf, len);//不足就采用慢路径借
  }
  void consume(uint32_t len) {//消费函数
    if (TDB_LIKELY(static_cast<ptrdiff_t>(len) <= rBound_ - rBase_)) {//判断缓存是否够消费
      rBase_ += len;//更新已经消耗的长度
    } else {
      throw TTransportException(TTransportException::BAD_ARGS,
                                "consume did not follow a borrow.");//不足抛异常
    }
  }
 protected:
  virtual uint32_t readSlow(uint8_t* buf, uint32_t len) = 0;//慢函数
  virtual void writeSlow(const uint8_t* buf, uint32_t len) = 0;
  virtual const uint8_t* borrowSlow(uint8_t* buf, uint32_t* len) = 0;
  TBufferBase()
    : rBase_(NULL)
    , rBound_(NULL)
    , wBase_(NULL)
    , wBound_(NULL)
  {}//构造函数,把所有的缓存空间设置为NULL
  void setReadBuffer(uint8_t* buf, uint32_t len) {//设置读缓存空间地址
    rBase_ = buf;//读缓存开始地址
    rBound_ = buf+len;//读缓存地址界限
  }
  void setWriteBuffer(uint8_t* buf, uint32_t len) {//设置写缓存地址空间
    wBase_ = buf;//起
    wBound_ = buf+len;//边界
  }
  virtual ~TBufferBase() {}
  uint8_t* rBase_;//读从这儿开始
  uint8_t* rBound_;//读界限
  uint8_t* wBase_;//写开始地址
  uint8_t* wBound_;//写界限
};

从TBufferBase定义可以看出,它也是从虚拟类继承,主要采用了memcpy函数来实现缓存的 快速读取,在判断是否有足够的缓存空间可以操作时采用了分支预测技术来提供代码的执行效率,且所 有快路径函数都是非虚拟的、内联的小代码量函数。下面继续看看一个具体实现缓存基类的一个子类的 情况!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, 缓存
, 传输
, thrift
, 缓冲
, 路径
, 基类
, 一个
, 缓存类
, 读写缓冲
操作基类
thrift ttransport、tbufferedtransport、thrift transport、thrift transport协议、ttransportexception,以便于您获取更多的相关知识。

时间: 2024-07-28 21:47:59

thrift的TTransport层的缓存传输类TBufferedTransport和缓冲基类TBufferBase的相关文章

thrift的TTransport层的内存缓存传输类TMemoryBuffer

内存缓存是简单的在内存进行读写操作的一种传输,任何时候想在上面写入数据都是放入缓存中, 任何时候读操作数据也是来至于缓存.内存缓存的分配使用c语言的malloc类函数,分配的长度是需要 长度的两倍,需要考虑这些内存缓存的使用范围. 同样这个类继承至缓存基类TBufferBase,默 认的缓存大小是1024(static const uint32_t defaultSize = 1024;),所有的构造函数都调用函数 initCommon,这个函数实现如下: voidinitCommon(uint

thrift的TTransport层的堵塞的套接字I/O传输类TSocket

本节将介绍第一个实现具体传输功能的类TSocket,这个类是基于TCP socket实现TTransport的接口 .下面具体介绍这个类的相关函数功能实现. 1.构造函数 分析一个类的功能首先看它的定义和构 造函数实现,先看看它的定义:  class TSocket : public TVirtualTransport<TSocket> { ......} 由定义可以看书TSocket继承至虚拟传输类,并且把 自己当做模板参数传递过去,所以从虚拟传输类继承下来的虚拟函数(如read_virt)

thrift的TTransport层的分帧传输类TFramedTransport

帧传输类就是按照一帧的固定大小来传输数据,所有的写操作首先都是在内存中完成的直到调用了 flush操作,然后传输节点在flush操作之后将所有数据根据数据的有效载荷写入数据的长度的二进制块 发送出去,允许在接收的另一端按照固定的长度来读取. 帧传输类同样还是从缓存基类TBufferBase 继承而来,实现的接口当然也基本相同,只是实现的方式不同而已,下面就来看看具体的实现过程和原 理. 这个类所采用的默认缓存长度是512(static const int DEFAULT_BUFFER_SIZE

thrift的TTransport类体系原理及源码详细解析1-类结构和抽象基类

本章主要介绍Thrift的传输层功能的实现,传输的方式多种多样,可以采用压缩.分帧等,而这些 功能的实现都是相互独立,和上一章介绍的协议类实现方式比较雷同,还是先看看这部分的类关系图, 如下: 由上面的类关系图可以看出,这部分的功能是相当的强大,所以类比较多且关系错综复杂.但是如 果理解清楚了这些类直接的关系就很容易掌握这部分的实现技术和这部分实现的功能.我们把这个类关 系图分为三部分来看,第一部分看抽象基类TTransport类,它是所有传输类的基类,有很大一部分类直 接从它继承实现它提供或者

Thrift的代码生成器Compiler原理及源码详细解析 1 类关系图

最近忙着研究GlusterFS,本来周末打算写几篇博客的,但是由于调试GlusterFS的一些新增功能就 用了整整的一天,还有一天就陪老婆大人逛街去了!今晚浏览完微博发现时间还早就来博客一篇,本篇 博客内容主要是前一段时间研究的Thrift的代码生成器的源码详细分析,没有具体分析语法解析,因为 是工具字段生成的代码,人是没有办法阅读的----到处都是跳转表!由于Thrift支持N多种语言,但是 生成代码原理都差不多,我主要分析了C++相关代码生成.关于Thrift的使用及原理.代码网上基本上 都

class-j2ee问题,sevice层能不能弄成单一的一个类

问题描述 j2ee问题,sevice层能不能弄成单一的一个类 该类来判断跟处理请求的所有action,调用相应的dao,我担心会不会所有的请求都要经过这个类,导致该类负担太大系统崩溃 我是查询的时候弄成这样一个类,如果是说怕维护麻烦到是不怕 接口: /****** * @描述:根据不同请求进行相应的查询业务处理 * @param action 请求Action * @param params 参数集合 * @param page 页数 * @param rp 分页条数 * @param sort

浅析6类缆和7类缆的工序控制要求

6类缆和7类缆的结构特点及性能要求,各企业应在工序的工艺控制上下功夫,以满足电缆各项性能指标满足国内外标准的要求.(1)绝缘工序铜线延伸率要稳定控制在±2%以内;导线直径波动范围为±0.002mm;绝缘外径波动范围为±0.01mm;同心度大于96%;同轴电容限制在±1.5pF/m;导体预热温度稳定适当,以保证铜线与绝缘层之间粘接良好;7类缆发泡材料挤出要均匀,注气压力变化,螺杆转数变化,收放线张力变化要尽可能小,发泡层的泡要均匀细密,使整条单线上绝缘的等效介电常数保持均匀一致.导线和绝缘间的附着

五类、新五类及超五类等布线测试标准澄清

近来很多布线专家在谈及布线测试标准时说目前由于5类布线标准的变化导致了很多用户对于相关的标准仍然很混乱,在这里我就简单地将布线标准中关于5类内容的变化澄清一下,希望对维护和测试原有布线系统的人员有所帮助. 一切起源于在非屏蔽双绞线上支持千兆以太网. 1999年6月28日,IEEE通过了在平衡双绞线布线系统(balance twisted pair cabling)上支持千兆以太网的IEEE802.3ab标准,由于当时还没有制定5e的布线标准,而令人头痛的是作为在五类级别上传输千兆以太网是要在4对

java中什么是实体类,为什么实体类的变量都用private修饰?

问题描述 java中什么是实体类,为什么实体类的变量都用private修饰? java中什么是实体类,为什么实体类的变量都用private修饰?能否举个实体类的简单例子,谢谢 解决方案 关于什么是实体类,可以看这里:Java什么是实体类实体类有什么用? 例如一个订单实体类Order.java,里边:id(主键).orderNo(订单号).userId(订单所属用户ID).status(支付状态).createTime(创建时间)等属性. 因为这些属性,基本都是供订单类自己使用的,所以一般都将它们