ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于 BIO & NIO & AIO

2021-06-25 20:33:01  阅读:227  来源: 互联网

标签: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,线程
来源: https://www.cnblogs.com/menghe999/p/14932432.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有