158 Linux C++ 通讯架构实战13,epoll 原理和函数介绍,epoll_create,epoll_ctl ,epoll_wait

epoll技术简介


    //(2.1)epoll概述
    //(1)I/O多路复用:epoll就是一种典型的I/O多路复用技术:epoll技术的最大特点是支持高并发;
    //传统多路复用技术select,poll,在并发量达到1000-2000,性能就会明显下降;
    //epoll,kquene(freebsd)
    //epoll,从linux内核2.6引入的,2.6之前是没有的;
    //(2)epoll和kquene技术类似:单独一台计算机支撑少则数万,多则数十上百万并发连接的核心技术;
    //epoll技术完全没有这种性能会随着并发量提高而出现明显下降的问题。但是并发没增加一个,必定要消耗一定的内存去保存这个连接相关的数据;
     //并发量总还是有限制的,不可能是无限的;
    //(3)10万个连接同一时刻,可能只有几十上百个客户端给你发送数据,epoll只处理这几十上百个客户端;
    //(4)很多服务器程序用多进程,每一个进程对应一个连接;也有用多线程做的,每一个线程对应 一个连接;
    //epoll事件驱动机制,在单独的进程或者单独的线程里运行,收集/处理事件;没有进程/线程之间切换的消耗,高效
    //(5)适合高并发,融合epoll技术到项目中,作为大家将来从事服务器开发工作的立身之本;
    //写小demo非常简单,难度只有1-10,但是要把epoll技术融合到商业的环境中,那么难度就会骤然增加10倍;

学习epoll要达到的效果及一些说明


    //(1)理解epoll的工作原理;面试考epoll技术的工作原理;
    //(2)开始写代码
    //(3)认可nginx epoll部分源码;并且能复用的尽量复用;

三:epoll原理与函数介绍:三个函数,理解好就等于掌握了epoll技术的工作原理,以下内容务必认真理解。

掌握这个三个函数的使用,并结合网上一些大神关于如何自己实现这个三个函数的源码分析,epoll的三个关键函数都干了什么。

大神源码:

    //https://github.com/wangbojing
    //a)c1000k_test这里,测试百万并发的一些测试程序;一般以main();
    //b)ntytcp:nty_epoll_inner.h,nty_epoll_rb.c
    //epoll_create();
    //epoll_ctl();
    //epoll_wait();
    //epoll_event_callback();
    //c)总结:建议学习完老师的epoll实战代码之后,再来学习 这里提到的课件代码,事半功倍;

epoll_create()函数

原型  : int epoll_create(int size);

功能:创建一个epoll对象,

        返回该对象的描述符【文件描述符】,这个描述符就代表这个epoll对象,后续会用到;
    //这个epoll对象最终要用close(),因为文件描述符/句柄 总是关闭的;

参数:size表示你要连接的客户端数量

这个值是建议内核的,假设我们写了100,但是当您的连接数量超过100的时候,内核会给你自动分配

size: >0;

从大神的代码中分析epoll的原理可知:

epoll_create是创建了一个红黑树的节点,

    //原理:这个当前看不懂源码也没有关系,先知道大概咋回事,要看懂这块,必须数据结构很明白。
    //a)struct eventpoll *ep = (struct eventpoll*)calloc(1, sizeof(struct eventpoll)); 
    //b)rbr结构成员:代表一颗红黑树的根节点[刚开始指向空],把rbr理解成红黑树的根节点的指针;
    //红黑树,用来保存  键【数字】/值【结构】,能够快速的通过你给key,把整个的键/值取出来;
    //c)rdlist结构成员:代表 一个双向链表的表头指针;
    //双向链表:从头访问/遍历每个元素特别快;next。
    //d)总结:创建了一个eventpoll结构对象,被系统保存起来;
       //rbr成员被初始化成指向一颗红黑树的根【有了一个红黑树】;
       //rdlist成员被初始化成指向一个双向链表的根【有了双向链表】;

epoll_ctl 控制某个epoll监控的文件描述符上的事件:注册、修改、删除。也就是说,有了这个红黑树了,就要给树上挂节点了,或者删除节点,或者修改节点了

红黑树上的每一个节点的内容都是如下的一个struct epitem。

每次使用 epoll_ctl实际上就是 将一个struct epitem  从根节点的红黑树上 添加/删除/修改、

 

原型

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

参数

因此第一个参数是 这个红黑树的根节点,就是告诉系统,我要对这个红黑树进行改动。

第二个参数是说明,我是挂节点/删除节点/修改节点的哪一种

第三个参数是说明,我要挂的节点的 fd,或者删除节点的fd,或者修改节点的fd

第四个参数说明:

我对第三个参数的什么事件进行监控:events表明了是对读:EPOLLIN,写:EPOLLOUT,错误EPOLLERR,  边缘触发模式:EPOLLET

然后做为传入参数,描述了我要做什么事情,里面还有一个fd,对应了epoll_ctl的第三个参数。学到这里的时候有一个想法,就是为什么在还需要第四个参数中有一个fd,且这个fd和第三个参数是一样的,网上也没有找到合理的说明,那么只有一种可能,就是epoll_event 做为参数使用的时候,要用到fd,但是epoll的开发者又不想依赖于外部条件,因此将这个参数再填写一遍

void *ptr //这个todo

#include <sys/epoll.h>

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

epfd: 为epoll_creat的句柄

op: 表示动作,用3个宏来表示:

        EPOLL_CTL_ADD (注册新的fd到epfd),

        EPOLL_CTL_MOD (修改已经注册的fd的监听事件),

        EPOLL_CTL_DEL (从epfd删除一个fd);

event: 告诉内核需要监听的事件

struct epoll_event {

        __uint32_t events; /* Epoll events */

        epoll_data_t data; /* User data variable */

};

typedef union epoll_data {

        void *ptr;

        int fd;  //  和 epoll_ctl的第三个参数一样

        uint32_t u32;  //不用

        uint64_t u64; //不用

} epoll_data_t;

events 取值为:

        EPOLLIN : 表示对应的文件描述符可以读(包括对端SOCKET正常关闭)

        EPOLLOUT: 表示对应的文件描述符可以写

        EPOLLPRI: 表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来)

        EPOLLERR: 表示对应的文件描述符发生错误

        EPOLLHUP: 表示对应的文件描述符被挂断;

        EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)而言的

        EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里

参考大神实现epoll_ctl代码:

	//原理://a)epi = (struct epitem*)calloc(1, sizeof(struct epitem));//b)epi = RB_INSERT(_epoll_rb_socket, &ep->rbr, epi); 【EPOLL_CTL_ADD】增加节点到红黑树中//epitem.rbn ,代表三个指针,分别指向红黑树的左子树,右子树,父亲;//epi = RB_REMOVE(_epoll_rb_socket, &ep->rbr, epi);【EPOLL_CTL_DEL】,从红黑树中把节点干掉//EPOLL_CTL_MOD,找到红黑树节点,修改这个节点中的内容;//红黑树的节点是epoll_ctl[EPOLL_CTL_ADD]往里增加的节点;面试可能考//红黑树的节点是epoll_ctl[EPOLL_CTL_DEL]删除的;//总结://EPOLL_CTL_ADD:等价于往红黑树中增加节点//EPOLL_CTL_DEL:等价于从红黑树中删除节点//EPOLL_CTL_MOD:等价于修改已有的红黑树的节点

返回值:

成功:0;失败:-1,设置相应的errno

epoll_wait 等待所监控文件描述符上有事件的产生,类似于select()调用。

函数原型

#include <sys/epoll.h>

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

参数

events: 用来存内核得到事件的集合,可简单看作数组。是传出参数,传出满足监听条件的那个fd结构体

maxevents: 告之内核这个events有多大,也就是说,这次epoll_wait 可以收集到的events的个数,这个maxevents的值不能大于创建epoll_create()时的size,

timeout: 是超时时间

-1: 阻塞

0: 立即返回,非阻塞

>0: 指定毫秒

返回值:

成功返回有多少文件描述符就绪,时间到时返回0,出错返回-1

     //说白了就是遍历这个双向链表,把这个双向链表里边的节点数据拷贝出去,拷贝完毕的就从双向链表里移除;
    //因为双向链表里记录的是所有有数据/有事件的socket【TCP连接】;
    //参数epfd:是epoll_create()返回的epoll对象描述符;
    //参数events:是内存,也是数组,长度 是maxevents,表示此次epoll_wait调用可以收集到的maxevents个已经就绪【已经准备好的】的读写事件;
      //说白了,就是返回的是 实际 发生事件的tcp连接数目;
    //参数timeout:阻塞等待的时长;

epitem结构设计的高明之处:既能够作为红黑树中的节点,又能够作为双向链表中的节点;

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

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

相关文章

YOLOV5 改进:更换主干网络为Resnet

1、前言 之前实现了yolov5更换主干网络为MobileNet和vgg网络 本章将继续将yolov5代码进行更改,通过引用官方实现的resnet网络,替换原有的yolov5主干网络 替换的效果如下: 2、resnet 网络结构 测试的代码为官方的resnet34 通过summary 打印的resnet网络结构如下 =======…

【Linux】Vim编辑器

专栏文章索引&#xff1a;Linux 目录 在Vim编辑器中&#xff0c;一个Tab键相当于几个空格&#xff1f; 在Vim编辑器中&#xff0c;一个Tab键相当于几个空格&#xff1f; 在Vim编辑器中&#xff0c;默认情况下&#xff0c;一个Tab键相当于8个空格。 这是Vim的默认设置&#x…

全面剖析CSS盒子模型:概念理解、构成元素、布局影响与实战技巧

在CSS进行网页布局与样式设计的过程中&#xff0c;盒子模型&#xff08;Box Model&#xff09;扮演着无可替代的角色。这一关键概念是精准掌控页面元素布局与样式的基石。唯有深入理解和熟练运用盒子模型的原理及各项属性&#xff0c;开发者方能自如地塑造页面中各元素的最终形…

杰发科技——Jlink插件使用

0. 简介 杰发自带的烧录工具是ATCLink&#xff0c;基于DapLink适配。个人不太喜欢ATCLink&#xff0c;推荐使用Jlink&#xff0c;毕竟自己买&#xff0c;不用问原厂要&#xff0c;而且带Jlink&#xff0c;至少5Mhz以上。 V9烧录器使用7.50以下版本驱动。 V11烧录器可以使用7…

【数据挖掘】实验5:数据预处理(2)

验5&#xff1a;数据预处理&#xff08;2&#xff09; 一&#xff1a;实验目的与要求 1&#xff1a;熟悉和掌握数据预处理&#xff0c;学习数据清洗、数据集成、数据变换、数据规约、R语言中主要数据预处理函数。 二&#xff1a;实验知识点总结 1&#xff1a;数据集成是将多个…

DolphinScheduler on k8s 云原生部署实践

文章目录 前言利用Kubernetes技术云原生平台初始化迁移基于Argo CD添加GitOpsDolphinScheduler 在 k8s 上的服务自愈可观测性集成服务网格云原生工作流调度从HDFS升级到S3文件技术总结 前言 DolphinScheduler 的高效云原生部署模式&#xff0c;比原始部署模式节省了95%以上的人…

windows部署Jenkins并远程部署tomcat

目录 1、Jenkins官网下载Jenkins 2、安装Jenkins 3、修改Home directory 4、插件安装及系统配置 5、Tomcat安装及配置 5.1、修改配置文件,屏蔽以下代码 5.2、新增登录用户 5.3、编码格式修改 5.4、启动tomcat 6、Jenkins远程部署war包 6.1、General配置 6.2、Sourc…

网页设计图片素材-家具 里面有71张家具图片

网页设计图片素材-家具 里面有71张家具图片 链接: https://pan.baidu.com/s/1wHgpZrHXrkS-jeJxxnzIQg 提取码: t7b6

算法错题本

这里写目录标题 错题本注意数据的耦合性对于无解情况的处理思路一组数据以0为结束标记&#xff0c;如何输入到数组中&#xff0c;并计数多个数据进行比较链表删除重复元素的启发循环体里谨慎写类型定义并初始化&#xff08;一般写上就是错&#xff09;队列中读取队尾元素数组当…

信息技术学院大数据技术专业开展专业实训周

四川城市职业学院讯&#xff08;信息技术学院 陈天伟&#xff09;日前&#xff0c;为提升学生的工匠精神和职业认知&#xff0c;信息技术学院邀请企业专家入驻眉山校区大数据实训基地&#xff0c;开展数据标识专业实训周。 数据标识是大数据专业的核心技术&#xff0c;数据标识…

51单片机学习笔记13 红外遥控接收

51单片机学习笔记13 红外遥控接收 一、红外遥控1. **发射原理**2. **接收原理**3. **发射、接收示例** 二、编码、解码1. **编码方式分类**&#xff1a;&#xff08;1&#xff09;Pulse Distance Modulation (PDM) 脉冲距离调制&#xff1a;&#xff08;2&#xff09;Pulse Wid…

Windows下用CMake编译PugiXML及配置测试

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 PugiXML是什么&#xff1f; PugiXML 是一个用于解析和操作 XML 文档的 C 库。它提供了简单易用的接口&#xff0c;能够高效地加载…

3. WiFi基本原理

1. WiFi简介 WiFi的全称是Wireless Fidelity。它是一种无线网络通信技术&#xff0c;由Wi-Fi联盟拥有&#xff0c;目的是改善基于IEEE 802.11标准的无线网络产品之间的互通性&#xff0c;允许电子设备在没有物理连接的情况下进行高速数据传输。此外&#xff0c;WiFi也被视为IE…

Spring Boot接收从前端传过来的数据常用方式以及处理的技巧

一、params 传参 参数是会拼接到url后面的请求 场景规范:url后面的key值<=3个参数的时候,使用params 传参 支持的请求方式:get(正规的是get方式)、post 都行 例如: http://localhost:8080/simpleParam?name=Tom&age=10 在postman里面的体现为 后端接收的接口…

【热门话题】WebKit架构简介

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 WebKit架构简介一、引言二、WebKit概览1. 起源与发展2. 模块化设计 三、WebCore…

java Web 辅助学习管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 java Web 辅助学习管理系统是一套完善的信息管理系统&#xff0c;结合java 开发技术和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 bootstr…

基于LSB(最低有效位)的图像水印算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

使用Vue实现CSS过渡和动画

01-初识动画和过渡 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>使用vue实现css过渡和动画&l…

玩转ChatGPT:Kimi测评(科研写作)

一、写在前面 ChatGPT作为一款领先的语言模型&#xff0c;其强大的语言理解和生成能力&#xff0c;让无数用户惊叹不已。然而&#xff0c;使用的高门槛往往让国内普通用户望而却步。 最近&#xff0c;一款由月之暗面科技有限公司开发的智能助手——Kimi&#xff0c;很火爆哦。…

python爬取B站视频

参考&#xff1a;https://cloud.tencent.com/developer/article/1768680 参考的代码有点问题&#xff0c;请求头需要修改&#xff0c;上代码&#xff1a; import requests import re # 正则表达式 import pprint import json from moviepy.editor import AudioFileClip, Vid…