IO模型及详解io多路复用
IO模型大致可分为四类:同步阻塞IO(Blocking IO)、同步非阻塞 IO(Non-blocking IO)、 IO 多路复用(IO Multiplexing)、 异步 IO(Asynchronous IO)。
java开发层面的IO分为两种面向流(Input/Output Stream)和面向缓冲区(Buffer),面向流则为BIO,面向缓冲区则为NIO(New IO)NIO依赖操作系统底层select/poll/epoll函数。
java中的NIO,所谓非阻塞,意思是通道(channel)的概念,缓冲区(buffer)可在同一通道内读写操作。
什么是 IO 多路复用?指的是一个进程/线程可以同时监视多个文件描述符(一个网络连接,操作系统底层使用一个文件描述符来表示),一旦其中的一个或者多个文件描述符可读或者可写,系统内核就通知该进程/线程。在 Java 应用层面,如何实现对多个文件描述符的监视呢?需要用到一个非常重要的 Java NIO 组件——Selector 选择器。
io多路复用
可以解释为,Reactor设计模式,其运用操作系统 底层select poll epoll模型,用户态进行系统调用(select poll epoll),切换为内核态,内核态监听事件返回给用户态应用系统,返回int为监听的几个连接发生了事件变化。
select
select系统调用有一个重要的参数fd文件描述符,即你要监听哪些文件描述符(连接),文件描述符集合rset用一个bitmap位图表示,位图大小为1024,即最多只能监听1024个客户端连接。
当发起系统调用时,会将rset拷贝到内核态,然后内核态监听有没有数据可以处理,监听的所有文件描述符都没有数据的话会一直阻塞,知道有数据,将有数据的fd索引置一,然后返回给用户态。
操作系统根据中断信号感知哪个文件描述符有数据,而用户态应用通过系统调用select获取哪些文件描述符有数据等待处理。
poll
Poll工作原理与select基本相同,不同的是将位图改成结构体数组,也有资料说链表,没有了最大1024限制,依然有fd集合的拷贝和O(n)的遍历。
epoll
为了解决fd集合拷贝问题,epoll采用用户态与内核态共享epoll_fds集合,当调用epoll_wait系统调用时,内核态会去检查哪些fd有事件,检查完毕后会将共享的epoll_fds集合重排序,将有事件的fd放在前面,并返回有事件的fd个数。
客户端收到返回个数,就不需要全部遍历,而是直接处理fd集合(红黑树)。
1、创建一个epoll, int epoll_create(int size)
2、注册监听函数int epoll_ctl()
3、等待文件描述符int epoll_wait
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)