BIO,NIO,AIO概览

前言

本文简单介绍一下BIO,NIO,AIO以及同步与异步,阻塞与非阻塞等概念

同步与异步

同步与异步关注的是消息通信机制

同步

同步就是发起一个调用后,等待当前调用返回,没得到结果之前,调用不返回,就像做事一样,事情必须一件一件做完了,才能做下一件

异步

异步就是发起一个调用后,立刻得到回应,但没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。

举个通俗的例子,同步就像:

你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。

异步就像:

而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调

此处参照知乎上关于此问题的回答:www.zhihu.com/question/19…

阻塞与非阻塞

阻塞与非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态

阻塞

阻塞就是发起一个请求,在请求结果返回之前,当前线程会被挂起(被阻塞),无法从事其他任务,只有当条件就绪才能继续。比如ServerSocket新连接建立完毕

非阻塞

非阻塞就是发起一个请求,在不能立刻得到返回结果之前,直接返回,不等待,函数不会阻塞当前线程。

还是上面买书的例子:

你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。

BIO介绍

BIO也就是传统的同步阻塞IO模型,对应Java.io包,它提供了很多IO功能,比如输入输出流,对文件进行操作。在网络编程(Socket通信)中也同样进行IO操作。

bio

上图是从操作系统的角度上去阐述 BIO 的,程序发送请求给内核,然后由内核去进行通信,在内核准备好数据之前这个线程是被挂起的。

NIO介绍

NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象

nio

与BIO的区别就是,发起第一次请求后,线程并没有被阻塞,它反复检查数据是否准备好,有点类似于"轮询"。

AIO(NIO2)

AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO方式

AIO

AIO是异步非阻塞的IO模型,所以用户线程可以同时处理别的事情。应用程序发起一个系统调用过后,无需等待,立刻返回,等到数据准备好后,再通知应用程序

I/O多路复用

这个概念来自通信领域,指一个信道上传输多路信号的技术,在计算机里表示使用一个线程监视多个描述符的就绪状态。I/O 多路复用技术是由操作系统提供的功能,比如POSIX标准下的 select 或 linux 下的 epoll 以及 BSD 特有的 kqueue 。首先向操作系统注册一个描述符集合的可读或者可写事件,如果某个或某些描述符就绪,操作系统就会通知,这样,多个描述符就能在一个线程内并发通信。

muti_io

从IO操作的角度来看,多路复用的特点就是用户进程能够同时等待多个IO请求,系统来监控状态,其中的任意一个进入读就绪的状态,系统就会向进程通知。再简单点说,I/O多路复用就是多个网络连接,共用一个线程

I/O多路复用的应用场景

I/O 多路复用的主要应用场景如下:

  • 服务器需要同时处理多个处于监听状态或者多个连接状态的套接字
  • 服务器需要同时处理多种网络协议的套接字

目前支持I/O 多路复用的系统调用有 select,pselect,poll,epoll。在Linux 网络编程中,很长一段时间都使用select 做轮询和网络事件通知。然而因为select的一些固有缺陷导致它的应用受到了很大的限制,比如select 单个进程打开的最大句柄数是有限的。最终Linux 选择epoll 替代了select。更多关于这些系统调用的介绍与使用,请参阅 《UNIX网络编程 卷1:套接字联网API(第3版)

小结

以上关于 BIO,NIO,AIO 的说明参照了《UNIX网络编程》对 I/O 模型的分类,BIO,NIO,I/O的多路复用都是同步机制,AIO 是异步方式。本文只是简单介绍了一些概念,更多I/O 模型详细的原理和API介绍,可以阅读《UNIX网络编程》

参考资料 & 鸣谢

猜你喜欢

转载自juejin.im/post/5b7f718fe51d453890059fb9
今日推荐