多路复用IO.md
多路复用的一些参考文章
参考文章:
- select 用法&原理详解(源码剖析)
https://blog.csdn.net/zhougb3/article/details/79792089 - 深入 select 多路复用内核源码加驱动实现
https://my.oschina.net/fileoptions/blog/911091 - 彻底搞懂 epoll 高效运行的原理
https://blog.csdn.net/y277an/article/details/97622206
记录
select 是通过 bitmap 来记录所有文件描述符的,所以有最大 1024 个的限制。
1024 是内核默认的定义,如果想突破,需要重新编译。
进化路线
select :
缺点:
- 1024 的最大值上限。
- 每次都需要重新构建 fdset
- 两次用户态和内核态的拷贝,
- 需要遍历整个 fdset
poll:
使用自定义数据结构解决了 select 1024 上限的问题
但是还是有其他的缺点
epoll:
epoll 底层使用红黑树和链表
epoll 会在内核的内存空间开辟一个存储区,通过 epoll_ctl 设置需要监听的文件描述符。当有 socket 就绪后,会通过回调函数,把文件描述符存储到就绪队列中。
当用户态程序调用 epoll_wait 时,返回就绪队列。
解决了 select 的其他缺点。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!