多路复用IO.md

多路复用的一些参考文章

参考文章:

  1. select 用法&原理详解(源码剖析)
    https://blog.csdn.net/zhougb3/article/details/79792089
  2. 深入 select 多路复用内核源码加驱动实现
    https://my.oschina.net/fileoptions/blog/911091
  3. 彻底搞懂 epoll 高效运行的原理
    https://blog.csdn.net/y277an/article/details/97622206

记录

select 是通过 bitmap 来记录所有文件描述符的,所以有最大 1024 个的限制。
1024 是内核默认的定义,如果想突破,需要重新编译。

进化路线

select :
缺点:

  1. 1024 的最大值上限。
  2. 每次都需要重新构建 fdset
  3. 两次用户态和内核态的拷贝,
  4. 需要遍历整个 fdset

poll:
使用自定义数据结构解决了 select 1024 上限的问题
但是还是有其他的缺点

epoll:
epoll 底层使用红黑树和链表
epoll 会在内核的内存空间开辟一个存储区,通过 epoll_ctl 设置需要监听的文件描述符。当有 socket 就绪后,会通过回调函数,把文件描述符存储到就绪队列中。
当用户态程序调用 epoll_wait 时,返回就绪队列。
解决了 select 的其他缺点。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!