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

一、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()
{// 创建epollepoll_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_arrayif (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.mzph.cn/web/79328.shtml

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

相关文章

spring中的@Qualifier注解详解

1. 核心作用 Qualifier是Spring框架中用于解决依赖注入歧义性的关键注解。当容器中存在多个相同类型的Bean时&#xff0c;Autowired默认按类型自动装配会抛出NoUniqueBeanDefinitionException异常&#xff0c;此时通过Qualifier指定Bean的唯一标识符&#xff08;名称或自定义限…

Python爬虫实战:获取文学网站四大名著并保存到本地

一、引言 1.1 研究背景 中国古典四大名著承载着深厚的文化底蕴,是中华民族的宝贵精神财富。在互联网时代,网络文学资源虽丰富多样,但存在分散、质量参差不齐等问题 。部分文学网站存在访问限制、资源缺失等情况,用户难以便捷获取完整、高质量的经典著作内容。开发专业的爬…

【一】浏览器的copy as fetch和copy as bash的区别

浏览器的copy as fetch和copy as bash的区别 位置&#xff1a;devTools->network->请求列表右键 copy as fetch fetch("https://www.kuaishou.com/graphql", {"headers": {"accept": "*/*","accept-language": &qu…

渠道销售简历模板范文

模板信息 简历范文名称&#xff1a;渠道销售简历模板范文&#xff0c;所属行业&#xff1a;其他 | 职位&#xff0c;模板编号&#xff1a;KRZ3J3 专业的个人简历模板&#xff0c;逻辑清晰&#xff0c;排版简洁美观&#xff0c;让你的个人简历显得更专业&#xff0c;找到好工作…

Java大数据可视化在城市空气质量监测与污染溯源中的应用:GIS与实时数据流的技术融合

随着城市化进程加速&#xff0c;空气质量监测与污染溯源成为智慧城市建设的核心议题。传统监测手段受限于数据离散性、分析滞后性及可视化能力不足&#xff0c;难以支撑实时决策。2025年4月27日发布的《Java大数据可视化在城市空气质量监测与污染溯源中的应用》一文&#xff0c…

《面向对象程序设计-C++》实验五 虚函数的使用及抽象类

程序片段编程题 1.【问题描述】 基类shape类是一个表示形状的抽象类&#xff0c;area( )为求图形面积的函数。请从shape类派生三角形类(triangle)、圆类&#xff08;circles&#xff09;、并给出具体的求面积函数。注&#xff1a;圆周率取3.14 #include<iostream> #in…

用c语言实现——一个交互式的中序线索二叉树系统,支持用户动态构建、线索化、遍历和查询功能

知识补充&#xff1a;什么是中序线索化 中序遍历是什么 一、代码解释 1.结构体定义 Node 结构体&#xff1a; 成员说明&#xff1a; int data&#xff1a;存储节点的数据值。 struct Node* lchild&#xff1a;该节点的左孩子 struct Node* rchild&#xff1a;该节点的右孩子…

高拟人化客服机器人显著提升用户接受度

高拟人化客服机器人显著提升用户接受度 目录 高拟人化客服机器人显著提升用户接受度思维导图详细总结一、研究背景与目的二、理论基础与变量设计三、研究方法与实验设计四、核心结论与策略建议五、研究局限与未来方向关键问题与答案高拟人化客服机器人显著提升用户接受度,且与…

202534 | KafKa简介+应用场景+集群搭建+快速入门

Apache Kafka 简介 一、什么是 Kafka&#xff1f; Apache Kafka 是一个高吞吐量、分布式、可扩展的流处理平台&#xff0c;用于构建实时数据管道和流应用程序。它最初由 LinkedIn 开发&#xff0c;并于 2011 年开源&#xff0c;目前由 Apache 软件基金会进行维护。 Kafka 具备…

Blender 初学者指南 以及模型格式怎么下载

glbxz.com glbxz.com 可以直接下载Blender格式模型 第 1 步&#xff1a;打开 这就是 blender 打开时的样子。 您面对的是左侧和右侧的工具栏&#xff0c;顶部是文件作&#xff0c;底部是时间轴&#xff0c;中间是 3D 视图。 Blender 的默认起始网格是一个立方体&#xff0c…

RV1126 ROS2环境交叉编译及部署(基于官方Docker)

RV1126 ROS2环境交叉编译及部署(基于官方Docker) 0 前言1 SDK源码更新1.1 启动Docker容器1.2 更新SDK源码1.3 SDK更新问题2 ROS2编译配置3 Buildroot rootfs编译ROS2的依赖包3.1 编译问题解决4 使用Docker交叉编译ROS24.1 准备Linux(Ubuntu) PC机的依赖环境4.1.1 Ubuntu PC机…

Go 面向对象,封装、继承、多态

Go 面向对象&#xff0c;封装、继承、多态 经典OO&#xff08;Object-oriented 面向对象&#xff09;的三大特性是封装、继承与多态&#xff0c;这里我们看看Go中是如何对应的。 1. 封装 封装就是把数据以及操作数据的方法“打包”到一个抽象数据类型中&#xff0c;这个类型…

无线网络设备中AP和AC是什么?有什么区别?

无线网络设备中AP和AC是什么&#xff1f;有什么区别&#xff1f; 一. 什么是AP&#xff1f;二. 什么是AC&#xff1f;三. AP与AC的关系 前言 肝文不易&#xff0c;点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都…

Android SDK

Windows纯净卸载Android SDK 1.关闭所有安卓相关的程序 Android StudioEmulators 如模拟器Command prompts using SDK 如appium服务 2.移除SDK相关目录 # Delete your SDK directory F:\android_sdk\android-sdk-windows# Also check and remove if present: $env:LOCALAPP…

Android耗电优化全解析:从原理到实践的深度治理指南

引言 在移动应用性能优化体系中&#xff0c;耗电优化是用户体验的核心指标之一。据Google官方统计&#xff0c;超过60%的用户会因为应用耗电过快而选择卸载应用。本文将从耗电统计原理、监控手段、治理策略三个维度展开&#xff0c;结合Android系统源码与实际代码示例&#xf…

QMK自定义4*4键盘固件创建教程:最新架构详解

QMK自定义4*4键盘固件创建教程&#xff1a;最新架构详解 前言 通过本教程&#xff0c;你将学习如何在QMK框架下创建自己的键盘固件。QMK是一个强大的开源键盘固件框架&#xff0c;广泛用于DIY机械键盘的制作。本文将详细介绍最新架构下所需创建的文件及其功能。 准备工作 在…

DAMA第10章深度解析:参考数据与主数据管理的核心要义与实践指南

引言 在数字化转型的浪潮中&#xff0c;数据已成为企业的核心资产。然而&#xff0c;数据孤岛、冗余和不一致问题严重制约了数据价值的释放。DAMA&#xff08;数据管理协会&#xff09;提出的参考数据&#xff08;Reference Data&#xff09;与主数据&#xff08;Master Data&…

力扣题解:2、两数相加

个人认为&#xff0c;该题目可以看作合并两个链表的变种题&#xff0c;本题与21题不同的是&#xff0c;再处理两个结点时&#xff0c;对比的不是两者的大小&#xff0c;而是两者和是否大于10&#xff0c;加法计算中大于10要进位&#xff0c;所以我们需要声明一个用来标记是否进…

深度学习部署包含哪些步骤?

深度学习部署包含哪些步骤&#xff1f; 阶段说明示例工具模型导出把 .pt、.h5 等格式模型导出为通用格式&#xff08;如ONNX&#xff09;PyTorch, TensorFlow, ONNX推理优化减小模型体积、加速推理&#xff08;量化、剪枝&#xff09;TensorRT, ONNX Runtime系统集成将模型嵌入…

路由策略和策略路由的区别以及配置案例

区别 路由策略&#xff1a;路由策略是通过ACL等方式控制路由发布&#xff0c;让对方学到适当路由条目&#xff0c;比如有20条路由&#xff0c;只想让某个路由器学到10条&#xff0c;可以通过路由策略进行过滤。 策略路由&#xff1a;策略路由是通过定义策略和应用&#xff0c…