美文网首页
知识回顾|NIO、BIO

知识回顾|NIO、BIO

作者: 三更冷 | 来源:发表于2023-02-05 20:17 被阅读0次

    本文回答以下问题,文内可能有遗漏、错误或表达不够清晰的地方。

    • IO

    ① java NIO与BIO的区别?
    ② reactor线程模型是什么?什么是多路复用机制?
    ③ 同步阻塞、同步非阻塞、异步的区别?
    ④ select、poll、eopll的区别?

    ① java NIO与BIO的区别?

    BIO -- Blocking IO 即阻塞式 IO。
    NIO -- Non-Blocking IO, 即非阻塞式 IO 或异步 IO。

    BIO 基于字节流和字符流进行操作,数据的读取写入必须阻塞在一个线程内等待其完成。

    NIO 主要有三大核心部分:

    • Channel (通道):所有的 NIO 操作始于通道,通道是数据来源或数据写入的目的地。
    • Buffer (缓冲区):一个 Buffer 本质上是内存中的一块,我们可以将数据写入这块内存,之后从这块内存获取数据
    • Selector (选择器、多路复用器):多路复用,用于实现一个线程管理多个 Channel

    NIO 基于 Channel 和 Buffer 进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector 用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道,处理多个事件。

    综上,它们之间的区别有:
    1、BIO,面向流的,只能读或者只能写,同步阻塞 IO 模式
    2、NIO,面向块的(缓冲区),可以同时进行读写,同步阻塞 IO 模式

    ② reactor 线程模型是什么?什么是多路复用机制?

    reactor 是什么

    关于 reactor 是什么,《面向模式的软件架构》做出了回答:

    The reactor design pattern is an event handling pattern for handling service requests 
    delivered concurrently to a service handler by one or more inputs. 
    The service handler then demultiplexes the incoming requests and 
    dispatches them synchronously to the associated request handlers.
    

    对应翻译如下,其中关键点标红:

    反应器设计模式是一种事件驱动模式,用于处理由一个或多个输入并发传递给服务处理程序的服务请求。然后,服务处理程序对传入的请求进行多路复用,将它们同步分派给关联的请求处理程序。

    处理方式:inputs -> service handler & event dispatch -> request handlers

    为何要用reactor,能解决什么问题

    传统阻塞IO模型的不足

    1. 每个连接都需要独立线程处理,当并发数大时,创建线程数多,占用资源
    2. 采用阻塞IO模型,连接建立后,若当前线程没有数据可读,线程会阻塞在读操作上,造成资源浪费

    针对传统阻塞IO模型的两个问题,可以采用如下的方案

    1. 基于池化思想,避免为每个连接创建线程,连接完成后将业务处理交给线程池处理
    2. 基于IO复用模型,多个连接共用同一个阻塞对象,不用等待所有的连接。遍历到有新数据可以处理时,操作系统会通知程序,线程跳出阻塞状态,进行业务逻辑处理

    Reactor 模式基本设计思想 = I/O 复用 + 线程池

    如何用,更好的方式

    《Scalable IO in Java》中介绍了 Reactor 模型中的三种角色:

    • Acceptor:处理客户端连接事件。
    • Reactor:负责监听和分配事件,将I/O事件分派给对应的Handler。
    • Handler:执行非阻塞任务。可用资源池来管理。

    Acceptor 不断地接收客户端的连接,然后将接收到的连接交由Reactor进行分发,最后由具体的Handler进行处理。

    多Reactor多线程模型

    什么是IO多路复用?

    • IO 多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄;
    • 一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;
    • 没有文件句柄就绪就会阻塞应用程序,交出CPU。

    多路是指网络连接,复用指的是同一个线程

    ③ 同步阻塞、同步非阻塞、异步的区别?

    同步阻塞:调用者发出请求后会一直等待结果

    同步非阻塞:调用者发出请求后就去执行其他任务,过一会再询问被调用者执行结果

    异步:当一个异步过程调用发出后,调用者不会立即得到结果。而是在“发出后”,“被调用者“通过状态,来通知调用者,或通过回调函数处理这个调用

    阻塞式IO、非阻塞式IO甚至包括多路复用IO都是基于操作系统级别对“同步IO”的实现

    ④ select、poll、eopll的区别?

    参考文章

    https://zhuanlan.zhihu.com/p/69341619
    https://javadoop.com/post/java-nio
    https://pdai.tech/md/interview/x-interview.html
    https://juejin.cn/post/6882984260672847879

    相关文章

      网友评论

          本文标题:知识回顾|NIO、BIO

          本文链接:https://www.haomeiwen.com/subject/mggohdtx.html