mysterin / question_and_answer

1 stars 0 forks source link

select epoll 原理 #140

Closed mysterin closed 5 years ago

mysterin commented 5 years ago

select

  1. 调用 select() 方法
  2. 把 fd 集合拷贝到内核空间
  3. 内核轮询 fd 集合找出有数据的 socket

缺点是要轮询两次 fd 集合, 如果有数据的 socket 占比少, 这个方法就不划算, 而且 fd 集合还有大小限制.

epoll

对比 select 方法:

  1. epoll 没有数量限制
  2. 而且一开始就在内核注册了 fd 及回调函数, 这样就减少了第一次从用户空间拷贝到内核的过程
  3. 多了一个就绪队列, 会自动把就绪的 fd 加入到这个队列, 这样就可以减少第二次轮询 fd 集合的过程了, 只要直接读取这个就绪队列就行.