多路复用I/O:select、poll、epoll的实现原理,epoll惊群现象

多路复用I/O

  • 与客户端建立连接后,内核会为客户端分配一个fd(文件描述符,能标志一个客户端)
  • 多路复用IO指内核监控客户端(fd)是否有数据到来,当我们知道有数据到来时,只需要调用多路复用的select/poll/epoll提供系统调用即可,将我们想知道的客户端(fd)传入,内核就会返回哪些客户端的数据准备好了。
  • 原先是有几个fd,就进行几次系统调用,一次只能判断一个客户端(fd)是否有数据传输,频繁的从用户态和内核态中切换。现在允许传入多个fd,根据fd进行一次系统调用即可,大大降低了系统的开销。其中epoll效率最高。
  • I/O多路复用通过一种机制,可以监视多个描述符,一旦某个描述符就绪,能通知程序进行相应的读写操作。

select

  • 一次调用传入的fd数量有限(最多1024个,不同内核参数可能不同)
  • 实现过程:每次调用select,都需要把fd集合从用户态拷贝到内核态,然后在内核中遍历传进来的所有fd,检查是否有数据可读,然后调用对应的系统调用,获得有数据达到的fd。最后将有数据到达的fd中的数据从内核态传到用户态做业务处理。
  • 缺点:仅仅知道有IO发生了,但不知道是哪些fd,只能无差别的轮询当前所有fd,找出有IO的fd进行操作,因此时间复杂度O(n)。同时需要维护一个用来存放大量fd的数据结构,在用户态向内核态传递存放fd的
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值