• I/O多路转接-epoll


    epoll

    epoll的三个系统调用

    epoll_creat()

    int epoll_create(int size);

    创建epoll模型。
    本质:在OS创建epoll模型,在OS中有就绪队列、红黑树、网络协议栈和底层驱动之间建立回调机制,当事件就绪时,采用回调机制向就绪队列之间插入就绪事件。

    epoll_ctl()

    int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

    用户告知内核,需要帮我关注一下哪些fd上的哪些事件。
    本质:向红黑树之中设置节点以及数据(文件描述符和要关心的事件),本质就是修改红黑树。

    epoll_wait()

    int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

    内核告知用户,哪些fd上的哪些事件已经就绪。
    本质:通过检测就绪队列,从就绪队列中拿出就绪事件

    在这里插入图片描述

    epoll工作方式

    epoll有两种工作方式——水平触发(LT)和边缘触发(ET)

    水平触发 (LT)

    epoll默认状态下就是水平触发工作模式

    • 当epoll检测到socket上事件就绪的时候, 可以不立刻进行处理. 或者只处理一部分
    • 如上面的例子, 由于只读了1K数据, 缓冲区中还剩1K数据, 在第二次调用 epoll_wait 时, epoll_wait仍然会立刻返回并通知socket读事件就绪.
    • 直到缓冲区上所有的数据都被处理完, epoll_wait 才不会立刻返回
    • 支持阻塞读写和非阻塞读写

    边缘触发(ET)

    • 当epoll检测到socket上事件就绪时, 必须立刻处理
    • 如上面的例子, 虽然只读了1K的数据, 缓冲区还剩1K的数据, 在第二次调用 epoll_wait 的时候, epoll_wait 不会再返回了
    • 也就是说, ET模式下, 文件描述符上的事件就绪后, 只有一次处理机会
    • ET的性能比LT性能更高( epoll_wait 返回的次数少了很多). Nginx采用ET模式使用epoll.
    • 只支持非阻塞的读写

    ET工作模式下,recv或者write必须处于非阻塞模式下进行读取

    原因:处于ET模式下,因为只会通知一次就绪,所以要求必须将所有的事件读取完毕,这样就要求在recv时是循环式的,就有可能会存在在最后一次读取时,存在是0的情况,在这种情况下,调用recv就会阻塞,这样进程就会被挂起,服务器将无法响应任何外部事件,所以就要求在ET模式下,必须是处在非阻塞模式下的。

  • 相关阅读:
    PyG搭建R-GCN实现节点分类
    算法读书笔记-3
    Bus:消息总线
    【机器学习】交叉验证 Cross-validation
    Midjourney入门:AI绘画真的能替代人类的丹青妙笔吗?
    【尚品汇】项目笔记
    Vue2父传子、子传父和兄弟间互传
    HTML5期末大作业:基于HTML+CSS+JavaScript仿蘑菇街购物商城设计毕业论文源码
    皕杰小程序之app.josn
    网络中特殊的 IP 地址
  • 原文地址:https://blog.csdn.net/weixin_46107667/article/details/126251232