摘要本文系统梳理了IO相关的核心概念和面试要点。首先明确IO的定义和两个阶段准备与传输接着介绍五种网络IO模型BIO、NIO、IO多路复用、信号驱动IO、异步IO并辨析同步/异步、阻塞/非阻塞的区别。重点澄清了Java NIO与网络模型中NIO的概念差异详细讲解了Java NIO的三个核心组件Channel、Buffer、Selector及其与IO多路复用的关系。最后对比了select、poll、epoll三种多路复用实现机制以及水平触发LT与边缘触发ET的工作模式。一般在面试的时候面试官都提出常见的问题讲一下你对IO的理解IO模型有哪些IO多路复用是怎么实现的讲一下Java中的NIO这篇文章系统地梳理一下我对IO这块的理解。IO的定义IO指的就是数据的输入与输出包括网络IO、磁盘IO。只要是IO它都会被划分为2个阶段分别是数据的准备阶段和数据的传输阶段。前者指的是硬件资源如网卡、磁盘和内存缓冲区的数据传递后者指的是缓冲区和用户程序之间的数据传递。IO的网络模型网络IO模型划分为BIO、NIO、IO多路复用、信号驱动IO、异步IO。同步/异步 阻塞/非阻塞网络IO模型被划分为这5类之后请问哪些是同步/异步哪些是阻塞/非阻塞的呢同步/异步主线程是否需要主动地去获取数据的结果。可见处理异步IO是内核全权处理属于异步IO其余的都是同步IO。阻塞/非阻塞在数据准备阶段内核和硬件资源进行数据交互主线程是否阻塞、挂起。可见只有BIO是一开始就read()就挂起了其余都是非阻塞IO。NIO模型read()之后发现缓冲区数据为空于是直接返回通过反复轮询的方式读取线程不挂起。IO多路复用则是通过一个线程来管理多个请求、多个连接将连接封装成文件描述符让内核监听事件可读/可写并且循环调用方法获取就绪事件事件就绪之后才read()因此也不是一开始就挂起的。易错点Java中的NIOJava中的NIO对应网络模型中的IO多路复用网络模型中的NIO指的是通过轮询read()的方式做到不阻塞二者不是一个概念。面试官请你讲一下Java中的NIO吧答Java中的NIO指的是网络模型中的IO多路复用通过一个线程来管理多个请求、多个连接的建立。NIO的实现主要依赖3个组件Channel、Buffer、Selector。Channel是对IO资源的抽象类似文件描述符通过将多个Channel注册到Selector复用器上管理多个请求Buffer在资源读写的时候会用到。Selector复用器根据操作系统会有不同的实现poll、epoll、select。select、poll、epoll的区别poll和select是扫描模型内核需要通过遍历的方式判断哪些资源就绪并且是把所有文件描述符全量拷贝回用户空间用户程序需要再次扫描判断哪些事件就绪。select基于位图拷贝fd数值上限是1024poll基于数组拷贝无上限。epoll是事件驱动模型当进行事件注册的时候注册到红黑树结构上内核监听事件就绪后会移动至就绪队列只返回就绪事件。边缘触发水平触发LT水平触发默认只要fd处于就绪状态每次调用都会返回编程简单不怕漏读但可能重复触发ET边缘触发只在状态变化边缘触发一次效率高但要求必须一次性读完数据需配合非阻塞IO