[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个数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值