epoll小结

人脸关键点定义汇总 前几天看一份代码临时需要找49个人脸关键点位置定义的图片发现怎么百度都搜不到,最后幸好谷歌可以使用了就用谷歌搜到了。所以在这里汇总一下我所知道的人脸关键点的定义和相关的一点东西,以备不时之需。 68个关键点 最常用的工具是Dlib,网址:http://dlib.net/ dlib的68个特征点检测算法是ERT算法【1】 使用dlib检测68个特征点的python示例见:http://dlib.n... 阅读详情
1.select和poll模型为什么会慢。
    假如有100w用户和一个进程保持tcp连接,而每一个时刻只有几十个活跃的连接,也就是说,每一个时刻进程只需要处理这100w连接中的一小部分。那么如何高效的处理?进程是否在每次询问操作系统收集有事件发生的tcp连接时,把这100w个连接告诉操作系统,然后由操作系统来找出发生的连接?select和poll正是这么做的。
    这里有个明显的问题,就是在某一时候,进程收集有事件的连接时,其实这100w连接中的大部分都没有事件发生。因此每次收集事件时,都把这100w连接的套接字告诉操作系统,然后由操作系统内核寻找这些连接上是否发生事件,将会是巨大的浪费。

2.epoll对象和事件关系
    每个epoll对象对应一个eventpoll结构体。这个结构体中包含保存监听事件的红黑树字段和满足条件的双向链表字段。详见深入理解nginx的312页。

    所有添加到epoll中的事件都会与设备(网卡)驱动程序建立回调函数,也就是说,相应事件发生时会调用这里的回调函数。这个回调方法在内核中叫做ep_poll_callback,它会把就绪的事件放到上面的rdlist链表中。

    当调用epoll_wait检查是否有发生事件的连接时,只是检查eventpoll对象中的rdlist双向链表是否由epitem元素而已。如果rdlist链表不为空,则把这里的事件复制到用户态内存中,同时将事件数量返回給用户。因此epoll_wait效率相当的高。epoll_ctl向epoll对象中添加修改删除事件时,从rbr红黑树中查找事件也非常快,也就是说,epoll时非常高效的,他可以轻易的处理百万级别并发连接。


3.如何使用epoll
epoll使用下面三个系统调用为用户提供服务。
(1)epoll_create系统调用
epoll_create在c库的原型如下:
    int epoll_create(int size);
epoll_create返回一个句柄,之后epoll的使用都将依靠这个句柄来标示。参数size是告诉epoll所要处理的大致事件数目。不再使用epoll时,必须调用close关闭句柄。

(2)epoll_ctl系统调用
原型如下:
    int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event);
epoll_ctl向epoll对象中添加、修改、删除感兴趣的事件,返回0标示成功,否则返回-1,此时需要根据errno错误码判定错误类型。epoll_wait方法返回的事件必然是通过epoll_ctl添加到epoll中的。参数epfd是epoll_create返回的句柄。

    epfd:epoll_create返回值。
    fd:待检测的连接套接字。
    op:操作
    event:告诉epoll对什么样的事件感兴趣,它使用了epoll_event结构体,它使用了epoll_event结构体。
    struct epoll_event{
        uint32_t events;
        epoll_data_t data;
    };
    events:代表感兴趣事件的类型,如读、写等
    data成员是联合。
    typedef union epoll_data{
        void *ptr;
        int fd;
        uint32_t u32;
        uint64_t u64;
     }epoll_data_t;

(3)epoll_wait
 在c库原型如下:
    int epoll_wait(int epfd,struct epoll_event *events,int maxevents,int timeout);
    
    收集在epoll监控的事件已经发生的事件,如果epoll没有事件发生,则最多等待timeout毫秒返回。epoll_wait返回值表示当时发生的事件个数,如果返回0,则表示本次调用中没有事件发生,如果-1表示出现错误。

    epfd:epoll描述符
    events:则是分配好的epoll_event结构体数组,epoll将会把发生的事件复制到events数组中(events不可以是空,内核只负责把数据复制到这个events数组中,不会帮助我们在用户态中分配内存。内核这种做法效率很高)。
    maxevents:表示本次可以返回的最大事件数目,通常maxevents参数与分配的events数组大小相当。
    timeout:表示没有检测到事件发生时最多等待的时间。如果timeout=0,则表示epoll_wait在rdlist为空时,立刻返回,不需等待。


4.epoll俩种工作模式:LT/ET

    LT(level triggered)是epoll缺省工作方式,并且同时支持block和no-block socket。在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不做任何的操作,内核还是会继续通知你。
    ET(edge-triggered)是高速工作方式,只支持no-block socket,它的效率要比LT更高。ET和LT的却别在于,当一个新的事件到来时,ET模式下当然可以从epoll_wait调用中获取到这个事件,可是如果这次没有把这个事件对应的套接字缓冲区处理完,在这个套接字没有新的事件在此到来时,在ET模式下时无法再次从epoll_wait调用中获取这个事件的。而LT模式相反,只要一个事件对应的套接字缓冲区还有数据,就总能从epoll_wait中获取事件



epoll的优点:
1.支持一个进程打开大数目的socket描述符。
    select最不能忍受的一点是打开的FD数量是有限制的,由FD_SETSIZE设置,默认是2048.对于那些需要支持的上万连接数目的IM服务器来说显然太少。这时候你一定是选择修改这个宏然后重新编译内核,不过资料也同时指出这样会带来网络效率的下降。不过epoll没有这个限制,它所支持的FD上限是最大可以打开文件数目,这个数字一般远大于2048。举个例子,在1GB内存的机器上大约是10w,和内存大小相关。

2.IO效率不随FD数目增加线性下降。
    传统的select/poll另外致命的缺点是当拥有大集合的套接字,常常只有部分套接字是活跃的,但是select/poll每次会线性扫描全部集合,导致效率的线性下降。但是epoll不存这个问题,它只会对活跃的socket进行操作--这是因为内核实现中epoll是根据每个fd上的callback函数实现的。那么只有活跃的socket才会主动的去调用callback函数,因为空闲的套接字则不会。

3.使用mmap加速内核与用户空间的消息传递
    这点实际上涉及到epoll的具体实现。无论select/poll还是epoll都需要将内核把FD消息传递給用户空间,如何避免不必要的内存拷贝很重要,在这点上,epoll是通过内核与用户空间映射同一块内存实现的。
从NASA DataPort下载到PyTorch Dataset:手把手处理USGS光谱库的AVIRIS数据 本文详细介绍了如何从NASA DataPort下载USGS光谱库的AVIRIS高光谱数据,并将其转化为PyTorch Dataset对象。内容涵盖数据获取、预处理、辐射定标及高效数据加载技巧,特别针对AVIRIS数据的水吸收波段剔除和波段分组标准化进行了重点讲解,为环境监测、地质勘探等领域的研究者提供实用指南。 阅读详情

相关推荐

在Docker中集成GPU监控体系

先上效果图 等文档整理出来再更

tamako0v0的博客 2470

epoll学习:epoll_wait函数详解

epoll_wait:等待监听的所有fd相应事件的产生。

个人工作中学到的专业技术与职业发展知识笔记 2万+

地心地固坐标系与北天东坐标系的转换

经过这一步旋转,x3轴和y3轴就处在过O3点的经度线所在的平面了,而且z3轴指向了东。将图3的坐标系旋转成图2的样子。这里需要多次旋转,每次以某个轴为对称轴进行旋转,对应的坐标变换参考。的原点在地心,Z轴指向北极点,X轴指向本初子午线与赤道的交点,Y轴指向符合右手定则,如下图所示。下面实现地心地固坐标系到北天东坐标系的转换,问题描述为:设一点。以y1轴为对称轴,顺时针旋转90°,得到图4的样子。,X轴指向北,Y轴指向天,Z轴指向东,如下图所示。因此,北天东坐标下的坐标为。点在图3坐标系下的坐标。

csdnqixiaoxin的博客 3555

epoll的水平触发和边沿触发方式在应用中什么时候会返回可读或可写

水平触发: 当我们关注的事件为读事件时,只要缓存中有东西可读,那么就触发;当我们关注的事件为写事件时,只要缓存中有东西可写那么就触发。 边沿触发: 当我们关注的事件为读事件时:1.当由不可读变为可读时会触发(即BUFFE由空到非空)。2.当可读的内容变多时(即有新的数据到来)会触发。 当我们关注的事件为写事件时:1.由不可写变为可写时会触发(即BUFFE由满变为非满)。2.当buffer中...

xiaowenmu1的博客 723

LoRa正点原子模块组网步骤

按照我上一篇的博客和视频演示,相信大家一定都可实现了lora模块点对点的通信了。那我们来进行一个比较有高难度的设计吧! 使用多个loRa模块去完成一个组网设计: 在这之前一定要配置模块信息为定点传输 AT+TMODDE要等于1奥 第一步分析通讯协议: 点对点通讯是在透明传输的条件下,地址和信道都是一样的,直接发送接受数据。 组网呢我们利用是: 定向传输就是 A、B的地址、信道不同 假如A是要想B发送信息就用函数来下面: int b[5]...

weixin_43205178的博客 4082

ChatBI实战:如何用Vanna和WrenAI搭建企业级智能问数系统(附避坑指南)

本文详细介绍了如何利用Vanna和WrenAI搭建企业级智能问数系统(ChatBI),解决多源异构数据整合、语义理解准确率和系统性能安全等核心挑战。通过实战案例和优化策略,展示了这一组合方案在提升查询效率、实现业务自主分析和动态探索式分析方面的显著优势,特别适合企业级数据查询需求。

weixin_29047919的博客 398

epoll事件触发时机

LT mode EPOLLIN : 读缓冲区有数据,那么调用eoll_wait就会返回。 EPOLLOUT : EPOLLIN返回就会返回EPOLLOUT;或者写缓冲区可写。 ET mode EPOLLIN : 读缓冲区由无数据到数据,那么调用epoll_wait就会返回。 EPOLLOUT : EPOLLIN返回并且此时缓冲区可写就会返回EPOLLOUT;或者写缓冲区由不可...

消磨时间的博客 1769

R语言LASSO回归作图为什么X轴使用-log(λ)而不是log(λ),如何转化为log(λ)?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1015

epoll使用详解(精髓)

epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linu

ljx0305的专栏 28万+

提升YOLOv8性能:用Swin Transformer替换Backbone的详细实现与分析【YOLOv8】

YOLOv8作为目标检测领域的最新版本,在速度和精度之间取得了良好的平衡。然而,随着计算机视觉任务的复杂性不断增加,YOLOv8的标准主干网络(Backbone)在处理高分辨率图像或多尺度目标时,可能存在一定的局限性。为了进一步提升YOLOv8的性能,我们可以引入Swin Transformer替换其主干网络,以增强模型的全局感知能力和多尺度特征提取能力。本文将详细介绍如何在YOLOv8中用Swin Transformer替换原有的Backbone,提供代码示例,并深入探讨其中的原理和效果。

博客 1717

AUTOSAR CP R18-10 架构总览与导航

AUTOSAR CP R18-10 架构总览 本文档系统整理了AUTOSAR CP R18-10版本的199篇技术规范,涵盖7大架构层级: 应用层(15篇):包含车身舒适、底盘控制、HMI、安全系统、动力系统等AI应用 RTE(1篇):虚拟功能总线规范 服务层(159篇):细分为系统服务(OS/ECU管理/加密)、存储服务、通信服务(CAN/LIN/Ethernet) ECU抽象层(20篇):I/O与通信硬件抽象 MCAL(41篇):微控制器驱动层 复杂驱动(14篇):CDD设计与SPAL支撑 规范模板(2

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 717

epoll_wait() 函数

epoll_wait() 函数

fucheng的博客 2007

Node-RED教程(二):Node-RED的面板的操作

Node-RED系列(二):Node-RED的面板的操作 要使用Node-RED去搭建一个物联网平台,链接设备,设备通信,就必须要先熟悉Node-RED的这种面板,对于一个新的项目,在动手做之前一点想对这个的技术的文档有足够的了解做起来才能游刃有余。本期我给大家介绍一下Node-RED的各种面板,熟悉这些面板后,在后续的搭建Iot服务中,会举重若轻,同时该系列的文档,难度会逐步加深,知道了本章解释的名称后对后续文章的理解有很大帮助。 面板1:默认节点选项列表 安装Node-RED后默认的节点分为这5大类

知无涯 1万+

select、poll、epoll小结

select int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 1)用户通过三个参数传入感兴趣的读、写、异常事件,在select调用后,事件集合会被修改,所以每次调用select,都必须重置这三个集合 2)有最大连接上限,一般是默认1024...

浅陌风型 277

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

epoll 使用小结

了解一下 Epoll 是一种高效的管理socket的模型,相对于select和poll更加高效。 数据结构 sys/epoll.h typedef union epoll_data { void ptr; int fd; __uint32_t u32; __uint6...

weixin_34075551的博客 75

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[转] linux epoll 问题小结

1,server端的fd不需要设置et模式 我们在创建socket成功后会有个listenfd,listenfd = socket(AF_INET, SOCK_STREAM, 0) 然后会把这个fd加入epollwait队列中,网上很多没有经过验证的代码是这样写的: ev.data.fd = listenfd; ev.events=EPOLLIN|EPOLLET; epoll...

anren7769的博客 205

epoll服务器小结

epoll简介:  epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合

月已满西楼的博客 373

LINUX EPOLL小结

1,server端的fd不需要设置et模式 我们在创建socket成功后会有个listenfd,listenfd = socket(AF_INET, SOCK_STREAM, 0) 然后会把这个fd加入epoll wait队列中,网上很多没有经过验证的代码是这样写的: ev.data.fd = listenfd; ev.events=EPOLLIN|EPOLLET; epoll_ct

jyj0710的专栏 428

Epoll 小结(Nginx)

1. 数据结构//表示一个要监听的事件 //其中events表示监听的标志位 EPOLLIN EPOLLOUT //表示被触发后的data struct epoll_event{ uint32_t events; epoll_data_t data; } //其中只有ptr数据结构比较重要 typedef union epoll_data{ void *ptr; i

qiulu12345的专栏 484

Linux中epoll用法小结

Linux中epoll用法小结

wDebug 的专栏 920

linux epoll 问题小结

1,server端的fd不需要设置et模式 我们在创建socket成功后会有个listenfd,listenfd = socket(AF_INET, SOCK_STREAM, 0) 然后会把这个fd加入epoll wait队列中,网上很多没有经过验证的代码是这样写的: ev.data.fd = listenfd; ev.events=EPOLLIN|EPOLLET; epoll_ctl(

linking530的专栏 590

网络小结:Epoll_webserver

B/S模型(浏览器 / 服务器)实现一个简单的Web服务器myhttpd。能够给浏览器提供服务,供用户借助浏览器访问服务器主机中的文件。

BSY丶的博客 801

Socket网络编程--epoll小结

转载:http://www.cnblogs.com/wunaozai/p/3895860.html 以前使用的用于I/O多路复用为了方便就使用select函数,但select这个函数是有缺陷的。因为它所支持的并发连接数是有限的(一般小于1024),因为用户处理的数组是使用硬编码的。这个最大值为FD_SETSIZE,这是在中的一个常量,它说明了最大的描述符数。但是对于大多数应用程序而言,这

sinat_35297665的博客 260

select、poll、epoll使用小结

Linux上可以使用不同的I/O模型,我们可以通过下图了解常用的I/O模型:同步和异步模型,以及阻塞和非阻塞模型,本文主要分析其中的异步阻塞模型。 一、select使用 这个模型中配置的是非阻塞I/O,然后使用阻塞select系统调用来确定一个I/O描述符何时有操作。使用select调用可以为多个描述符提供通知,对于每个提示符,我们可以请求描述符的可写,可读以及是否发生错误。异步阻塞I

kkxgx的专栏 1万+
上一篇: connect和bind
下一篇: 进程间通信方法初步总结
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值