[C10K] select和poll存在的问题

select和poll存在的问题

  • 每次调用select()或poll()时,都涉及两次expensive 用户态–内核态拷贝
    • 调用函数时,需要传递结构体到内核;
    • 函数返回时,再次从内核拷贝结构体;
    • 对select而言是fd_set,对poll而言则是struct pollfd[ ];
    • 对select而言,结构体大小固定;
    • 对poll而言,结构体大小随fd个数增多而增加;
  • 每次调用select()或poll(),内核必须检查所有被指定的fd
    • select()或poll()本身是无记忆的,哪怕我们一直在监视同一组fd,select()或poll()也不会为我们留心注意下;select()或poll()只会在我们的明确要求下才会起身去检查一遍;
    • 在select()中,待检查的fds被实现成bitset,内核在收到bitset后只能遍历每一位来确定哪些fd需要检查;如果fd分布的比较稀疏,那么时间开销就很不理想;
  • 在select()或poll()调用完成后,还需要检查返回的结构体中的每个元素;
    • 对于select(),需要用FD_ISSET()一个一个fd的去查;
    • 而poll(),需要对struct pollfd[ ]中的每一个进行检查;

epoll等方式革命性的变化就是根据发生的I/O事件来scale,而不是fd个数

猜你喜欢

转载自blog.csdn.net/sai_j/article/details/79532420
今日推荐