美文网首页
BIO-NIO-AIO

BIO-NIO-AIO

作者: wuhuaguo丶 | 来源:发表于2019-07-06 17:47 被阅读0次
BIO (Blocking I/O):同步阻塞I/O模式。
NIO (New I/O):同步非阻塞模式。
AIO (Asynchronous I/O):异步非阻塞I/O模型。

同步与异步:

  • 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。
  • 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。

同步和异步最大的区别在于异步的话调用者不需要等待处理结果,被调用者会通过回调等机制来通知调用者其返回结果。区别就是被调用方的执行方式和返回时机。同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。

阻塞与非阻塞:

  • 阻塞: 阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。A调用B,A一直等着B的返回,别的事情什么也不干。
  • 非阻塞: 非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。A调用B,A不用一直等着B的返回,先去忙别的事情了。

阻塞非阻塞最大的区别就是在被调用方返回结果之前的这段时间内,调用方是否一直等待。阻塞指的是调用方一直等待别的事情什么都不做。非阻塞指的是调用方先去忙别的事情。

举个生活中简单的例子,你妈妈让你烧水,小时候你比较笨啊,在那里傻等着水开(同步阻塞)。等你稍微再长大一点,你知道每次烧水的空隙可以去干点其他事,然后只需要时不时来看看水开了没有(同步非阻塞)。后来,你们家用上了水开了会发出声音的壶,这样你就只需要听到响声后就知道水开了,在这期间你可以随便干自己的事情,你需要去倒水了(异步非阻塞)。


适用场景

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。


NIO与BIO的区别

首先说明NIO是非阻塞同步的,BIO是阻塞同步的。
然后从NIO三个特性给NIO带来的一些改进来分析。
阻塞:发起一个请求,调用者一直等待请求结果返回,也就是当前进程会挂起,无法从事其他任务,只有当条件就绪时才能继续。
非阻塞:发起一个请求,调用者不许等待结果返回,可以先去干其他的事情。
NIO的三个特性

  • Channel(通道)
  • Buffer(缓冲区)
  • Selector(选择器)

Channel:NIO 通过Channel(通道) 进行读写。
通道是双向的,可读也可写,而流的读写是单向的。无论读写,通道只能和Buffer交互。因为 Buffer,通道可以异步地读写。

IO NIO
面向流 面向缓冲
阻塞IO 非阻塞IO
选择器

面向流与面向缓冲
NIO的优势来源于它的缓冲机制,不管是读还是写都以块的形式写到缓冲区里,NIO实际让我们对IO的操作更加操作系统的实际过程。
面向流意味着每次都流中读一个或多个字节,直至读取所有字节,他们没有被缓存在任何地方,此外,他不能前后移动流中的数据。如果需要移动从流中读取的数据,需要先将它缓存在一个缓冲区。
阻塞与非阻塞
BIO的各种流是阻塞的,这意味着当一个线程调用read()方法或者write()方法时,该线程被阻塞,直到一些数据被读取,或数据完全写入,此线程在此期间不能干任何其他的事情,
NIO的非阻塞模式会在线程收到读取请求之后,如果目前没有数据可用,就什么都不会获取,直至数据变得可以被读取之前,该线程可以做任何的事情,非阻塞写也是,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程可以同时去做别的事情,线程通常将非阻塞IO的空闲时间用于在其他通道上执行IO操作,所以一个线程可以管理一个或多个输入输出通道(channel)
选择器
可以用于使用单个线程处理多个通道,因此只需要较少的线程来处理这些通道。
Netty 的出现很大程度上改善了 JDK 原生 NIO 所存在的一些让人难以忍受的问题。
Java NIO系列教程(十二) Java NIO与IO
还不了解 Netty 是什么? u need try this one

相关文章

  • BIO-NIO-AIO

    BIO (Blocking I/O):同步阻塞I/O模式。 NIO (New I/O):同步非阻塞模式。 AIO ...

  • [026]java中网络模型BIO-NIO-AIO解析

    背景 学习IT其实大部分也是学习概念,今天我在一个技术分享群里看到内部框架由阻塞是改成非阻塞式(基于netty的)...

网友评论

      本文标题:BIO-NIO-AIO

      本文链接:https://www.haomeiwen.com/subject/edqmhctx.html