IO 多路复用 - select, poll, epoll
IO多路复用——深入浅出理解select、poll、epoll的实现 - 知乎
-
select,poll,epoll 是同步IO
因为他们是在知道可读可写事件就绪之后,自己负责读写,这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。
-
select,poll 是什么,以及相较于 epoll 的不足
都是先收集 fdlist,然后将 fdlist 从用户态拷贝到内核态,然后内核做遍历,对准备好的 fd 打上标记后返回用户态,用户态遍历即可知道对哪些 fd 进行处理。问题在于:1. fdlist 一直执行用户态到内核态的拷贝 2. select 有数量限制 3. 需要挨个遍历,无论已经可读的还是不可读的
-
什么是水平触发 LT 和边缘触发 ET ?
水平触发 LT 是只要读缓冲区不为空,写缓冲区不满,那么 epoll_wait 就会一直返回就绪,它是 epoll 的默认工作方式;边缘触发 ET ,一次性把数据读取&写入完才会发生一次触发
-
epoll 为什么比select、poll更高效?
1.epoll 采用红黑树管理 fd,插入删除查找都是 log(N),而 select,poll是通过数组或链表遍历 2. epoll 将文件描述符添加和检测分离,减少了文件描述符拷贝的消耗。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。