原文地址:

http://www.cnblogs.com/enjoy-ourselves/p/3793771.html

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()配合使用的例子:

1 while(channel.read(buffer)>=0 || buffer.position!=0){
2     buffer.flip();    //为写出数据作准备,将position移至0
3     channel2.write(buffer);
4     buffer.compact();    //假如上一步只写出了部分数据,此方法则可以防止数据丢失,下次读入的新数据将追加在后边
5 }

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,同步/异步,阻塞/非阻塞的更多相关文章

  1. JAVA 中BIO,NIO,AIO的理解以及 同步 异步 阻塞 非阻塞

    在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...

  2. 【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)

    常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数据,然后使用适合的视图展示详情数据. 如果网速很慢,代码发起一个HTTP请求后,就卡住不动了,直到十几秒后才拿到HTT ...

  3. 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor

    开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...

  4. linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

      IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...

  5. Java IO 学习(一)同步/异步/阻塞/非阻塞

    关于IO,同步/异步/阻塞/非阻塞,这几个关键词是经常听到的,譬如: “Java oio是阻塞的,nio是非阻塞的” “NodeJS的IO是异步的” 但是这些东西听多了就容易迷糊,比方说同步是否就是阻 ...

  6. 高性能IO设计模式之阻塞/非阻塞,同步/异步解析

    提到高性能,我想大家都喜欢这个,今天我们就主要来弄明白在高性能的I/O设计中的几个关键概念,做任何事最重要的第一步就是要把概念弄的清晰无误不是么?在这里就是:阻塞,非阻塞,同步,异步. OK, 现在来 ...

  7. 深入理解非阻塞同步IO和非阻塞异步IO

    这两篇文章分析了Linux下的5种IO模型 http://blog.csdn.net/historyasamirror/article/details/5778378 http://blog.csdn ...

  8. Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO

    Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO Java 非阻塞 IO 和异步 IO 转自https://www.javadoop.com/post/nio-and-aio 本系 ...

  9. 理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO

    以下是IO的一个基本过程 先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间.当用户程序读取数据的时 ...

  10. 异步|同步&阻塞|非阻塞

    异步|同步:区别在于发出一个功能调用时,是否马上得到返回结果 阻塞|非阻塞:区别在于调用结果返回之前,当前线程是否挂起 node.js:单线程.异步非阻塞模型 单线程与异步不矛盾,与并发是矛盾的 ht ...

随机推荐

  1. 《UML大战需求分析》阅读随笔(三)

    一: 需求中提到的各种业务概念.人物等,经过抽象后都可以视之为类. 平时遇到的人.物,我们将遇到的都是具体的人.物,也就如程序中的对象,是一个实实在在的东西. 当我们分析需求的时候,设计模型的时候,我 ...

  2. java web(四)文件上传与下载

     一.文件上传原理 1.在TCP/IP中,最早出现的文件上传机制是FTP ,它是将文件由客户端发送到服务器的标准机制:但是在jsp使用过程中不能使用FTP方法上传文件,这是由jsp运行机制所决定. 通 ...

  3. CentOS 6.8 新安装系统的网络IP配置(转载)

    实例环境 虚拟机:VMware 11.1.0 系统:CentOS 6.6 # ifconfig -a       << 查看所有网卡的状态 2. # vi /etc/sysconfig/n ...

  4. Codeforces Round #249 (Div. 2)B(贪心法)

    B. Pasha Maximizes time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  5. hadoop2.2编程:用ruby跑hadoop的完整实例

    Becareful!  All nodes include  need to install ruby! #!/usr/bin/ruby # Ruby code for map.rb ARGF.eac ...

  6. Eclipse安装与搭建Maven

    Maven的具体参考书可以看:<Maven实战> 下载maven可以到:http://maven.apache.org/ Maven的eclipse基本使用可以在这里看到:http://w ...

  7. javascript 中的闭包

    在 javascript 中,函数可以当做参数传递,也可以当做返回值返回. 当一个函数内部返回值为一个函数时, 就形成了闭包.(闭包里面的 this 问题) 如下面代码 Function.protot ...

  8. 【JavaScript】封装实用方法【持续积累】

    介绍 主要记录一些平时积累或者常用方法或者小技巧的集合.以便在以后用到还要重复写或者忘记. 还有就是如果遇到好的方法封装值得收藏进行收藏.这里主要是记录一些包含JavaScript的一些积累.没有什么 ...

  9. TOP100summit:【分享实录-途牛】价格中心系统的优化之路

    本篇文章内容来自2016年TOP100summit途牛旅游网高级架构师,技术委员会开发组长赵国光的案例分享.编辑:Cynthia 导读:价格中心系统是途牛网众多系统中很重要的一个,几乎所有的售卖价格计 ...

  10. linux 函数库使用

    程序函数库可分为3种类型:静态函 数库(static libraries).共享函数库(shared libraries)和动态加载函数库(dynamically loaded libraries) ...