17. IO复用之epoll触发模式

epoll的两种触发方式 阅读详情

epoll有两种触发模式 : 水平触发和边沿触发. 默认为水平触发模式.


水平触发

什么叫做水平触发呢? IO大都有缓冲区, 当缓冲区里面只要有数据时就会触发水平模式,直到将缓冲的数据读写结束才不会触发水平模式.

举个栗子 : 当我们现在的读缓冲区有1024字节的数据而我们每次都只能读一个字节, 那么一次读操作后缓冲区还有1023字节, 此时又继续触发水平模式继续读, 直到1024字节读完才不会触发水平模式.

因为默认是水平默认, 所以我们现在做的实验并容易引起大家的感觉. 实验代码只将服务端的buf[1024]改为了buf[2] ,完整代码epoll_default.c

客户端发送一串字符后也收到了完整的字符串. 运行结果 :

在这里插入图片描述

边沿触发

什么叫边沿触发呢? IO大都有缓冲区, 当缓冲区发生变化才会触发边沿模式.

举个栗子 : 我们每次都只能读一个字节. 当现在的读缓冲区增加到了1024字节的数据, 缓冲区有改变了那么触发边沿模式读一个字节, 操作后缓冲区还有1023字节. 但是现在缓冲区没有变化了, 所以不再触发边沿模式, 剩下的1023字节只有留在缓冲区中.

通过设置event事件为EPOLLET才开启边沿触发.

只将服务端的buf[1024]改为了buf[2]并设置了EPOLLET.


完整代码 epoll_ET.c.

void doService(int servicefd)
{
    char buf[2];	// 设置为2

    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 | EPOLLET;	// 设置为边沿触发
		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);
	    }
	}
    }
}

运行结果 :

在这里插入图片描述

可以看出发送了1234567890但是一次客户端只会发送两个字节过来. 再看当客户端没有接收到所有的字符后关闭服务端也会被意外的关闭, 因为客户端发送了RET段. 当然这只是代码的问题, 大家可以自行修改.

在这里插入图片描述


注意

现在没有证实过边沿触发和水平触发哪一个更好, 一般我们都采用默认的水平触发就足够了.


总结

理解什么是水平触发, 什么是边沿触发.

  • 水平触发
  • 边沿触发
深入解析Linux IO多路复用:从select到epoll的高并发网络编程实践 IO多路复用是操作系统提供的一种高效I/O事件通知机制,其核心原理在于允许单个进程或线程同时监视多个文件描述符(如网络套接字)的状态变化。通过将文件描述符集合的管理委托给内核,并在事件就绪时接收通知,该技术能够将传统阻塞I/O模型中的“一对一”服务模式转变为“一对多”的监控模式,从而在资源利用率和并发处理能力上实现质的飞跃。其技术价值在于,它能够以极少的系统线程支撑海量的并发连接,显著降低上下文切换和内存开销,成为构建高性能、可扩展网络服务的基石。这一技术广泛应用于Web服务器、即时通讯、游戏服务器、金融交 阅读详情

相关推荐

【RK3588 Linux 5.x 内核编程】-内核IO复用与epoll

在前面的文章中,详细介绍了如何在内核驱动程序中实现poll、select和用户空间应用程序使用poll、select。本文将详细介绍如何在内核驱动中实现epoll和用户程序如何使用epoll。

视觉与物联智能 827

强制触发EPOLLIN、 EPOLLOUT事件

调用epoll_ctl(epoll_fd, EPOLL_CTL_MOD, sockfd, &event)重新设置一下event,其中要包含EPOLLIN/EPOLLOUT,这样就会立即触发一次相应事件。

tianwange的博客 450

Aras Innovator生命周期图实战:从配置到权限管理的全流程解析

本文详细解析了Aras Innovator生命周期图的全流程配置与权限管理,从基础概念到实战应用,涵盖状态设置、路径配置、权限控制等核心功能。通过实际案例和代码示例,帮助用户掌握如何高效管理数据生命周期,提升业务流程的规范性和效率。

ee345的博客 167

epoll的两种触发模式

linux异步IO浅析  http://hi.baidu.com/_kouu/blog/item/e225f67b337841f42f73b341.html  epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在采用这两种模式时要注意的是,如果采用ET模式,那么仅当状态发生变化时才会通知,而采用LT模式类似于原来的select/

hjxhjh的专栏 2万+

告别虚拟机!用ZYNQ7000和PYNQ 2.6.0打造一个能实时识别人脸的“智能摄像头”

本文详细介绍了如何利用Xilinx ZYNQ7000开发板和PYNQ 2.6.0框架构建实时人脸识别系统。通过硬件加速和嵌入式开发技术,该系统实现了低延迟、低功耗的独立运行能力,适用于边缘计算和物联网应用。文章包含从环境搭建到核心功能实现的完整指南,并提供了性能优化和问题排查的实用技巧。

weixin_42543046的博客 390

数模【Mathematica(安装、入门方法、基本计算、基本图形、创建互动模型、利用数据、幻灯片演示、完整实例)】

Mathematica(安装and激活、入门方法、基本计算、基本图形、创建互动模型、利用数据、幻灯片演示、完整实例) Mathematica_11.3.0 安装教程 Mathematica11.3 激活 P1 笔记本 P2 入门方法 P3 基本计算 P4 基本图形 P5 创建互动模型 P6 利用数据 P7 演示 P8 完整实例

upward 12万+

后台面试经典问题-Epoll的两种触发方式

水平触发LT和边缘触发ET   其中LT就是与select和poll类似,当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据一次性全部读写完(如读写缓冲区太小),那么下次调用 epoll_wait()时,它还会通知你在上次没读写完的文件描述符上继续读写   ET: 当被监控的文件描述符上有可读写事件发生时,epoll_wait()会...

hahachenchen789的博客 3307

VIO实战前传:手把手教你解读Kalibr双目IMU标定报告与参数应用

本文详细解析Kalibr双目IMU联合标定报告的核心参数与应用方法,涵盖重投影误差分析、IMU误差指标解读、关键变换矩阵原理及VINS-Fusion实战配置。通过手把手教学帮助开发者准确理解标定结果,解决VIO算法落地中的参数配置难题,提升视觉惯性里程计的系统稳定性与精度。

weixin_42699679的博客 331

IO复用:epoll

时间复杂度优秀select/poll:每次调用都需要把整个关注的文件描述符集合(fd set)从用户态拷贝到内核态,并且内核需要线性扫描整个集合来找出哪些 fd 就绪,时间复杂度是 O(n)。epoll:只需要在初次注册兴趣事件时(epoll_ctl)拷贝一次,之后每次 epoll_wait 调用时,内核直接返回已经就绪的事件列表,时间复杂度接近 O(1)(实际上是 O(就绪事件数量)),不需要再扫描全部 fd。文件描述符数量限制极高。

2301_81350012的博客 726

指纹浏览器指纹工厂(下):基于真实设备数据特征的马尔可夫链生成与校验

本文揭示了静态指纹生成算法在高级风控时序追踪下的致命缺陷,指出违背设备演进马尔可夫性质(如无状态跳跃、因果断裂)是导致指纹存活率骤降的核心原因。通过分析风控系统的时序状态机与多维特征验证机制,提出基于隐马尔可夫模型(HMM)的动态指纹架构:以真实设备的状态转移链为蓝本,构建异步演进的“数字基因熔炉”,通过非均匀时间步长、突发事件响应及微观因果绑定,模拟软硬件独立更新的物理法则。最终实现指纹在时间维度与微观特征上的自洽,规避风控的时序陷阱。

数据知道的博客 415

逻辑回归:利用Python实现二分类算法

通过使用Python编写的代码,我们可以训练逻辑回归模型并进行预测。接下来,我们将实现逻辑回归算法的训练函数。训练函数将接受训练数据集X和对应的标签y,以及学习率alpha和迭代次数num_iterations。训练完成后,我们可以使用训练得到的参数theta来进行预测。在这个例子中,我们有一个包含4个样本的训练数据集X,每个样本有两个特征。在这个例子中,如果预测概率大于等于0.5,则预测为类别1,否则预测为类别0。现在,我们可以使用训练函数来训练模型。根据给定的样本x_new,预测函数将返回相应的类别。

XlltEditor的博客 326

深入理解异步IO的底层逻辑——IO多路复用(select、poll、epoll)

文章目录前言1、理解文件描述符1.1 基本概念1.2 打开一个文件1.3 对文件描述符进行读写1.4 通过管道打开文件描述符1.5 常见的文件描述符0、1、21.6 进程打开文件描述符的个数1.7 文件描述符底层原理本节小结2、 IO多路复用原理2.1 IO触发用户空间与内核空间之间的切换2.1 IO模型的介绍 前言   在前面两篇文章《gevent与协程》和《asyncio与协程》,讨论了有关协...

pysense的博客 5171

20-IO多路复用 epoll

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

夏夜晚风_的博客 1474

ESP32-S3模组上跑通esp32-camera(32)

ESP32-S3模组上跑通esp32-camera(32)

phmatthaus的专栏 770

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

[linux]IO多路复用机制:select、poll、epoll

​ 首先我要向大家输出一个IO的概念:IO在我看来就是 等 + 拷贝(简化IO模型),等就是等待系统资源(设备。数据等)就绪(比如等待文件描述符就绪,等待数据就绪),拷贝就是拷贝数据资源(比如将你写的把内容将它从写缓冲区拷贝到读缓冲区,让用户可以正常读取)。如果想要IO速度快,减少等待时间是提高IO性能的关键。等待时间通常包括等待硬件资源(如磁盘、网络)就绪的时间以及等待操作系统调度的时间。在IO密集型应用中,多个IO操作可能同时进行。减少每个操作的等待时间可以显著提高整体吞吐量,因为更多的操作可以在相同的

2202_75305885的博客 1316

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IO多路复用之epoll

#include  int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);  epoll事件注册函数, 第一个参数epfd: 是函数返回值, 第二个参数op: 表示动作,用三个宏来表示:即 ①,EPOLL_CTL_ADD;注册新的事件到epfd中 ②,EPOLL_CTL_MOD;修改已经注册的fd的监

luyee2010的专栏 1941

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

多路复用I/O-epoll

在网络中实现IO多路复用的技术,最常用的就是(select, poll,epoll)三种模型,但是select 受限于底层的实现,随着管理fd数量的增多,造成轮询效率下降。进而出现了epoll模型,epoll 模型底层实现是采用红黑树,不会受限于检测句柄的数量。略。

技术鱼的博客 1401

IO多路复用学习(3) epoll

本篇介绍epoll的相关机制和用法。epoll API有三个:epoll_create,epoll_wait,epoll_ctl。三个API共同使用才能完成epoll IO多路复用的功能,这里是与select和poll不一样的地方。

mobai7的博客 254

IO复用(Reactor模式和Preactor模式)——用epoll来提高服务器并发能力

文章来源:http://www.cnblogs.com/binchen-china/p/5487795.html 上篇线程/进程并发服务器中提到,提高服务器性能在IO层需要关注两个地方,一个是文件描述符处理,一个是线程调度。 IO复用是什么?IO即Input/Output,在网络编程中,文件描述符就是一种IO操作。 为什么要IO复用? 1.网络编程中非常多函数是阻塞的,如c

$firecat利白的代码足迹$ 6520

Linux c编程之IO复用机制

在实际网络程序中,比如服务器程序,需要使用IO复用机制来处理多个客户端的连接和数据收发。Linux系统下常用的IO复用机制有三种:select、poll、epoll。poll是Linux中的字符设备驱动中的一个函数。Linux 2.5.44版本后,poll被epoll取代。select用于监视文件描述符的变化情况。

szkbsgy的专栏 1037

TCP/IP网络编程第12章IO复用select(偷偷加了些17章epoll的用法的内容)

IO复用的具体理解:感觉有点像剪枝,就是提高了利用率。 可以认为select函数是IO复用的全部内容。 先理解理解fd_set数组变量,该数组是存有0和1的位数组。 既然是位数组,那要对fd_set变量进行操作的话是以位为单位的,这样也就意味着直接操作会比较麻烦,因此我们都通过下面这些宏来对fd_set变量进行操作。 FD_ZERO(fd_set *fdset); 将fd_set变量的所有位...

博客周 289

Linux下基于C++11的socket网络编程(Epoll)个人总结版

写完了发现好像没什么用,看看八股其实就够了,我真乐了。但是也都写了写完吧在select中我们提到select结束后,我传入的内容会变成一个类似(001110010101的数)是没有办法直接知道哪个位置是1的,只能一个一个的遍历。这样很麻烦,但由于select用的是位掩码,所以只能这样一个个遍历。那优化的想法就来了:我只把就绪的传给应用程序行不行?没就绪的我也不传0了,我直接不传了。于是epoll出现了。

qq_40878302的博客 993

linux内核监听多个事件,Linux IO多路复用 epoll 心得

一、epoll简介epoll是Linux内核为处理大批量文件描述符而作了改进的poll, 是Linux下多路复用IO接口select/poll的增强版本, 它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候, 它无须遍历整个被侦听的描述符集, 只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。相关文件到Linux公社资源站下...

weixin_33277243的博客 752

IO多路复用

1、什么是IO多路复用? IO多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;没有文件句柄就绪时会阻塞应用程序,交出cpu。多路是指网络连接,复用指的是同一个线程 2、为什么出现IO多路复用机制? 没有IO多路复用机制时,有BIO、NIO两种实现方式,但有一些问题 同步阻塞(BIO) 服务端采用单线程,当accept一个请求后,在recv或send调用阻塞时,将无法accept其他请求(必须等上一个请求处recv或send完),无法

ZCC的专栏 1459
上一篇: 16.IO复用之epoll函数
下一篇: ranger命令
Function_18
博客等级 码龄10年 193粉丝 239原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值