• Java中三种I/O模型 BIO,NIO,AIO


    同步,异步,阻塞,非阻塞四个两两组合可以得到四个组合:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞

    同步阻塞BIO:客户端发送请求给服务端,服务端处理请求的时间会很久。客户端会一直等待服务端的响应,此时客户端是不能做任何事情的,服务端也不会接收其他客户端的请求

    同步非阻塞NIO:客户端发送请求给服务端,服务端处理请求的时间会很久。客户端会一直等待响应,但是服务端是可以处理其他客户端的请求(一个服务端可以服务多个客户端)

    异步阻塞:客户端不会等待服务端的响应,可以做其他事情

    异步非阻塞AIO:客户端不会等待,可以做其他事情,同时服务端也可以处理其他客户端的请求,等服务端处理完这个客户端的请求就通知客户端你的请求处理完了

    总结:同步还是异步指的是客户端是否一直等待响应,阻塞非阻塞就是服务端可不可以处理其他客户端的请求

    UNIX 系统下, IO 模型一共有 5 种: 同步阻塞 I/O同步非阻塞 I/OI/O 多路复用信号驱动 I/O 和异步 I/O

    这也是我们经常提到的 5 种 IO 模型

    (1)同步阻塞I/O模型

     

     应用程序发起read调用后,一直处于阻塞状态

    内核开始准备数据,直到把数据拷贝到应用程序,应用程序才被唤醒

    (2)同步非阻塞 IO 模型

     应用程序会一直发起 read 调用,避免了一直阻塞

    直到数据就绪了,应用程序再次发起调用的时候,应用程序才进入阻塞状态,当数据拷贝完成,应用程序才被唤醒

    相比于同步阻塞 IO 模型,同步非阻塞 IO 模型确实有了很大改进。通过不断发起read调用,避免了一直阻塞

    但是,这种 IO 模型同样存在问题:应用程序不断进行 I/O 系统调用轮询数据是否已经准备好的过程是十分消耗 CPU 资源的

    这个时候,I/O 多路复用模型 就上场了

    (3)I/O 多路复用模型 

     线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,内核给应用程序发送一个ready信号,此时应用程序发起read调用,应用程序进入阻塞状态,等数据拷贝完应用程序被唤醒

    IO 多路复用模型,通过减少无效的系统调用,减少了对 CPU 资源的消耗

    (4)异步I/O

     应用程序进行read调用后,会直接返回,不会阻塞在那里

    当内核拷贝完数据后,通知应用程序

    Java中有三种I/O模型 BIO,NIO,AIO

    1.BIO Blocking I/O

    BIO属于同步阻塞I/O模型

    当应用程序不多的时候,没问题,但是当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。

    2.NIO (Non-blocking   I/O)

     对于高负载、高并发的(网络)应用,应使用 NIO

    NIO中有一个非常重要的选择器 ( Selector ) 的概念,也可以被称为 多路复用器。通过它,只需要一个线程便可以管理多个客户端连接。当客户端数据到了之后,才会为其服务

    3. AIO (Asynchronous I/O)

    它是异步 IO 模型

    目前来说 AIO 的应用还不是很广泛。Netty 之前也尝试使用过 AIO,不过又放弃了。这是因为,Netty 使用了 AIO 之后,在 Linux 系统上的性能并没有多少提升。

    总结:

  • 相关阅读:
    汽车电子行业知识:UWB技术及应用
    ROS从入门到精通系列(二十七)-- ros Parameter Server
    第二章 java概述课后习题【韩顺平java】
    重温数据库-修改表-ALTER TABLE
    数据挖掘复盘——apriori
    产品-Axure9英文版,图片放大缩小效果
    rv1126-rv1109-环境搭建-全部编译的方法
    2023-2028年中国硫酸铝钾市场发展态势及未来发展趋势报告
    一个Windows远程工具,小巧但实用,支持RDP、SSH、SFTP、FTP等多种协议
    2月21日,每日信息差
  • 原文地址:https://blog.csdn.net/weixin_47414034/article/details/128213909