本文回答以下问题,文内可能有遗漏、错误或表达不够清晰的地方。
- 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模型的不足
- 每个连接都需要独立线程处理,当并发数大时,创建线程数多,占用资源
- 采用阻塞IO模型,连接建立后,若当前线程没有数据可读,线程会阻塞在读操作上,造成资源浪费
针对传统阻塞IO模型的两个问题,可以采用如下的方案
- 基于池化思想,避免为每个连接创建线程,连接完成后将业务处理交给线程池处理
- 基于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
网友评论