1. OIO中,每个线程只能处理一个channel(同步的,该线程和该channel绑定)。

线程发起IO请求,不管内核是否准备好IO操作,从发起请求起,线程一直阻塞,直到操作完成,如图:

NIO中,每个线程可以处理多个channel(异步)。

线程发起IO请求,立即返回;内核在做好IO操作的准备之后,通过调用注册的回调函数通知线程做IO操作,线程开始阻塞,直到操作完成

AIO中,线程发起IO请求,立即返回;内存做好IO操作的准备之后,做IO操作,直到操作完成或者失败,通过调用注册的回调函数通知线程做IO操作完成或者失败

那么OIO如何处理海量连接请求呢?

是对每个请求封装成一个request,然后从线程池中挑一个worker线程专门为此请求服务,如果线程池中的线程用完了,就对请求进行排队。请求中如果有读写数据,是会阻塞线程的

2、NIO中channel肯定是非阻塞模式的,否则抛出异常。为什么呢?因为前面selector异步通知程序的时候,通道中的数据肯定是有的。

3、同步与阻塞是不同的概念,异步与非阻塞也是不同的概念。

4、阻塞式iO会浪费大量的cup进行无意义的上下文切换,因为还是可能读/写不到任何数据。

5、同步阻塞:通常给人的印象。把通知应用程序和读/写消息结合在了一起,因为有了数据才能通知,

异步非阻塞:通常给人的印象。因为如果是异步通知的话,肯定是能拿到数据的。有效减少线程切换。目前java的nio的异步看起来是阻塞的,因为阻塞在select.select()操作上了。但是其实可以通过select.wakeUp()方法,不用一直阻塞。但要想获得通道状态,还是必须等待select.select返回才行的。

综上所述,同步和阻塞给人的概念是一样的。而异步和非阻塞跟给人的概念是一样的

6、同步异步指的是通信模式,而阻塞和非阻塞指的是在接收和发送时是否等待动作完成才返回所以不能混淆这四个词。

首先是通信的同步,主要是指客户端在发送请求后,必须得在服务端有回应后才发送下一个请求。所以这个时候的所有请求将会在服务端得到同步

其次是通信的异步,指客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求,这样对于所有的请求动作来说将会在服务端得到异步,这条请求的链路就象是一个请求队列,所有的动作在这里不会得到同步的。

阻塞和非阻塞只是应用在请求的读取和发送。

在实现过程中,如果服务端是异步的话,客户端也是异步的话,通信效率会很高,但如果服务端在请求的返回时也是返回给请求的链路时,客户端是可以同步的,这种情况下,服务端是兼容同步和异步的。相反,如果客户端是异步而服务端是同步的也不会有问题,只是处理效率低了些。

同步=阻塞式,异步=非阻塞式

同步和异步都只针对于本机SOCKET而言的

同步模式下,比如RECIEV和SEND,都要确保收到或发送完才返回,继续执行下面的代码不然就阻塞在哪里,所以,同步模式下,一般要用到线程来处理。

异步模式就不同了,不管有没有收到或发送出去,他都马上返回,继续执行下面的代码,结果由消息通知。

转自OIO与NIO区别

NIO,OIO,AIO区别的更多相关文章

  1. 面试中常问的五种IO模型和BIO,NIO,AIO

    一,五种IO模型: 一个IO操作可以分为两个步骤:发起IO请求和实际的IO操作例如:1.操作系统的一次写操作分为两步:第一步,将数据从用户空间拷贝到系统空间:第二步,从系统空间往网卡写.2.一次读操作 ...

  2. BIO与NIO、AIO的区别

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO      在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个Serve ...

  3. [转帖] BIO与NIO、AIO的区别

    培训里面讲的东西  自己查了下 啥意思,,, 转帖强化一下. http://blog.csdn.net/skiof007/article/details/52873421 IO的方式通常分为几种,同步 ...

  4. BIO与NIO、AIO的区别(这个容易理解)

    转自:http://blog.csdn.net/skiof007/article/details/52873421 BIO与NIO.AIO的区别(这个容易理解) IO的方式通常分为几种,同步阻塞的BI ...

  5. 以Java的视角来聊聊BIO、NIO与AIO的区别?

    转: 以Java的视角来聊聊BIO.NIO与AIO的区别? 飞丫玲丫 17-07-2623:10 题目:说一下BIO/AIO/NIO 有什么区别?及异步模式的用途和意义? BIO(Blocking I ...

  6. JAVA BIO与NIO、AIO的区别

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  7. BIO与NIO、AIO的区别(转)

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  8. [转帖]JAVA BIO与NIO、AIO的区别(这个容易理解)

    JAVA BIO与NIO.AIO的区别(这个容易理解) https://blog.csdn.net/ty497122758/article/details/78979302 2018-01-05 11 ...

  9. 【1】BIO与NIO、AIO的区别

    一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求 ...

随机推荐

  1. 直接突破百度网盘,用IDM或者迅雷下载。

    直接突破百度网盘,用IDM或者迅雷下载.推荐浏览器: 360 ,CHORME360,: 打开网盘下载页,然后F12→找到CONSOLE→刷新→输入代码“Object.defineProperty(th ...

  2. 【并发编程】使用BlockingQueue实现<多生产者,多消费者>

     MasterThread: 持有一个BlockingQueue队列,用于并发接收存储MetaData对象; 使用Hash一致性算法ketama,来选择SlaveThread节点; 从Blocking ...

  3. Visual Studio 2010 Shortcut

    General Shortcut Description Ctrl-X or Shift-Delete Cuts the currently selected item to the clipboar ...

  4. jquery zTree异步搜索的例子--搜全部节点

    参考博客: https://segmentfault.com/a/1190000004657854 https://blog.csdn.net/houpengfei111/article/detail ...

  5. C#、AE开发入门之打开shp文件并显示

    首先要建立好对应的对话框程序,并拖入axMapControl控件和axLisence控件,并设置一个按钮打开该文件 当然在使用前一定要绑定对应的ArcGis产品 static void Main() ...

  6. spring线程池(同步、异步)

    一.spring异步线程池类图 二.简单介绍 2.1. TaskExecutor---Spring异步线程池的接口类,其实质是java.util.concurrent.Executor 以下是官方已经 ...

  7. [转][C#][WebApi]

    在 WebApi 中获取网页在服务器上的位置可以使用以下两种方式: string filePath = HostingEnvironment.MapPath(string.Format("/ ...

  8. k8s service网络

    资源 从整体来看,Kubernetes集群是由很多由JSON或者YAML定义的‘资源’组成,我个人比较推崇使用YAML写配置,因为它读写都很容易,同时还支持注释. 在Kubernetes中启动一个应用 ...

  9. PowerDesigner最基础的使用方法入门学习(二)

    1.  生成sql脚本 Database→Generate Database 选择要输出的文件路径,即文件存储路径,并根据需要修改文件名,单击确定后便会生成sql脚本. 在Options选项卡里,可以 ...

  10. TextView-- 测量文字宽度

    https://my.oschina.net/lengwei/blog/637380; http://blog.csdn.net/mare_blue/article/details/51388403; ...