首页 > 其他分享 >IO多路复用

IO多路复用

时间:2024-06-07 16:24:45浏览次数:20  
标签:多路复用 epoll Epoll 链表 描述符 fd IO

基本概念

IO多路复用指用一个线程来处理多个客户端请求
Epoll是一种IO事件通知机制
IO输入输出对象可以是 文件,网络,管道等用文件描述符fd表示的
事件Event分为可读事件和可写事件,有两种触发机制(水平触发和边缘触发)
水平触发机制:只要fd关联的内核缓冲区非空/非满,数据就可以一直读/写,就可以一直发出可读/可写信号进行通知

Epoll接口介绍

epoll_create会创建epoll实例,会创建红黑树结构和双向链表结构的ReadList

epoll_ctl会添加,修改,删除 注册到epoll中的fd对应的事件Event

epoll_wait系统调用等待事件发生,来回调返回给用户满足条件的事件

Epoll优点

(1)Epoll使用了事件就绪通知,避免线性轮询所有fd文件描述符,避免不必要开销
(2)可以有效处理大量并发连接
(3)Epoll_wait只返回就绪的文件描述符,减少事件不必要处理
(4)支持边缘触发机制,减少数据从内核到用户空间的拷贝次数

Epoll在Linux内核中的实现方式

(1)红黑树:存储注册的文件描述符FD,在添加删除查找fd的时候时间复杂度都是O(logn),是一种自平衡的二叉搜索树
(2)就绪队列ReadList:内核维护一个双向链表,包含已就绪的文件描述符,当文件描述符就绪时会被添加到链表中,程序可以通过系统调用获取链表中存储的就绪事件,避免轮询所有文件描述符,采用双向链表的原因是因为双向链表的插入和删除时间复杂度都是O(1)
(3)红黑树的有序性保证了事件触发顺序与节点在红黑树中的顺序一致,当多个时间同时准备就绪时,epoll会按照红黑节点的顺序依次触发事件

Nginx中的Epoll和惊群现象

Nginx采用的Epoll IO多路复用机制,每个Worker进程都会通过epoll_create创建单独的Epoll实例,共享监听套接字,由操作系统来分配每个连接的文件描述符fd注册到worker的Epoll实例中。

Epoll惊群现象为一个新的连接到达监听套接字时,多个Epoll都争抢将连接注册到自己的Epoll,最终只能由一个Epoll能够处理,其他的进程就白唤醒了,这就导致了系统资源的浪费
Accept Mutex 机制决定哪个 worker 进程接受新的连接,开启互斥锁,使得只有拿到互斥锁的worker进程可以处理这个连接请求

标签:多路复用,epoll,Epoll,链表,描述符,fd,IO
From: https://www.cnblogs.com/iamxiaofu/p/18236991

相关文章

  • Java开发必读,谈谈对Spring IOC与AOP的理解
    本文分享自华为云社区《超详细的Java后台开发面试题之SpringIOC与AOP》,作者:GaussDB数据库。一、前言IOC和AOP是Spring中的两个核心的概念,下面谈谈对这两个概念的理解。二、IOC(InverseofControl)控制反转,也可以称为依赖倒置。所谓依赖,从程序的角度看,就是比如A要调用B的方法......
  • 同三维T5020 (新款)单路USB3.0高清HDMI免驱采集盒在OBS Studio的使用方法
    一、首先将产品与需要采集的信号按说明把硬件都连接好。然后用鼠标右击我的电脑(WIN10系统下)或计算机(WIN7系统下)点击管理进入到设备管理器,以下在WIN10系统下显示如下:红色标注的就是采集盒设备。表明已经安装成功。进入到OBS的官网将软件下载到电脑。下载地址如下:Down......
  • PHP Standards Recommendations(PSR)
    以下是PHPStandardsRecommendations(PSR)的全部内容:PSR-1:基础编码标准:规定了PHP代码的基本格式和要求,包括文件的编码、标签的使用、代码的组织等。PSR-2:编码风格指南:是对PSR-1的扩展,详细规定了PHP代码的排版、缩进、命名规范等,以提高代码的可读性。PSR-3:日志接口:定义......
  • 关于CoPE与Deformable attention的思考
    最近我在刷知乎的时候关注到了Meta的一个新工作CoPE(ContextualPositionEncoding,上下文位置编码),在了解了其中的核心理念和实现后,我不自觉地联想到了Deformableattention,然后尝试将两者的相似点进行了一点整理。为什么需要CoPE?在处理文本序列时,理解每个词的位置至关重要。例如,......
  • 【YOLOv8改进】YOLOv8 更换损失函数之 SIoU EIoU WIoU _ Focal_*IoU CIoU DIoU ShapeI
    YOLO目标检测创新改进与实战案例专栏专栏目录:YOLO有效改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLO基础解析+创新改进+实战案例GIoU文章链接论文地址:论文地址代码地址:代码地址基本原理广义Io......
  • [GHCTF 2024 新生赛]理想国 flask session伪造
    忙着毕业论文几天没做题了。进入页面发现几个api接口,注册登录搜索登出4个。利用postman访问注册接口注册。可以看到返回了token,利用token访问login。尝试search页面传入file参数试试能不能目录穿越。得到secret-key,这里有个非预期解,访问/proc/1/environ直接得到flag。......
  • 一文搞懂DevOps、DataOps、MLOps、AIOps:所有“Ops”的比较
    引言近年来,“Ops”一词在IT运维领域的使用迅速增加。IT运维正在向自动化过程转变,以改善客户交付。传统的应用程序开发采用DevOps实施持续集成(CI)和持续部署(CD)。但对于数据密集型的机器学习和人工智能(AI)应用,精确的交付和部署过程可能并不适用。本文将定义不同的“Ops”并解释......
  • list 列表(属于集合collection中的一种)
    list类型,有序可变list内的数据可以混合,string+int等 取出集合内元素:list=["hello",11,33,"world"](index索引从0开始)0123单个取出:(变量接收)=list[0]批量取出:(变量接收)=list[0:2](此处范围包左不包右,去除的元素索引为0和1) 内置函数:(变......
  • 新品发布 | 飞凌嵌入式RK3576核心板,为AIoT应用赋能
    为了充分满足AIoT市场对高性能、高算力和低功耗主控日益增长的需求,飞凌嵌入式全新推出基于RockchipRK3576处理器开发设计的FET3576-C核心板!集成4个ARMCortex-A72和4个ARMCortex-A53高性能核,内置6TOPS超强算力NPU,为您的AI应用赋能。核心板采用板对板连接方式,可插拔式设计便......
  • C++中的priority_queue和deque以及适配器
    C++中的priority_queue和deque一丶priority_queue1.1priority_queue的介绍1.2priority_queue的使用1.3priority_queue的模拟实现二丶deque2.1deque的简单介绍2.2deque的缺陷2.3为什么要选择deque作为stack和queue的迭代器三丶容器适配器3.1什么是适配器3.2S......