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

内存缓存是简单的在内存进行读写操作的一种传输,任何时候想在上面写入数据都是放入缓存中, 任何时候读操作数据也是来至于缓存。内存缓存的分配使用c语言的malloc类函数,分配的长度是需要 长度的两倍,需要考虑这些内存缓存的使用范围。

同样这个类继承至缓存基类TBufferBase,默 认的缓存大小是1024(static const uint32_t defaultSize = 1024;),所有的构造函数都调用函数 initCommon,这个函数实现如下:

voidinitCommon(uint8_t* buf, uint32_t size, bool 

owner, uint32_t wPos) {
   if (buf== NULL && size != 0) {//如果传递过来的buf为null并且size不为0
    assert(owner);//断言这个内存缓存是不是自己所有,不是就报错不继续执行后面的代码了
     buf =(uint8_t*)std::malloc(size);//是自己拥有的内存缓存就自己分配size大小的内存作为缓存
     if(buf == NULL) {
      throw std::bad_alloc();//分配失败抛出异常
     }
   }
   buffer_= buf;//初始化缓存成员变量
  bufferSize_ = size;//大小  

   rBase_= buffer_;基地址
   rBound_= buffer_ + wPos;//界限  

   wBase_= buffer_ + wPos;//写缓存基地址
   wBound_= buffer_ + bufferSize_;//写界限  

   owner_= owner;//是否自己拥有这段内存缓存
 }

上面代码需要说明是:在初始化这个类的时候对于内存缓存是不是属于类自己拥有有不同 的处理方式,后面介绍各个方针;还有一点就是读的边界其实就是写的起始地址,因为写入开始的地方 就是没有有效数据的地方了,就是一个生存者和消费者的问题,这个后面介绍的一个函数computeRead 会更新相关内容。下面我们就看看内存缓存采取的几种可配置的方针(对待内存缓存的方式),是定义 一个枚举标识每一个方针的,定义如下:

enumMemoryPolicy
 { OBSERVE= 1
 , COPY =2
 ,TAKE_OWNERSHIP = 3
 };

下面分配分析这三种方针,第一种称为观察方针,意思是内存缓存传输类只是简单的存储 一个指针存放到内存,它是调用者来保证内存缓存在剩余的时间指向一个有效的内存,并且在适当的时 候清理它(注意:这种内存缓存是不允许写入数据的);第二种是内存缓存类内部的一种拷贝,调用者 无任何责任;最后一种就是内存缓存类自己拥有的内存缓存,这个必须自己释放,并且在使用以前需要 使用malloc分配。明白了三种内存方针了,就知道什么时候需要的是哪一种。内存使用方针除了被构造 函数使用以外,我们在重置内存缓存区时也会使用到,而重置缓存函数是resetBuffer,有两个函数重 载。在实现重载函数的时候使用了一点点优化手段,就是交换内存的时候使用std::swap,这个函数的 好处就是如果是相同的内存分配器分配的就直接交换指针头就可以了。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, 函数
, 缓存
, 一个
, 缓存类
, 分配
内存缓存
thrift ttransport、protobuffer thrift、thrift buffer、direct buffer memory、kafka buffer.memory,以便于您获取更多的相关知识。

时间: 2024-09-24 01:09:20

thrift的TTransport层的内存缓存传输类TMemoryBuffer的相关文章

thrift的TTransport层的分帧传输类TFramedTransport

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

PHP内存缓存Memcached类实例_php技巧

本文实例讲述了PHP内存缓存Memcached类.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: <?PHP class MemcacheModel { private $mc = null; /** * 构造方法,用于添加服务器并创建memcahced对象 */ function __construct(){ $params = func_get_args(); $mc = new Memcache; //如果有多个memcache服务器 if( count($params)

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

本节主要介绍缓冲相关的传输类,缓存的作用就是为了提高读写的效率.Thrift在实现缓存传输的 时候首先建立一个缓存的基类,然后需要实现缓存功能的类都可以直接从这个基类继承.下面就详细分 析这个基类以及一个具体的实现类. 缓存基类TBufferBase 缓存基类就是让传输类所有的读写函 数都提供缓存来提高性能.它在通常情况下采用memcpy来设计和实现快路径的读写访问操作,这些操作 函数通常都是小.非虚拟和内联函数.TBufferBase是一个抽象的基类,子类必须实现慢路径的读写函 数等操作,慢路

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

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

PHP内存缓存Memcached类代码

 代码如下 复制代码 <?PHP   class MemcacheModel { private $mc = null; /** * 构造方法,用于添加服务器并创建memcahced对象 */ function __construct(){ $params = func_get_args(); $mc = new Memcache; //如果有多个memcache服务器 if( count($params) > 1){ foreach ($params as $v){ call_user_fu

thrift的默认传输类TTransportDefaults和虚拟传输类TVirtualTransport

默认传输类TTransportDefaults提供了抽象类TTransport的默认实现,实现了非虚拟的方法 (*_virt) read(), readAll(), write(),borrow() and consume().基类TTransport总是调用对应的 虚拟函数,而默认传输类按照默认的方式实现而不去自己在覆盖哪些对应的虚拟函数了. 其实这个 默认传输类的主要作用是作为虚拟传输类TVirtualTransport的父类,那么为什么需要这个类作为虚拟 传输类的父类而不是直接采用抽象基类

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

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

[转贴]dbcached──“分布式 key-value 数据库内存缓存系统”

原文:http://blog.s135.com/post/329/ 前言:dbcached 1.0 beta* 在 Memcached 1.2.4 的基础上编写而成,也是我的第一个开源C项目.编写 dbcached 的目的是为了最大限度的发挥 Memcached 内存缓存的优势,便捷地维护 Memcached 服务器节点哈希列表,智能地支持 Memcached 故障转移,同时保证数据的持久化存储. dbcached 协议:New BSD License 作者:张宴 网址:http://code.

iOS开发缓存机制之—内存缓存机制

在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制. 这篇文章将介绍一下如何在iOS设备中进行缓存,本文先介绍一下将内容缓存到内存中,下一篇文章就介绍一下在iOS磁盘上缓存内容.   使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求. 内存缓存我们可以使用sdk中的NSURLCache类.NSURLRequest需要一个缓存参数来说