NIO与AIO,同步/异步,阻塞/非阻塞
1.flip(),compact(),与clear()的使用
flip()内部实现,先将limit设为当前位置,再将缓冲区的postion设为0,所以是为将缓冲区的数据写出到其它通道或者get()作准备。
clear()内部实现,将limit设为缓冲区的容量,position设为0,limit的不同为clear()与flip()的区别,所以clear()是为缓冲区的数据读入与put()作准备。当将通道中的数据读入缓冲区前,应该用clear(),不能用flip()
compact()内部实现,首先将当前位置与limit之间的数据复制到缓冲区的开始处,假设复制了n字节的数据,然后将position设为n+1,limit设为容量,所以是为了继续往缓冲区读入数据或者put()作准备,即为追加数据作准备。
flip()与compact()配合使用的例子:
while(channel.read(buffer)>=0 || buffer.position!=0){
buffer.flip(); //为写出数据作准备,将position移至0
channel2.write(buffer);
buffer.compact(); //假如上一步只写出了部分数据,此方法则可以防止数据丢失,下次读入的新数据将追加在后边
}
SelectionKey关于accept,connect,read,write有几个常量,这几个值都是2的整数次幂,如1,4,8,16,因此进行 | 和 ^ 运算就如同十进制中的加法和减法,这样可以灵活的注册和注销关注的事件.
如注销监听读事件,key.interestOps(key.interestOps()^SelectionKey.OP_READ) (1|4|8)^4=9 ^优先级比|高,因此括号不能少
2.关于同步,异步,阻塞,非阻塞的区别
各种I/O模型的准确介绍:
http://blog.csdn.net/shallwake/article/details/5265287?reload
AIO介绍:还有一个相关服务器框架yanf4j :
http://www.iteye.com/topic/472333
同步与异步的区分标准:数据从内核缓冲区(kernel buffer)复制到应用程序缓冲区(application buffer)这个阶段是否阻塞。
所以从这个角度看,阻塞I/O,非阻塞I/O,多路复用I/O,signal driven I/O(仅限于Unix)这四种I/O模型都是同步I/O.
而asynchronous I/O操作系统在copy数据到应用缓冲区完成以后才通知应用程序,所以是纯异步的。
在1.4的NIO中,阻塞的是select,I/O并不阻塞,用一个Reactor线程可以监听多个通道的事件,并分发给其它的处理线程。这个select可以看作一个代理,它会去轮询所有注册的通道事件,看事件是否已发生,所以本质上NIO可看成是同步非阻塞I/O.
NIO应用的是Reactor模式,selector是reactor,而channel可看作是事件处理程序,如读就绪事件发生时,如果通道设置的是非阻塞模式,则处理程序会将数据从内核缓冲区复制到通道中(应用缓冲区),紧接着我们在程序中从通道中读取数据时就不会阻塞了。
而NIO的同步体现在第一阶段仍然需要通过轮询来获知读/写/是否已就绪,然后事件分离器调用相应事件处理程序。
AIO的Proactor模式,不关心读就绪事件,只关心读/写完成事件,完成以后直接回调之前注册的处理程序。I/O读写,缓冲区数据的移动全部由内核完成。
在1.7的AIO中,本身也不会阻塞,对accept,read,write的调用都会立即返回,内核完成I/O操作以后,会将后续处理任务提交给线程池来执行,即回调,这个Proactor就是当初注入的AsynchronousChannelGroup,它持有这个线程池。
NIO与AIO,同步/异步,阻塞/非阻塞的更多相关文章
- JAVA 中BIO,NIO,AIO的理解以及 同步 异步 阻塞 非阻塞
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...
- 【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)
常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...
- 【转载】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)
原文链接:https://www.cnblogs.com/lixinjie/p/10811219.html 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使 ...
- 同步/异步/阻塞/非阻塞/BIO/NIO/AIO
转摘自:https://www.cnblogs.com/lixinjie/p/a-post-about-io-clearly.html 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HT ...
- 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)
常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...
- 同步/异步/阻塞/非阻塞/BIO/NIO/AIO各种情况介绍
常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...
- 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor
开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...
- linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)
IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...
- Java IO 学习(一)同步/异步/阻塞/非阻塞
关于IO,同步/异步/阻塞/非阻塞,这几个关键词是经常听到的,譬如: “Java oio是阻塞的,nio是非阻塞的” “NodeJS的IO是异步的” 但是这些东西听多了就容易迷糊,比方说同步是否就是阻 ...
- 深入了解几种IO模型(阻塞非阻塞,同步异步)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zk3326312/article/details/79400805一般来说,Linux下系统IO主要 ...
随机推荐
- HTML5 canvas 捕鱼达人游戏
在线试玩:http://hovertree.com/texiao/html5/33/ html5利用canvas写的一个js版本的捕鱼,有积分统计,鱼可以全方位移动,炮会跟着鼠标移动,第一次打开需要鼠 ...
- Error LNK1104 cannot open file 'libboost_system-vc140-mt-gd-1_58.lib'
I had a similar problem when trying to use boost unit testing in Visual Studio 2015 (Community Editi ...
- hdu-2063-二分图最大匹配
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 从零开始学 Java - Windows 下安装 JDK
关于未来 "我要死在火星.在我死去的时候能够想着人类能有一个美好的未来--有可持续的能源,同时能够殖民其他的星球来避免人类灭绝的最坏可能." 官网下载 直接打开官网:http:// ...
- java集合-补充HashMapJDK1.8
在Java 8 之前,HashMap和其他基于map的类都是通过链地址法解决冲突,它们使用单向链表来存储相同索引值的元素.在最坏的情况下,这种方式会将HashMap的get方法的性能从O(1)降低到O ...
- AMD and CMD are dead之KMD.js依赖可视化工具发布
使用 require("MyAapp.DepTree", function (DepTree) { DepTree(({ renderTo: "holder", ...
- CSS3中的弹性布局——"em"的用法
使用CSS也好久了,但一直都是在使用“px”来设置Web元素的相关属性,未敢使用“em”.主要原因是,对其并不什么了解,只知道一点概念性的东西,前段时间在项目中要求使用“em”作为单位设置元素,所以从 ...
- 搭建基于 STM32 和 rt-thread 的开发平台
我们需要平台 如果说,SharePoint 的价值之一在于提供了几乎开箱即用的 innovation 环境,那么,智能设备的开发平台也一样.不必每次都从头开始,所以需要固定的工作室和开发平台作为创新的 ...
- Creating a SharePoint Sequential Workflow
https://msdn.microsoft.com/en-us/library/office/hh824675(v=office.14).aspx Creating a SharePoint Seq ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q138-Q140)
Question 138 You are designing a SharePoint 2010 application that will deploy a Web Part assembly. ...