16.IO复用之epoll函数

C++ IO多路复用 epoll模型 more。 阅读详情

前面介绍了select函数和poll函数, select我们知道能够支持的套接字个数太少了, 但是poll函数已经很好了也没有什么缺点啊为啥还要介绍epoll呢? 接下来我们就来谈谈poll和select函数的其他问题.


poll和select的问题

  1. poll函数一般使用都是将它设置为轮询的方式, 这样是很占用CPU的; 当然可以将其设置为阻塞也就能避免这个问题.

  2. select能够监听的描述符太少.

  3. poll和select的底层实现. poll函数其实和select底层实现类似.

    当有监听的事件到来时, select会将该事件的描述符和事件的状态从内核复制到用户空间中. poll会将到来事件的描述符状态复制到用户空间.

    最后用户都要重新遍历所有的描述符判断是哪一个描述符状态改变.


epoll的优点

poll和select最大的问题都是实现上需要占用CPU大量的时间, 那么epoll又是怎样避免这样的问题呢.

  1. epoll函数也要设置监听描述符并将其复制到内核中为每一个监听描述符注册一个回调函数.
  2. 当监听描述符的时候到来时直接返回该描述符的回调函数不需要在进行复制.

可以看出来epoll只有在设置监听时才复制一次描述符, 事件到来时不需要复制并且也不需要遍历判断. 大大的减少了占用CPU的时间.

如果对于底层实现感兴趣可以看一下以前总结的epoll源码分析和select源码分析.


函数原型

epoll可是有三个函数哦. 我们一个个来介绍并探讨他们的底层实现的功能.

1. epoll_create
#include <sys/epoll.h>

int epoll_create(int size);

成功 : 返回一个文件描述符.

失败 : 返回-1.

功能 : 在cache中申请创建的红黑树大小.

参数

  • size : 该参数 原本是指定在cache中分配的内存大小, 在linux2.6以上已经没有用了.

2. epoll_ctl
int epoll_ctl(int epfd, int opt, int fd, struct epoll_event *event);

成功 : 返回0

失败 : 返回-1

功能 : 注册要监听的事件类型.

参数 :

  • epfd : epoll_create函数返回的文件描述符.

  • opt : 功能选项, 用三个宏定义表示不同的功能

    opt值描述
    EPOLL_CTL_ADD注册fd的回调函数到epfd中
    EPOLL_CTL_DEL删除fd注册的回调函数
    EPOLL_CTL_MOD修改已注册的fd的监听事件
  • fd : 需要监听的文件描述符

  • event : 内核需要监听的事件, 与poll的事件类似.

    event值描述
    EPOLLIN监听是描述符是否可读
    EPOLLOUT监听是描述符是否可写
    EPOLLERR发生错误, 对端异常断开
    EPOLLRDHUP对端挂断, 或其中一端关闭了
    EPOLLET [1]设置为边沿触发模式
    EPOLLONESHOT [2]设置关联文件描述符的一次性行为

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

成功 : 返回0

失败 : 返回-1

功能 : 从就绪事件的链表中返回监听的回调函数.

参数

  • epfd : epoll_create函数返回的文件描述符.
  • events : 内核返回的监听事件
  • maxevents : events数组的大小
  • timeout : 超时时间
    1. timeout == INFTIM(负数) : select函数永远阻塞等待监视文件描述符集合中某个文件描述符发生变化为止.
    2. timeout == 0 : 函数为非阻塞函数, 不管有无等待的文件描述符发生变化都会返回
    3. timeout > 0 : 等待的超时时间, 即函数在timeout时间内阻塞, 超时时间之内有事件到来就返回了, 否则在超时后不管怎样一定返回.

函数调用

看了前面的三个函数估计第一次接触可能会产生抵触, 太麻烦了. 但是麻烦归麻烦, 好用高效率才是王道. 比如在百万连接时, epoll_wait都可以只需要常量时间就能精确返回触发事件的套接字.

说了那么多, 还是练习能最快掌握, 完整代码 epoll_service.c

void doService(int servicefd)
{
    int clientfd, epfd;
    char buf[1024];

  	// 设置监听套接字
    struct epoll_event event, evts[EPOLL_MAX];
    event.events = EPOLLIN;
    event.data.fd = servicefd;	// 这里需要设置监听的套接字
    epfd = epoll_create(1);
    epoll_ctl(epfd, EPOLL_CTL_ADD, servicefd, &event);	// 这里也需要设置监听的套接字

    int n, eventNum;
    while(1)
    {
        // 设置为永久阻塞
		eventNum = epoll_wait(epfd, evts, EPOLL_MAX, -1);
		if(eventNum == 0)
		    continue;
		else if(eventNum < 0)
		    EXIT("epoll_wait");
	        // 遍历状态改变的套接字
		for(int i = 0; i < eventNum; i++)
		{
		    if(evts[i].data.fd == servicefd && (evts[i].events &EPOLLIN))
		    {
				clientfd = Accept(servicefd, NULL, NULL);
				event.events = EPOLLIN;
				event.data.fd = clientfd;
				epoll_ctl(epfd, EPOLL_CTL_ADD, clientfd, &event);
		    }
		    else if(evts[i].events & EPOLLIN)
		    {
				n = recv(evts[i].data.fd, buf, sizeof(buf), 0);
				if(n <= 0)
				{
		            // 删除关闭的套接字
					    epoll_ctl(epfd, EPOLL_CTL_DEL, evts[i].data.fd, NULL);
				    close(evts[i].data.fd);
				    fprintf(stderr, "peer close\n");
				}
				send(evts[i].data.fd, buf, n, 0);
		    }
		}
    }
}

具体现象与select 是一样, 这里就不再验证了.

总结

本节介绍了epoll的三个函数, 希望能够掌握并且自己修改服务端的函数. 接下来我们还要继续介绍epoll的功能.

  • 掌握epoll
  • epoll 的优点
  • poll 和 select 的缺点
【Linux高级IO】Linux多路转接:深入探索poll与epoll的奥秘 在现代的Linux网络编程中,高效地管理多个并发连接是服务器性能优化的核心挑战之一。为了应对这一挑战,Linux操作系统提供了多种I/O多路复用技术,其中poll和epoll作为两种重要的机制,在提升系统资源利用率和处理效率方面发挥着关键作用。 阅读详情

相关推荐

IO多路转接 ——— select、poll、epoll

select是系统提供的一个多路转接接口。select函数的函数原型如下: 参数说明:参数timeout的取值:返回值说明:select调用失败时,错误码可能被设置为:fd_set结构与sigset_t结构类似,fd_set本质也是一个位图,用位图中对应的位来表示要监视的文件描述符。 调用select函数之前就需要用fd_set结构定义出对应的文件描述符集,然后将需要监视的文件描述符添加到文件描述符集当中,这个添加的过程本质就是在进行位操作,但是这个位操作不需要用户自己进行,系统提供了一组专门的接口,用

2021dragon的博客 7973

poll函数详解

1 poll函数概述 select() 和 poll() 系统调用的本质一样,poll() 的机制与 select() 类似,与 select() 在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是 poll() 没有最大文件描述符数量的限制(但是数量过大后性能也是会下降)。poll() 和 select() 同样存在一个缺点就是,包含大量文件描述符的数组被整体...

skypeng57的专栏 4万+

非华为电脑也能用!华为电脑管家完美安装教程来了

GitHub 上有一个开源项目 ​****​,专门解决“非华为设备无法安装华为电脑管家”的问题。它通过智能模拟 + DLL 劫持技术,绕过官方对硬件型号的检测,让你在联想、戴尔、华硕甚至 DIY 主机上也能流畅使用华为电脑管家!⭐ 项目已获 ​700+ Stars​,社区活跃,持续更新,兼容性优秀!科技不该有围墙。如果你成功在非华为电脑上跑起了 PCManager,欢迎在评论区晒出你的设备型号 + 使用体验!也别忘了把这篇推文分享给同样“眼馋”华为生态的朋友 ~📱 ​关注我们。

程序员朱永胜 4902

epoll函数原理和使用介绍

在该博文中,我们已经了解了什么是 epoll 及其优点,那么实际应用应该如何编写代码呢?epoll 的编码离不开三个基本的函数:epoll_create,epoll_ctl,epoll_wait,下面将介绍epoll 这三个函数的使用。 有些 epoll 函数原理需要配合 epoll 函数的源码才能进行深入讲解,这里我们参考 Github 用户 wangboji...

椛茶的博客 8514

CANOe实战指南 - 从入门到精通的全流程解析

本文是CANOe实战指南,全面解析从入门到精通的全流程。内容涵盖CANOe软件的核心功能仿真、测试与分析,详细指导安装配置、工程创建、CAN信号收发、UDS诊断通信、CAPL自动化编程以及Panel面板设计。通过实战案例,帮助汽车电子工程师快速掌握这一行业标杆工具,构建自动化测试环境,提升开发与测试效率。

pear55的博客 573

双摄像头的实时视频拼接及目标跟踪(一)

本章主要讲图像拼接算法的研究 先膜拜一下知乎大佬全面的叙述:https://www.zhihu.com/question/34535199/answer/135169187 本文图像拼接是基于opencv的图像拼接,流程分为以下几步 ...

Y.W.jian的博客 3万+

Linux网络编程6——poll和epoll

select 出来的比较早,其缺点是监听散乱的文件描述符效率会低一点。所以使用 poll,但是 poll 效率没改进多少,所以又改进为 epoll。

HuanBianCheng27的博客 3235

信息流广告ROI线性预测看板&投放分析监控看板展示&数据处理入库全流程

此看板数据量太大,在tableau public部署运行速度极慢,因此用图片作展示 数据清洗

Larry_Westside的博客 2316

poll函数详解及原理

poll函数实现和select极为相似,但是它们的接口并不相同:int poll(struct pollfd fdarray[], nfds_t nfds, int timeout); int select(int maxfdp1, fd_set restrict readfds, fd_set *restrict expectfds, struct timeval restrict tvptr

fengasdfgh的博客 1万+

vmware虚拟机网络连接问题

主机:ubuntu14.04 Vitual Network Editor

入门虽易,精通不易,且学且珍惜! 1353

泛微OA表单开发实战:如何用JavaScript动态控制明细表的必填与可编辑属性

本文详细介绍了如何在泛微OA系统中使用JavaScript动态控制明细表字段的必填与可编辑属性。通过主表字段变更事件监听和明细表字段属性批量修改,实现智能化的表单交互,提升用户体验和系统灵活性。文章深入解析了关键API的使用方法,并提供了实战代码示例和最佳实践。

weixin_30955617的博客 545

【网络】高级IO——poll版本TCP服务器

由于select函数有下面几个特别明显的缺点,就推演出了改进版本——poll函数比如select监视的fd是有上限的,我的云服务器内核版本下最大上限是1024个fd,主要还是因为fd_set他是一个固定大小的位图结构,位图中的数组开辟之后不会在变化了,这是内核的数据结构,除非你修改内核参数,否则不会在变化了,所以一旦select监视的fd数量超过1024,则select会报错。

2301_80224556的博客 3215

OpenClaw Manager Pro - 可视化管理工具

OpenClaw Manager Pro 是一个现代化的 Web 管理界面,用于管理多个 OpenClaw Gateway 实例。🎨美观的界面:深色主题,渐变设计,现代化 UI📡实时监控:WebSocket 实时推送状态和日志🔧完整管理:创建、编辑、删除、启动、停止 Gateway📊多渠道支持:飞书、Telegram、Discord、Slack、微信、钉钉🧩技能管理:可视化配置 61+ 个技能🌍跨平台:支持 macOS、Linux、Windows使用自定义模型系统会自动在中创建},

Maynor的博客 3085

理解IO复用的三种模式——select、poll、epoll

IO复用是指通过select、poll、epoll等系统调用来监听多个文件描述符的IO事件。当某个文件描述符就绪时,内核会通知用户进程进行IO操作。相比于阻塞IO和非阻塞IO,IO复用可以同时监听多个文件描述符,提高了IO效率。

追求幸福,探索未知的博客 4144

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【面试】彻底理解 IO多路复用

阅读本文大概需要 5 分钟。看完下面这些,高频面试题你都会答了吧目录1、什么是IO多路复用?2、为什么出现IO多路复用机制?3、IO多路复用的三种实现方式4、select函数接口5、se...

木川的技术之路 8257

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

基于epoll的io复用管理,一种文件监听方案 2

剩下的epoll成员,无论是data.ptr还是data.fd都属于内容,epoll机制不关心内容是什么,因此无论epoll_.data存什么都不会干扰到它的唤醒机制,排序机制,这给了我们极大的操作空间,我们可以在epoll_event.data.ptr中存储任意我们希望存储的信息。在注册步骤中,data.ptr->fd存储了我们的文件句柄,将events[i].data.ptr转一下数据类型,判断fd是否是套接字文件,如果是则说明有新的客户端连接,否则说明是已经注册的客户端发来了数据等待处理,看下一步。

weixin_71306050的博客 2345

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

io多路复用中的epoll函数详解

epoll介绍 epoll提供了三个函数,epoll_create、epoll_ctl和epoll_wait。 1 首先创建一个epoll对象, 2 然后使用epoll_ctl对这个对象进行操作(添加、删除、修改),把需要监控的描述符加进去,这些描述符将会以epoll_event结构体的形式组成一颗红黑树 3 接着阻塞在epoll_wait,进入大循环,当某个fd上有事件发生时,内核将会把其对应的结构体放入一个链表中,返回有事件发生的链表。 epoll的三个函数介绍 int epoll_create

Science_Tec的博客 1793

20-IO多路复用 epoll

文章目录1. epoll简介2. epoll接口函数2.1 应用层接口函数2.2 驱动中接口函数 1. epoll简介  阻塞型IO相对于非阻塞型IO来说,最大的优点是资源不可用是进程主动放弃CPU让其他的进程运行,而不用不停的轮询,提高系统的效率,但是缺点也是比较明显的就是进程阻塞之后不能做其他的事情,这在一个进程要同时对多个设备进行操作时非常不便。解决这个问题的方法有很多,比如多进程、多线程和...

夏夜晚风_的博客 1474

Linux IO多路复用:select poll epoll

Linux IO多路复用:select poll epoll

xiao_xiao21的博客 979

Linux 网络 IO 多路复用:select、poll、epoll 详解

多路转接方法是一种高效的网络通信手段,它通过允许单个进程或线程同时监听多个IO事件,实现了在单线程/进程场景下的并发处理。在选择具体的实现方法时,需要根据应用场景和需求进行权衡和选择。

小羊的博客 1519

moduo之io复用

moduo的io复用提供了一个抽象类,提供添加,删除以及获取就绪事件接口。目前支持poll和和epoll。

多看多听多总结 762

【Linux】【网络】IO多路复用 select、poll、epoll

进程或线程,查看描述符上是否有事件发生,从而提高资源利用率和系统吞吐量。

m0_64014551的博客 1031

select、poll、epoll实现多路复用IO并对比差异

详解select、poll、epoll实现的多路复用

2301_76197086的博客 1148

一文说透IO多路复用select poll epoll_io多路复用 poll epoll 简单易懂

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新如果你需要这些资料,可以戳这里获取其代码 实现如下所示: 缺点 作为多路复用的初始版本,只能说是能用而已,性能并不能高到哪儿去,使用的局限性也比较大。主要体现在以下几个方面:但也并不是一无是处,我个人是十分喜欢这个函数的,主要得益于以下几个方面: 参

2401_84975421的博客 674

聊一聊 .NET在Linux下的IO多路复用select和epoll

说了这么多,文尾总结下目前主流的 epoll 和 iocp 各自的特点。特性模型事件驱动 (Reactor)完成端口 (Proactor)核心思想通知可读写事件通知I/O操作完成适用场景高并发网络编程高并发I/O操作编程复杂度较低较高网络I/O性能极佳(百万级连接)优秀磁盘I/O支持有限完善CPU利用率高中内存开销低中。

qq_35485206的博客 936
上一篇: 15. IO复用之poll函数
下一篇: 17. IO复用之epoll触发模式
Function_18
博客等级 码龄10年 193粉丝 239原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值