select, poll, epoll

1. select 不足

  1. 监听1024个描述符号的限制
  2. rset不可重用 , 每次需要zero, 再填充
  3. 解除select阻塞后需遍历每一个fd, 因为不知道那个有数据

2. poll的实现和select非常相似,这里采用同样的方法进行分析。

  1. 1024限制没有
  2. 不需要rset, 而是引入了一个标识位, 内核来处理
  3. 但poll和select同样存在一个性能缺点就是包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。(需要遍历文件描述符)

3. epoll

边缘触发(edge triggered ET)
对于边缘出发,epoll_wait()只返回一次,即只在该读写事件发生时返回,也就是说如果事件处理函数只读取了该文件描述缓冲区的部分内容时返回,再次调用epoll_wait(),虽然此时该描述符对应缓冲区中还有数据,但epoll_wait()函数不会返回。
水平触发(level triggered LT)
对于水平出发,它不管是否有事件反生,只要文件描述符对应的缓冲区中有数据可读写,epoll_wait()就会返回。

posted on 2022-09-26 13:33  WillingCPP  阅读(18)  评论(0编辑  收藏  举报

导航