人工智能学习

关于 BIO & NIO & AIO

本文主要是介绍关于 BIO & NIO & AIO,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

必要的基础

  • IO:输入输出(IO)是指计算机同任何外部设备之间的数据传递。

  • 同步与异步

    • 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回
    • 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果
    • 同步异步指的是,当数据已经ready的时候,读写操作是同步读还是异步读
  • 阻塞与非阻塞

    • 阻塞:阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。

    • 非阻塞:非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。

    • 阻塞与非阻塞指的的是当不能进行读写(网卡满时的写/网卡空的时候的读)的时候,I/O 操作立即返回还是阻塞;

  • 同/异步 和 阻塞/非阻塞 关系

    • 阻塞与非阻塞指的的是当不能进行读写(网卡满时的写/网卡空的时候的读)的时候,I/O 操作立即返回还是阻塞;同步异步指的是,当数据已经ready的时候,读写操作是同步读还是异步读,阶段不同而已。美团技术团队

那么同步阻塞(BIO)、同步非阻塞(NIO)和异步非阻塞(AIO)又代表什么意思呢?上面的太抽象了

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

0、BIO同步阻塞


BIO模型本质上是一对一的通信,也就是从客户端发起请求开始,服务端处理请求(如果资源没有准备好,请求线程会一直占用,直至请求到资源为止,这个过程中其它请求是无法被处理的),当然服务端可以通过多线程的方式,实现同时处理多个请求线程,但是多线程的使用要注意,因为线程的创建和管理非常消耗系统资源。所以这种方式对于高并发也是扛不住的。

​ 后来通过线程池+消息队列的方式,演化出伪异步IO,服务端维护这个线程池和消息队列,如果有新的请求,服务端将其打包为一个task对象(该TasK类实现Runnable接口),将此task放入线程池中处理,通过消息队列的方式确定处理哪一个task,这种伪异步IO采用线程池实现,避免创建多个线程导致资源耗尽的问题,但是由于底层还是BIO模型,所以还没有从根本解决问题。

1、NIO同步非阻塞


​ NIO在JDK1.4引入,位于JDK的java.nio包中,NIO主要涉及三个概念:Buffer缓冲区Selector选择器Channel通道

NIO的特点如下

  • 一个线程可以处理多个请求

  • NIO提供非阻塞通信方式,BIO是阻塞的

  • NIO是面向缓冲区的,BIO是面向流的

    • java中提供很多缓冲区,如ByteBuffer常用、CharBuffer、...注意StringBuffer不是Buffer缓冲区,它只是一个可以原地动态修改的String类型
    • NIO中的通信时全双工的,也就是可以同时读写操作;而BIO的流中读写是单向的。
  • 避免同步IO通讯效率过低

  • 减小线程多的压力

    image-20210625182027455

    ​ 从图中我们可以发现,客户端和服务端可以同时使用NIO模型。

    NIO固然好,但是NIO的编程难度较大,维护成本较高。所以我们可以使用NIO的框架来降低开发难度,流行基于Java NIO通信框架有Mina、Netty、Grizzly等

2、AIO异步非阻塞


​ AIO也是基于NIO的,不过AIO是异步非阻塞的。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

参考文章

  • BIO,NIO,AIO 总结

  • socket通信中的IO模型

  • Java核心技术(进阶)-NIO基础

  • nio的实现原理

这篇关于关于 BIO & NIO & AIO的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!