zoukankan      html  css  js  c++  java
  • epoll

    windows走IOCP已经与我无缘了

    Linux 则是epoll、select/poll

    epoll_create创建一个epoll文件描述符,底层是一个红黑树和一个就绪链表

    红黑树存储文件描述符节点数据  就绪链表存储就绪的文件描述符节点数据

    epoll_ctl添加新的描述符,先判断红黑树有没有这个文件描述符节点

    有->返回

    没有->红黑树插入新节点,通知内核注册回调函数

    当接收到某个文件描述符传入数据,内核把该节点插入到就绪链表

    epoll_wait收到消息,数据拷贝到用户空间,清空链表

    LT模式 电平模式

    epoll_wait检查到文件描述符其上有事件发生并通知应用程序后,应用程序可以不立刻处理

    这样应用程序下一次调用epoll_wait的时候,epoll_wait还会通知应用程序,直到被处理

    在清空就绪链表后检查文件描述符是哪种模式,如果是LT && 该节点有事件未处理

    则把该节点重新放入就绪链表,epoll_wait返回

    ET模式 边沿触发

    epoll_wait检查到文件描述符其上有事件发生并通知应用程序后,应用程序必须立刻处理

    不检查

    ET很大程度上降低了同一个epoll事件被重复触发的次数

    select、poll、epoll区别

    epoll检测到就绪的文件描述符后,触发回调函数,回调函数将该文件描述符上对应的时间插入内核就绪事件队列,再把器内容拷贝到用户空间

    系统调用 select poll epoll
    事件集合 通过3个参数分别传入感兴趣的可读、可写、异常等事件,内核通过对这些参数的在校修改反馈其中的就绪事件。每次调用selecet都要重置这3个参数 统一处理所有事件类型,只需传入一个事件集合参数。再通过pollfd.events传入感兴趣事件,内核通过修改pollfd.revents反馈其中就绪事件 内核通过管理一个事件表直接管理用户感兴趣的所有事件。每次调用epoll_wait的时候无需反复传入用户感兴趣事件。epoll_wait系统调用参数events仅仅用来反馈就绪的事件
    应用程序索引文件描述符时间复杂度 O(n) O(n) O(1)
    最大支持文件描述符数 一般有最大限制值 65535 65535
    工作模式 LT LT LT/ET
    内核实现和工作效率 轮询方式检测就绪事件,O(n) 轮询方式检测就绪事件,O(n) 采用回调方式检测就绪事件,O(1)
  • 相关阅读:
    python文件上传
    Django
    Python生产环境部署(fastcgi,uwsgi)
    tp3.2 自带的文件上传及生成缩略图功能
    图片上传--base64
    图片上传
    PHP处理大数据量老用户头像更新的操作--解决数据量大超时的问题
    mysql悲观锁处理赠品库存超卖的情况
    bzoj 3551: [ONTAK2010]Peaks加强版
    bzoj 4817: [Sdoi2017]树点涂色
  • 原文地址:https://www.cnblogs.com/Juntaran/p/5902992.html
Copyright © 2011-2022 走看看