网络编程,buffer它用于数据传输到网络上的集线器应用程序,不用说,一个重要的线。提到buffer我不能说什么零拷贝,buffer什么内存管理,在dawn在,基于directbuffer再次能够实现零拷贝自己主动延伸buffer。

内存块的链表。数据都是在尾端加入。从头部移出,或者在中间获取、设置。全部的位置信息都是直接通过计算获取,所以。保证了各种情况的存取效率。在数据添加时。假设当前内存不够,则会扩展一个内存块,写到新block中;假设前面的数据消费掉了,则能够使用compact方法,压缩存储空间,抛弃最前面已经消费掉的数据。并把抛弃掉的内存块放回内存池。这样就以最小的数据移动代价来获取最高的存取效率。

所以,仅仅要你以正确的姿势使用了dawn的buffer。你同一时候在高效的使用buffer了,dawn的底层尽了最大努力减少数据复制的开销。注意:ScalableDirectBuf的当前实现仅仅能支持intel和amd的cpu。在别的cpu上使用 ,可能会崩溃,只是现实生活中绝大部分的cpu都是intel的。所以,我们基本不用操心。

讲了半天的题外话,让我回到ScalableDirectBuf的用法上吧。ScalableBuf的最大容量是无限的,仅仅限制于物理内存,它有几个成员变量我们必须了解:

ri(readindex的缩写),wi(writeindex)。limitpos(当前容量)

ri是下一个可读数据的位置

wi是下一个可写位置

limitpos 是当前容量。

他们的大小关系:ri<=wi<=limitpos

ScalableDirectBuf有几类方法:

1.写入类方法,以w开头,比方wint是写入一个整数,wi向前移动4个字节,还有wbyte。wlong,等等,类似。

2.读取类方法。以r开头,如rlong,从buffer中读取一个long,ri向前移动8个字节。假设buffer的可读数据不足8个字节,会抛出IndexOutofBound异常。

3.设置方法,以s开头,比方sshort,从某个偏移開始,设置一个short数据,ri和wi都不移动。

4.获取方法。以g开头,比方gbyte,读取某个位置处的一个字节,ri和wi都不移动。

5.和容量有关的函数。readable,当前buffer中可供消费的数据大小。

6.和buffer回收相关的函数,compact。抛弃已经消费的数据,并把空block放回内存池。  release,抛弃全部数据。把全部block放回内存池。

相关的样例。能够參考单元測试:

https://github.com/zhmt/dawn/blob/master/examples/zhmt/dawn/nio/buffer/ScalableDirectBufTest.java

下一篇文章,我们用一个简单的样例来综合运用我们之前学到知识:我们连接baidu的首页,并打印所获取到全部内容,你会看到这非常easy。

【NIO】dawn在buffer用法的更多相关文章

  1. Java NIO中的Buffer 详解

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...

  2. NIO之缓冲区(Buffer)的数据存取

    缓冲区(Buffer) 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通道 ...

  3. Java NIO Channel和Buffer

    Java NIO Channel和Buffer @author ixenos Channel和Buffer的关系 1.NIO速度的提高来自于所使用的结构更接近于OS执行I/O的方式:通道和缓冲器: 2 ...

  4. NIO(一):Buffer缓冲区

    一.NIO与IO: IO:  一般泛指进行input/output操作(读写操作),Java IO其核心是字符流(inputstream/outputstream)和字节流(reader/writer ...

  5. nio之缓冲区(Buffer)理解

    一.缓冲区简介 Nio中的 Buffer 是用于存储特定基础类型的一个容器.为了能熟练的使用 Nio中的各种 Buffer , 我们需要理解 Buffer 中的 三个重要 的属性. 1. capaci ...

  6. Java I/O(3):NIO中的Buffer

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 之前在调用Channel的代码中,使用了一个名叫ByteBuffer类,它是Buffer的子类.这个叫Buffer的类是专门用来解决高速设备与低 ...

  7. Java NIO学习与记录(二):FileChannel与Buffer用法与说明

    FileChannel与Buffer用法与说明 上一篇简单介绍了NIO,这一篇将介绍FileChannel结合Buffer的用法,主要介绍Buffer FileChannel的简单使用&Buf ...

  8. NIO编程中buffer对象的理解以及API的使用

    概念讲解,转自https://www.cnblogs.com/lxzh/archive/2013/05/10/3071680.html  ,将的非常好! Buffer 类是 java.nio 的构造基 ...

  9. 6. 彤哥说netty系列之Java NIO核心组件之Buffer

    --日拱一卒,不期而至! 你好,我是彤哥,本篇是netty系列的第六篇. 简介 上一章我们一起学习了Java NIO的核心组件Channel,它可以看作是实体与实体之间的连接,而且需要与Buffer交 ...

随机推荐

  1. 与众不同 windows phone (13) - Background Task(后台任务)之后台文件传输(上传和下载)

    原文:与众不同 windows phone (13) - Background Task(后台任务)之后台文件传输(上传和下载) [索引页][源码下载] 与众不同 windows phone (13) ...

  2. 简单的RPC java实现

    RPC的名声大噪之时是在2003年,那一个“冲击波”病毒(Blaster Worm virus)袭卷全球的一年.而“冲击波”正是用着RPC这把刀来敲开了远程电脑的大门.当然RPC 有更多正面的应用,比 ...

  3. Qt多线程(有详细例子)

    Qt线程类 Qt 包含下面一些线程相关的类:QThread 提供了开始一个新线程的方法QThreadStorage 提供逐线程数据存储QMutex  提供相互排斥的锁,或互斥量QMutexLocker ...

  4. Jquery事件的连接

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. TCP连接的建立(二)

    被动打开 SYN cookies TCP协议开辟了一个比較大的内存空间请求连接队列来存储连接请求块,当SYN请求不断添加,请求连接数目到达上限时,会致使系统丢弃SYN连接请求.SYN cookies技 ...

  6. Android自己定义控件——3D画廊和图像矩阵

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/39932689 1.3D画廊的实现 我们知道android系统已经为我们提供好了一个 ...

  7. Delphi “Invalid floating point operation.”错误的解决方法(使用System单元提供的Set8087CW函数禁用浮点异常)

    这两天用webbrower写东西,有时候打开SSL加密网站时会出现”Invalid floating point operation.”的错误,上网搜了下,把解决方法贴上. 导致原因 在Delphi2 ...

  8. [Android学习笔记]页面布局

    线性布局:LinearLayout 1.集成ViewGroup,故可容纳多个View 2.线性布局,可设置水平或者垂直方向 相对布局:RelativeLayout

  9. Linux正则表达式grep与egrep

    grep -io "http:/=[A-Z0-9]\{16\}" ./wsxf.txt >wsxf_urls.txt Linux正则表达式grep与egrep 正则表达式:它 ...

  10. VS2010-win32下cocos2dx控制台打印的方法

    在xcode中  直接使用printf 或者 cout<<""<<endl;可以直接在控制台打印 但是在VS2010 却死活不好用   真郁闷 ------ ...