码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • I/O多路转接-epoll


    I/O多路转接-epoll

    • epoll
      • epoll的三个系统调用
      • epoll工作方式
        • 水平触发 (LT)
        • 边缘触发(ET)

    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模式下,必须是处在非阻塞模式下的。

  • 相关阅读:
    BUG解决Button类不能从UnityEngine.UI中引用
    数据结构与算法:树 顺序存储二叉树(二)
    ChatGPT从⼊⻔到精通
    Unable to load ‘@webpack-cli/serve‘ command问题解决
    信创加速,美创科技加入UOS主动安全防护计划(UAPP)
    深入解析:探索Nginx与Feign交锋的背后故事 - 如何优雅解决微服务通信中的`301 Moved Permanently`之谜!
    elasticsearch查询之keyword字段的查询相关度评分控制
    FPGA学习-vivado软件的使用
    数据结构Ⅴ深入理解堆的调整算法
    12_C++_《结构体和文件》_笔记整理
  • 原文地址:https://blog.csdn.net/weixin_46107667/article/details/126251232
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号