AIO:异步非阻塞

NIO:同步非阻塞

BIO:同步阻塞

(1)同步 指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪

(2)异步 指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知

(3)阻塞 指当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待状态, 直到有东西可读或者可写为止

(4)非阻塞 指如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待

同步/异步新理解:

  是否持续等待解决并查看结果状态的为 同步/异步 关系

阻塞/非阻塞新理解:

  是否短时间内可以处理完客户端事件,并快速切换到下一个客户端进行事件处理(处理速度足够快、客户端事件合理的情况下,计算机里没有绝对的非阻塞)

  长时间占用服务端,不能跳转到下一个客户端的,就是阻塞

BIO、NIO、AIO适用场景分析: 
    BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。 
    NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。 
    AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持

Reactor模式和Proactor模式

首先来看看Reactor模式,Reactor模式应用于同步I/O的场景。我们分别以读操作和写操作为例来看看Reactor中的具体步骤:  
读取操作:  
1. 应用程序注册读就绪事件和相关联的事件处理器  
2. 事件分离器等待事件的发生  
3. 当发生读就绪事件的时候,事件分离器调用第一步注册的事件处理器  
4. 事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理  
写入操作类似于读取操作,只不过第一步注册的是写就绪事件。

Reactor模型:

  当前NIO使用的模型,TCP建立链接后,需要使用TCP/IP的select()函数进行一个或多个链接状态的判断(通过select轮询每一个链接的状态)

  Reactor中,有一个线程一直不停的轮询着链接状态,并对链接状态进行处理,是有一个线程来做这件事(这也就是轮询,导致资源的一定浪费)

  TCP链接状态有四种:

    (1)等待链接(accept)

    (2)可读()

    (3)可写()

这里进行链接轮询的时候,Reactor模型就会同步等待select()函数轮询链接状态,但,如果没有数据,立即返回

Proactor模式中读取操作和写入操作的过程

读取操作:  
1. 应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件,这是区别于Reactor的关键。  
2. 事件分离器等待读取操作完成事件  
3. 在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作(异步IO都是操作系统负责将数据读写到应用传递进来的缓冲区供应用程序操作,操作系统扮演了重要角色),并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区。  
4. 事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。

总结:

Reactor和Proactor模式的主要区别就是真正的读取和写入操作是有谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备.

同步和异步是相对于应用和内核的交互方式而言的,同步 需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序,而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。

可以参考其它文档:http://ifeve.com/netty-reactor-4/

AIO、NIO、BIO的更多相关文章

  1. Java BIO、NIO、AIO 学习(转)

    转自 http://stevex.blog.51cto.com/4300375/1284437 先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Ja ...

  2. JAVA中IO技术:BIO、NIO、AIO

    1.同步异步.阻塞非阻塞概念        同步和异步是针对应用程序和内核的交互而言的. 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作 ...

  3. Java IO 之 BIO、NIO、AIO

    1.BIO.NIO.AIO解释 Java BIO : 同步并阻塞 (Blocking IO) 一个连接一个线程 即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不 ...

  4. Java提高班(五)深入理解BIO、NIO、AIO

    导读:本文你将获取到:同/异步 + 阻/非阻塞的性能区别:BIO.NIO.AIO 的区别:理解和实现 NIO 操作 Socket 时的多路复用:同时掌握 IO 最底层最核心的操作技巧. BIO.NIO ...

  5. Java网络通信方面,BIO、NIO、AIO、Netty

    码云项目源码地址:https://gitee.com/ZhangShunHai/echo 教学视频地址:链接: https://pan.baidu.com/s/1knVlW7O8hZc8XgXm1dC ...

  6. Java BIO、NIO、AIO 学习

    正在学习<大型网站系统与JAVA中间件实践>,发现对BIO.NIO.AIO的概念很模糊,写一篇博客记录下来.先来说个银行取款的例子: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO ...

  7. BIO、NIO、AIO系列一:NIO

    一.几个基本概念 1.同步.异步.阻塞.非阻塞 同步:用户触发IO操作,你发起了请求就得等着对方给你返回结果,你不能走,针对调用方的,你发起了请求你等 异步:触发触发了IO操作,即发起了请求以后可以做 ...

  8. BIO、NIO、AIO差别

    网上非常多IO资料,对新手来说.越看越晕.依据自己的理解.总结对照了一下BIO.NIO.AIO. BIO:线程发起IO请求,无论内核是否准备好IO操作,从发起请求起,线程一直堵塞,直到操作完毕. 例如 ...

  9. tomcat BIO 、NIO 、AIO

    11.11活动当天,服务器负载过大,导致部分页面出现了不可访问的状态.那后来主管就要求调优了,下面是tomcat bio.nio.apr模式以及后来自己测试的一些性能结果. 原理方面的资料都是从网上找 ...

随机推荐

  1. [python学习]结合开源库学习python

    代码碎片1 #!/usr/bin/python # please add your code here! import matplotlib matplotlib.use('Agg') import ...

  2. BZOJ3888 [Usaco2015 Jan]Stampede

    我们只要把每头牛开始遮挡视线和结束遮挡视线的时间点都搞出来就好= = 再按照y轴排序...然后变成线段覆盖了..线段树搞一下就好了? /******************************** ...

  3. js判断手机系统和微信

    //判断手机浏览器 var ua = navigator.userAgent; var ipad = ua.match(/(iPad).*OS\s([\d_]+)/), isIphone = !ipa ...

  4. linux 安装 php

    1.  libxml2安装           tar -zxvf libxml2-2.6.26.tar.gz cd libxml2-2.6.26 ./configure  --prefix=/usr ...

  5. JBoss像tomcat那样创建部署文件,JBoss创建虚拟目录

    jboss可以像tomcat那样,写一个配置文件,指向应用所在的路径,而不用将应用直接复制到deploy下的某一个以.war结尾的文件夹下吗? 答:好像是不能直接操作,但是可以通过变通的方式来搞定.在 ...

  6. ruby开源项目之Octopress:像黑客一样写博客(zhuan)

    ruby开源项目之Octopress:像黑客一样写博客 百度权重查询 词库网 网站监控 服务器监控 SEO监控 Swift编程语言教程 今年一直推荐的一种写作方式.markdown语法快速成文,git ...

  7. Genymotion常见问题整合与解决方案

    常见问题1:Genymotion在开启模拟器时卡在了starting virtual device(注意只有tarting virtual device窗口,没有模拟器的黑屏窗口)    原因:Vir ...

  8. 转: Oracle中的物化视图

    物化视图创建语法:CREATE MATERIALIZED VIEW <schema.name>PCTFREE <integer>--存储参数PCTUSED <intege ...

  9. MATLAB axes

    本帖由MATLAB技术论坛(http://www.matlabsky.com)原创,更多精彩内容参见http://www.matlabsky.com axes ★★★★★ 功能 创建坐标系图形对象 语 ...

  10. JVM-JDK命令行工具

    JDK命令行工具 当我们进入JDK的安装目录里面的/bin目录,会发现有很多小工具,有我们熟悉的也经常用的java,javac,也有很多我们不怎么用到很陌生的工具.下面看看哪些平时不怎么用到的工具吧. ...