IO 多路复用 - select, poll, epoll

IO 多路复用 - select, poll, epoll

IO多路复用——深入浅出理解select、poll、epoll的实现 - 知乎

  1. select,poll,epoll 是同步IO

    因为他们是在知道可读可写事件就绪之后,自己负责读写,这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

  2. select,poll 是什么,以及相较于 epoll 的不足

    都是先收集 fdlist,然后将 fdlist 从用户态拷贝到内核态,然后内核做遍历,对准备好的 fd 打上标记后返回用户态,用户态遍历即可知道对哪些 fd 进行处理。问题在于:1. fdlist 一直执行用户态到内核态的拷贝 2. select 有数量限制 3. 需要挨个遍历,无论已经可读的还是不可读的

  3. 什么是水平触发 LT 和边缘触发 ET ?

    水平触发 LT 是只要读缓冲区不为空,写缓冲区不满,那么 epoll_wait 就会一直返回就绪,它是 epoll 的默认工作方式;边缘触发 ET ,一次性把数据读取&写入完才会发生一次触发

  4. epoll 为什么比select、poll更高效?

    1.epoll 采用红黑树管理 fd,插入删除查找都是 log(N),而 select,poll是通过数组或链表遍历 2. epoll 将文件描述符添加和检测分离,减少了文件描述符拷贝的消耗。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。