【NIO】dawn在buffer用法

简介:

网络编程,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。





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5046135.html,如需转载请自行联系原作者


相关文章
|
4月前
|
存储 编解码 移动开发
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
25 1
|
5月前
|
Java 索引
📌 Java NIO Buffer
Java NIO缓冲区在与NIO通道交互时使用。数据从通道读取到缓冲区,然后从缓冲区写入通道。 缓冲区本质上是一块内存,可以在其中写入数据,然后再进行读取。这个内存块被封装在一个NIOBuffer对象中,该对象提供了一组方法,可以更容易地使用内存块。
|
存储 网络协议 Java
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
选择器,也叫多路复用器,Java的NIO通过selector实现一个线程处理多个客户端链接,多个channel可以注册到同一个Selector,Selector能够监测到channel上是否有读/写事件发生,从而获取事件和对事件进行处理,所以Selector切到哪个channel是由事件决定的。当线程从某个客户端通道未读取到数据时,可以把空闲时间用来做其他任务,性能得到了提升。
146 0
|
弹性计算 Java API
Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
理解Selector 和 Channel Selector 选择器,也叫多路复用器,可以同时处理多个客户端连接,多路复用器采用轮询机制来选择有读写事件的客户端链接进行处理。 通过 Selector ,一个 I/O 线程可以并发处理 N 个客户端连接和读写操作,这解决了传统同步阻塞 I/O 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。 由于它的读写操作都是非阻塞的,这就可以充分提升 IO 线程的运行效率,避免由于频繁 I/O 阻塞导致的线程挂起。
237 0
|
存储 Java
NIO之Buffer解读(下)
NIO之Buffer解读(下)
|
存储 Java 容器
java Nio(二): Buffer(缓冲区)的数据存取
java Nio(二): Buffer(缓冲区)的数据存取
java Nio(二): Buffer(缓冲区)的数据存取
|
Java
Java NIO 中的 Buffer 缓冲区详解(下)
Java NIO 中的 Buffer 缓冲区详解
182 0
Java NIO 中的 Buffer 缓冲区详解(下)
|
设计模式 缓存 Java
NIO中Buffer的重要属性关系解析
NIO中Buffer的重要属性关系解析
177 0
|
存储 Java
小师妹学JavaIO之:NIO中那些奇怪的Buffer
小师妹学JavaIO之:NIO中那些奇怪的Buffer
小师妹学JavaIO之:NIO中那些奇怪的Buffer