【无标题】I/O复用(epoll)三者区别▲

news2025/5/11 9:25:27

一、SOCKET-IO复用技术

定义:SOCKET - IO复用技术是一种高效处理多个套接字(socket)的手段,能让单个线程同时监听多个文件描述符(如套接字)上的I/O事件(像可读、可写、异常),进而提高程序的并发处理能力,避免为每个套接字创建一个线程或进程带来的资源开销(像一个管家)

是由函数select、poll和 Epoll 支持的

1.select、poll和 Epoll三者的区别:

select:轮回机制,存储容器数组,固定大小

poll:轮回机制,存储容器链表,动态扩展

epoll:事件驱动机制

2. 数据结构与扩展性

机制存储容器类型最大连接数限制动态扩展能力
select固定大小的位掩码数组通常为 1024(FD_SETSIZE)❌ 无法扩展
poll动态链表(struct pollfd)无硬性限制(取决于系统资源)✅ 动态添加
epoll内核红黑树 + 就绪链表无硬性限制(仅受内存约束)✅ 自动管理
  • select:使用固定大小的 fd_set(位掩码)存储文件描述符,需手动管理位操作,扩展性差。
  • poll:使用链表 struct pollfd 存储文件描述符,可动态添加,突破了 select 的限制。
  • epoll:使用内核红黑树高效管理所有待监控的文件描述符,自动扩容。

3. 工作机制

机制事件触发方式轮询方式性能特性
select水平触发(Level Triggered)遍历所有文件描述符O (n) 时间复杂度
poll水平触发遍历所有文件描述符O (n) 时间复杂度
epoll边缘触发(Edge Triggered)或水平触发仅遍历就绪链表O (1) 时间复杂度
  • 水平触发(LT):只要文件描述符就绪(如可读),就会持续通知。
  • 边缘触发(ET):仅在文件描述符状态变化(如从不可读到可读)时通知一次,需立即处理,否则数据可能丢失。

4. 性能对比

场景select/poll 表现epoll 表现
连接数少且活跃效率较高优势不明显
连接数多但不活跃性能急剧下降(轮询所有连接)性能稳定(仅处理就绪连接)
大量并发连接不适用(受 FD_SETSIZE 限制)非常高效

二、Epoll函数

基于以上三种方法对比,所以我们选用epoll进行使用较为合适

epoll两种模式的区别:

LT逻辑简单,但效率低,ET反之

核心数据结构是:1个红黑树和1个链表

1.创建

int epoll_create(int size);

参数size表明内核要监听的描述符数量。调用成功时返回一个epoll句柄描述符,失败时返回-1

2.注册要监听的事件类型

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

  • 参数:用于控制 epoll 实例对文件描述符的监听。
    • epfd是由epoll_create函数返回的 epoll 实例的文件描述符。
    • op参数指定操作类型,常见的值有EPOLL_CTL_ADD(将文件描述符fd添加到 epoll 实例的监听列表中)、EPOLL_CTL_MOD(修改文件描述符fd的监听事件)和EPOLL_CTL_DEL(从 epoll 实例的监听列表中删除文件描述符fd)。
    • fd是要进行操作的文件描述符。
    • event是一个指向struct epoll_event结构体的指针,用于指定要监听的事件类型以及关联的数据。
  • 返回值:成功时返回 0;失败时返回 -1,并设置errno以指示错误原因。

3.等待事件的就绪

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

  • 功能:等待 epoll 实例所监听的文件描述符上有事件发生。
    • epfd是 epoll 实例的文件描述符。
    • events是一个struct epoll_event类型的数组,用于存储发生事件的文件描述符及其相关事件信息。
    • maxevents指定了events数组的大小,即最多能返回的事件数量。
    • timeout指定等待的超时时间,以毫秒为单位。如果设置为 -1,则表示无限期等待,直到有事件发生;如果设置为 0,则表示立即返回,不进行等待。
  • 返回值:成功时返回发生事件的文件描述符数量;如果超时则返回 0;失败时返回 -1,并设置errno以指示错误原因。
#include "epollServer.h"

epollServer::epollServer(int port)
{
	this->server = new TCPServer(port);

	init_epoll();
}

void epollServer::init_epoll()
{
    // 创建epoll
    epoll_fd = epoll_create(10);
    if (epoll_fd < 0) {
        perror("epoll_create error");
        return;
    }

    // 添加epoll关注事件
    //struct epoll_event epoll_event;
    epoll_event.data.fd = this->server->getServerfd();
    epoll_event.events = EPOLLIN;
    epoll_ctl(epoll_fd, EPOLL_CTL_ADD, this->server->getServerfd(), &epoll_event);
    cout << "epoll初始化完成..." << endl;
}

void epollServer::start()
{
    struct epoll_event event_array[10] = { 0 };
    int event_num = 0;
    this->thread_pool = new ThreadPool2(5);
    // 主循环
    while (1) {
        cout << "epoll wait..." << endl;
        event_num = epoll_wait(epoll_fd, event_array, 10, -1);
       // cout<<event_array
        if (event_num < 0) {
            perror("epoll_wait error");
            continue;
        }

        for (int i = 0; i < event_num; i++) {
     
            if (event_array[i].data.fd == this->server->getServerfd()) {//处理连接请求
                cout << "有新客户端连接请求" << endl;
                int client_fd = accept(this->server->getServerfd(), NULL, NULL);
                if (client_fd < 0) {
                    continue;
                }
                // 将新的客户端连接添加到epoll关注列表
                epoll_event.data.fd = client_fd;
                epoll_event.events = EPOLLIN;
                epoll_ctl(epoll_fd, EPOLL_CTL_ADD, client_fd, &epoll_event);
            }
            else if (event_array[i].events & EPOLLIN) {//处理请求监听的事件
        
               
               
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ClassLoader类加载机制的核心引擎

ClassLoader类加载机制的核心引擎 文章目录 ClassLoader类加载机制的核心引擎1. ClassLoader基础1.1 什么是ClassLoader&#xff1f;1.2 ClassLoader的层次结构1.3 类加载的过程 2. 源码解析与工作原理2.1 ClassLoader的核心方法2.2 双亲委派模型的工作原理2.3 打破双亲委派模型…

tryhackme——Enumerating Active Directory

文章目录 一、凭据注入1.1 RUNAS1.2 SYSVOL1.3 IP和主机名 二、通过Microsoft Management Console枚举AD三、通过命令行net命令枚举四、通过powershell枚举 一、凭据注入 1.1 RUNAS 当获得AD凭证<用户名>:<密码>但无法登录域内机器时&#xff0c;runas.exe可帮助…

【Linux学习笔记】系统文件IO之重定向原理分析

【Linux学习笔记】系统文件IO之重定向原理分析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】系统文件IO之重定向原理分析前言一. 系统文件I/01.1 一种传递标志位的方法1.2 hello.c写文件:1.3 he…

SpringBoot中使用MCP和通义千问来处理和分析数据-连接本地数据库并生成实体类

文章目录 前言一、正文1.1 项目结构1.2 项目环境1.3 完整代码1.3.1 spring-mcp-demo的pom文件1.3.2 generate-code-server的pom文件1.3.3 ChatClientConfig1.3.4 FileTemplateConfig1.3.5 ServiceProviderConfig1.3.6 GenerateCodeController1.3.7 Columns1.3.8 Tables1.3.9 Fi…

实现滑动选择器从离散型的数组中选择

1.使用原生的input 详细代码如下&#xff1a; <template><div class"slider-container"><!-- 滑动条 --><inputtype"range"v-model.number"sliderIndex":min"0":max"customValues.length - 1"step&qu…

基于Credit的流量控制

流量控制(Flow Control)&#xff0c;也叫流控&#xff0c;它是控制组件之间发送和接收信息的过程。在总线中&#xff0c;流控的基本单位称为flit。 在标准同步接口中(比如AXI协议接口)&#xff0c;握手信号如果直接采用寄存器打拍的方式容易导致信号在不同的方向上出现偏离。因…

【金仓数据库征文】金仓数据库KingbaseES: 技术优势与实践指南(包含安装)

目录 前言 引言 一 : 关于KingbaseES,他有那些优势呢? 核心特性 典型应用场景 政务信息化 金融核心系统&#xff1a; 能源通信行业&#xff1a; 企业级信息系统&#xff1a; 二: 下载安装KingbaseES 三:目录一览表: 四:常用SQL语句 创建表&#xff1a; 修改表结构…

金丝猴食品:智能中枢AI-COP构建全链路数智化运营体系

“金丝猴奶糖”&#xff0c;这个曾藏在无数人童年口袋里的甜蜜符号&#xff0c;如今正经历一场数智焕新。当传统糖果遇上数字浪潮&#xff0c;这家承载着几代人味蕾记忆的企业&#xff0c;选择以数智化协同运营平台为“新配方”&#xff0c;将童年味道酿成智慧管理的醇香——让…

java的输入输出模板(ACM模式)

文章目录 1、前置准备2、普通输入输出API①、输入API②、输出API 3、快速输入输出API①、BufferedReader②、BufferedWriter 案例题目描述代码 面试有时候要acm模式&#xff0c;刷惯leetcode可能会手生不会acm模式&#xff0c;该文直接通过几个题来熟悉java的输入输出模板&…

鸿蒙 所有API缩略图鉴

从HarmonyOS NEXT Developer Preview1&#xff08;API 11&#xff09;版本开始&#xff0c;HarmonyOS SDK以 Kit 维度提供丰富、完备的开放能力&#xff0c;涵盖应用框架、应用服务、系统、媒体、AI、图形在内的六大领域&#xff0c;共计30000个API

【Docker系列】使用格式化输出与排序技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基础语法(二)

Mysql基础语法&#xff08;二&#xff09; Mysql基础语法&#xff08;二&#xff09;主要介绍Mysql中稍微进阶一点的内容&#xff0c;会稍微有一些难度&#xff08;博主个人认为&#xff09;。学习完基础语法&#xff08;一&#xff09;和基础语法&#xff08;二&#xff09;之…

TOA的定位,建模与解算的步骤、公式推导

TOA(到达时间)定位的核心是通过测量信号从目标到多个基站的传播时间,将其转换为距离信息,并利用几何关系解算目标位置。本文给出具体的建模与解算步骤及公式推导 文章目录 通用模型建立非线性方程组构建线性化处理(最小二乘法)最大似然估计(ML)高斯-牛顿迭代法误差分析…

2025年PMP 学习七 -第5章 项目范围管理 (5.4,5.5,5.6 )

2025年PMP 学习七 -第5章 项目范围管理 5.4 创建 WBS 1.定义与作用 定义把项目可交付成果和项目工作分解成较小的&#xff0c;更易于管理的组件作用对所要交付的内容提供一个结构化的视图 2.输入&#xff0c;输出&#xff0c;工具与技术 3. 创建WBS的依据&#xff08;输入&…

CAD属性图框值与Excel联动(CAD块属性导出Excel、excel更新CAD块属性)——CAD c#二次开发

CAD插件实现块属性值与excel的互动&#xff0c;效果如下&#xff1a; 加载dll插件&#xff08;CAD 命令行输入netload &#xff0c;运行xx即可导出Excel&#xff0c;运行xx1即可根据excel更新dwg块属性值。&#xff09; 部分代码如下 // 4. 开启事务更新CAD数据using (Transact…

【HarmonyOS 5】鸿蒙中进度条的使用详解

【HarmonyOS 5】鸿蒙中进度条的使用详解 一、HarmonyOS中Progress进度条的类型 HarmonyOS的ArkUI框架为开发者提供了多种类型的进度条&#xff0c;每种类型都有其独特的样式&#xff0c;以满足不同的设计需求。以下是几种常见的进度条类型&#xff1a; 线性进度条&#xff08;…

Spring Cloud: Nacos

Nacos Nacos是阿里巴巴开源的一个服务发现&#xff0c;配置管理和服务管理平台。只要用于分布式系统中的微服务注册&#xff0c;发现和配置管理&#xff0c;nacos是一个注册中心的组件 官方仓库&#xff1a;https://nacos.io/ Nacos的下载 Releases alibaba/nacos 在官网中…

Win11安装APK方法详解

1、官方win11系统 预览版 开发版 正式版 都行 2、同时你还需要开启主板 BIOS 虚拟化选项&#xff08;具体名称不同主板略有不同&#xff09; 这一步自行百度 开始&#xff1a;先去确定有没有开启虚拟化 任务管理器检查—— 虚拟化是否已经开启&#xff0c;如果没有自己去BIO…

SSH终端登录与网络共享

SSH 是较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议 注意 SSH终端登录的前提是&#xff1a;电脑和板卡都能够通过网络相连接及通信 与连接互联网不一样&#xff0c;SSH可以不用互联网&#xff0c;只要电脑和板卡组成一个小型网络即可 网络方案 如果您…

Android 13 默认打开 使用屏幕键盘

原生设置里&#xff0c;系统-语言和输入法-实体键盘-使用屏幕键盘 选项&#xff0c; 关闭时&#xff0c;外接物理键盘&#xff0c;如USB键盘&#xff0c;输入时不会弹出软键盘。 打开时&#xff0c;外接物理键盘&#xff0c;如USB键盘&#xff0c;输入时会弹出软键盘。 这个选…