美文网首页
三分钟看明白Epoll和Select的区别

三分钟看明白Epoll和Select的区别

作者: 陈码工 | 来源:发表于2020-04-23 22:15 被阅读0次

关键区别就在于是否做重复的工作!!!

假设我现在select和epoll分别维护200个fd.

select执行过程

 while True:
            try:
                # Get the list sockets which are ready to be read through select
                read_sockets, write_sockets, error_sockets = select.select(self.conn_list, [], [])  
            except BaseException as e:
                print e
                break

在每一次while循环中, select完成如下事情:

  1. 把200个fd逐个添加到Linux内核中: 调用copy_from_user拷贝fd_set(200个fd)到Linux kernel, // 这一步如果一直重复很浪费时间

  2. 遍历所有的200个fd, 注册回调函数. 回调函数的作用就是fd有事件来的时候会唤醒处在阻塞状态的select进程. 如果遍历到的这个fd当时有事件的话, 会立刻返回当前fd可读还是可写的状态掩码, 这个状态就被添加的返回的列表中. // 这一步因为要遍历200个fd并且执行注册函数的操作, 也挺花费时间的!

  3. 遍历结束后如果没有fd可读可写, 就阻塞select所在进程持续timeout秒的时间. 阻塞过程中如果有可读可写事件随时会被唤醒.
    timeout过去了, 重新遍历fd,判断有没有就绪的fd.

备注: 此处可以发现, 如果用select想要提高效率, 就得把fd_set拷贝到kernel后长期存着, 不要再每个while的循环里重复获取了. select按照这点优化一下基本上就是epoll的样子!

epoll执行过程

  1. 把200个fd逐个添加到Linux内核中(只做一次): epoll首先会给用户进程提供一个文件描述符ep_fd, 后续这个fd有事情就会通知用户进程来处理. 然后在kernel中维护了一个fd_set(用红黑树实现, 增删改查都是logN)和一个rd_llist(就绪链表). 用户态进程可以调用Epoll Control API来增减kernel中的fd_set里面的fd(用epitem作为结点, 所以epitem=fd). API具体是EPOLL_CTL_ADD添加, EPOLL_CTL_DEL删除. // 拷贝过一次就行了, 不会像select一样timeout之后还要再来走一遍这个添加过程.

  2. 注册回调函数到每个fd的等待队列上(只做一次): 这一步其实和select也没啥区别.

  3. 收集fd的事件到就绪链表: 所有拷贝到kernel并装入红黑树的fd, 如果有事件来临, 会调用ep_poll_callback函数, 导致这个fd被从黑红树中取出, 收集到内核专门的就绪链表rd_llist中. 每次执行epoll(), 其实执行的是epoll_wait()函数, 这个函数只是进去这个链表结构看一下len(rd_llist), 有的话拷贝到用户进程的内存中, 并且通知用户进程来事情了, 没有的话就继续阻塞timeout秒. 等阻塞时间读完了, epoll_wait()也只是再看一下rd_llist的长度, 没有数据的话继续blocked.

备注: 可以看出epoll其实就等于select阻塞而不要设置timeout的效果.

有高人总结: " 如此,一颗红黑树,一张准备就绪fd链表,少量的内核cache,就帮我们解决了大并发下的fd(socket)处理问题。"

参考资料

eventpoll.c源代码
https://github.com/torvalds/linux/blob/master/fs/eventpoll.c
博客对eventpoll的解析
https://blog.csdn.net/Eunice_fan1207/article/details/99674021
Python epoll API
https://docs.python.org/2/library/select.html#epoll-objects

相关文章

  • 2020-05-03

    关于 epoll 和 select 的区别?epoll 和 select 都是 I/O 多路复用的技术,都可以实现...

  • 三分钟看明白Epoll和Select的区别

    关键区别就在于是否做重复的工作!!! 假设我现在select和epoll分别维护200个fd. select执行过...

  • 小知识点(二)

    select、poll、epoll区别:详解三者区别 select,poll,epoll都是IO多路复用的机制。I...

  • select、poll、epoll之间的区别总结

    select、poll、epoll之间的区别总结[整理] select,poll,epoll都是IO多路复用的机制...

  • select和epoll区别

    socket编程并发处理的问题中,select和epoll函数的区别一直是面试中的重点。关于他俩的区别很多博客中已...

  • select 和 epoll 区别

    select原理 将 文件描述符集合 fd_set 从用户空间拷贝到内核空间,进入内核态遍历所有的文件描述符,对每...

  • select和epoll的区别

    参考:深度理解select、poll和epoll select的缺点: 1、单个进程能够监视的文件描述符的数量存在...

  • Linux中select poll和epoll的区别

    Linux中select poll和epoll的区别[https://www.cnblogs.com/kxdblo...

  • I/O多路复用

    参考资料:select、poll、epoll之间的区别总结[整理]select , poll , epollepo...

  • Epoll实现原理

    Epoll 很重要,但是 Epoll 与 Select 的区别是什么呢?Epoll 高效的原因是什么? 网上虽然也...

网友评论

      本文标题:三分钟看明白Epoll和Select的区别

      本文链接:https://www.haomeiwen.com/subject/hnpzihtx.html