问题:什么是BIO?
- BIO(同步并阻塞):一个请求对应一个线程,如果线程数不够连接则会等待空余线程或者拒绝连接。
- 核心原理:利用CPU中断
- 阻塞线程进入休眠,将执行权限交给其他线程。
- 优缺点:
- 优点:阻塞是不会占用系统资源且程序易编程与理解。非常适合
- 缺点:高并发场景需要较高的线程数量(资源占用);线程切换有成本。
- 使用范围:适用于连接数目比较小且固定的场景,适合处理重量级IO,这种方式对服务器资源要求比较高,并发局限于应用中。并行量特别大的场景除外。
问题:什么是NIO?
- NIO(同步非阻塞):基于事件驱动的,采用了Reactor模式,它使用一个线程管理所有的socket通道,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
- 核心原理:由专门的数据结构(sellctor与epoll)负责统计发生I/O,再允许程序监听变更。
- 优缺点:
- 缺点:编程复杂,针对特别大量IO才有明显的性能提升,不适合处理重量级IO传输。
- 优点:可处理大量IO请求场景
- 适用范围:一般只适用与连接数目较大但数据传输量少的应用,如聊天应用等。
问题:什么是AIO?
- AIO(异步非阻塞):AIO引入异常通道的概念,采用Proactor模式,一个有效的请求才启动一个线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用与连接数较多且连接时间长的应用。
- 核心原理:异步编程,本质异步转同步,通常结合epoll以及directmemory。例如内存屏障以及java的Future。
- 优缺点:
- 缺点:不适合轻量级数据传输,因为进程之间频繁的通信在追错、管理和资源消耗上不是很可观。
- 优点:并发性高、CPU利用率高、线程利用率高
- 适用场景:对并发有需求的重量级数据传输。
问题:三种IO场景对比如何?
线程数指的是对应的是IO处理线程:
- BIO是一个IO事件对应一个线程进行监听处理。
- NIO是一个selector的线程监听所有IO,对应IO的事件处理交给监听的事件创建线程处理。
- AIO是将所有IO交给内核系统处理,内核系统处理完事件后将数据回调给应用。
问题:NIO的关键设计?
-
Channel的设计
- 对系统内部的(selctor或epoll)进行了一次封装,每个用户的连接就是一个channel。
- 具体可理解Reactor模型
-
DirectMapping的设计
- 在内核空间创建一块内存DirectMemory提供给用户空间直接使用。
- DirectMemory本质是Java的堆外内存,由内核创建。内核将这部分内存提供给JVM调用,减少一次数据拷贝。
参考:
https://blog.csdn.net/qq_35458371/article/details/106827390