目录

  • IO模型
  • BIO模型
  • 什么是BIO模型
  • BIO模型的应用场景
  • NIO模型
  • 什么是NIO模型
  • NIO与BIO的区别
  • NIO模型的应用场景
  • AIO模型
  • 什么是AIO模型
  • AIO模型的应用场景
  • 同步异步和阻塞非阻塞


IO模型

最近学习了IO模型,也是第一次开始写博客,以下的文章都是自己的理解,有误的话欢迎指正!!

IO的话就是输入输出,那IO模型其实说白了就是用什么样的形式,或者说通道来输入和输出;换句话说就是用什么样的通道来对数据进行发送或者是对数据进行接收。

Java支持三种IO模式,也就是BIO、NIO、AIO

BIO模型

什么是BIO模型

BIO叫做Blocking IO,又叫同步阻塞模型,就是一个请求由一个线程来进行处理。既然是同步,那意思是服务端有且只能处理一个线程,但是如果这个线程一直占着位置不干事的话,其他线程也就只能一直等待,那就形成了阻塞。所以BIO模型的缺点就是如果用户连接成功之后,不做数据的读写操作,其他线程就会一直阻塞的,这就会导致线程的浪费;从另外一方面来想,如果在有线程占着不做操作的时候,在他占着这个线程的这一段时间内,如果有很大线程突然访问过来,这就会导致服务器的压力过大,这也是不好的。

BIO模型的应用场景

BIO模型只能应用于连接数比较小,而且一次发送很多数据的这种结构场景下,这种方式对于服务器的资源要求比较高,但是它的程序会比较简单易理解。

NIO模型

什么是NIO模型

NIO叫做Non Blocking IO,又叫同步非阻塞;BIO模型下,一个客户端请求会有一个线程来进行处理,在NIO模型中,多个请求可以被一个线程来处理,也就是一个线程可以处理多个请求;在NIO模型中,它有一个多路复用器selector,所有的请求都会注册到这个多路复用器selector上面,然后去轮询看看有没有事件发送过来,如果有请求发送过来的话,就会去处理这个请求,多路复用器是在JDK1.4开始引入的。

NIO与BIO的区别

我们都知道BIO是一个请求交由一个线程来处理,而如果一个线程一占用,其他线程就会一直处在阻塞的状态下。所以NIO引入了多路复用器selector来解决这个问题,它将所有的请求注册在多路复用器selector上面,并且进行轮询来查看是否有事件,所以它不会阻塞,因为不停的轮询,如果有事件请求过来,那就处理事件;如果没有,那就下一个;所以NIO它是同步非阻塞。

但是它的缺点也显而易见,如果只是几条请求那确实无伤大雅,但是如果是几万条几十万条甚至上百万条数据注册到这个selector当中,其中也就只有几千条请求经常发送消息,但每次我都需要去轮询这几百万次,但真正有用的就那几千条,这也算是一种资源的浪费吧。

NIO模型的应用场景

NIO的应用场景比较适用于连接数目较多并且连接的时较短的这种架构,像聊天系统,弹幕系统等 ,但它的程序比较复杂。

AIO模型

什么是AIO模型

AIO又叫NIO(2.0),它是异步非阻塞的,它是由操作系统的回调通知服务端的线程去处理的,是基于事件和回调机制实现的,所以它不会阻塞在那里。

AIO模型的应用场景

AIO更适用于连接数目多且连接时长比较久的架构,它是在JDK1.7开始支持的。

同步异步和阻塞非阻塞

我自己个人的理解:同步和异步的区别在于,同步就是发送了request过去,一定要等一个response回来,如果没有就一直等着,直到它返回结果回来;而异步则是发送request过去,如果没有结果,则返回一个消息回来告诉我们说没有结果,等到它有结果了它会回调我们想要的东西回来。

举个我之前在网上看见的一个例子:你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

阻塞与非阻塞的区别在于程序是否被挂起。

同样的例子,你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。
在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。


小白学习,文章内容有误的话,欢迎各位指出!