select & epoll的比较

select

  • 1、每次调用 select 需要把 fd 集合从用户态拷贝到内核态,这个开销在 fd 很多时会很大
  • 2、每次调用 select 都需要在内核遍历传进来的 fd, 这个开销在 fd 很多时也很大
  • 3、select 支持的文件描述符太少了,默认是 1024

epoll

  • epoll 提供了三个函数
    • epoll_create:创建句柄,内核在内核态开始准备存储要监控的句柄
    • epoll_ctl:对指定文件描述符进行OP操作
    • epoll_wait:等待事件的产生
  • 1、针对第一个缺点:epoll_ctl 会将 fd 拷贝到内核中 epoll 句柄对应的数据体,epoll 保证了每个 fd 在整个过程中只会拷贝一次,避免了重复拷贝
  • 2、针对第二个缺点:epoll_ctl 会给 fd 注册回调函数,当设备就绪,执行回调函数会把 fd 添加到就绪列链表,epoll_wait 实际上只是从就绪链表中查询是否有就绪的 fd
  • 3、针对第三个缺点:epoll 没有这个限制,他所支持的上限是最大可以打开的文件数目

你可能感兴趣的:(select & epoll的比较)