Redis 5分钟掌握I/O多路复用(七)

118 阅读1分钟

select

  1. 最大描述符个数限制,bitmap的位数由FD_SETSIZE设置,32位机默认是1024个。64位机默认是2048
  2. 每次select()都要遍历FD_SET数组( O ),当套接字比较多的时候,浪费CPU时间
  3. 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。

poll

  1. 没有最大描述符个数限制(基于链表来存储的)
  2. FD_SET可重用,使用reevents来置位

epoll

  1. 没有最大连接数的限制。(基于 红黑树+双链表 来存储的:1G的内存上能监听约10万个端口)
  2. 时间复杂度低: 边缘触发和事件驱动,监听回调,时间复杂度O(1)。只有活跃可用的fd才会调用callback函数;即epoll最大的优点就在于它只管“活跃”的连接,而跟连接总数无关,因此实际网络环境中,Epoll的效率就会远远高于select和poll。 3.内存拷贝:利用mmap()文件映射内存加速与内核空间的消息传递,减少拷贝开销。

devarea.com/linux-io-mu…