什么是 I/O 多路复用?
发布于
一、定义
单个线程通过系统调用同时监听多个文件描述符,哪个就绪就处理哪个,避免阻塞在单个 I/O 上。
二、select
select(maxfd, &readfds, &writefds, &exceptfds, &timeout);
- 位图存储 fd,有最大数量限制(1024)。
- 每次调用都要把 fd 集合从用户态拷贝到内核态。
- 内核遍历所有 fd,返回时不知道哪些就绪,需用户遍历。
三、poll
用链表代替位图,无数量限制,但仍是线性扫描。
四、epoll(Linux 特有)
- epoll_create 创建实例。
- epoll_ctl 注册/修改/删除 fd。
- epoll_wait 等待就绪。
- 只返回就绪的 fd,无需遍历全部。
- 支持水平触发(LT)和边缘触发(ET)。
五、应用
Redis、Nginx、Netty 都基于 epoll 实现高并发。