Linux系统网络编程——第二十节 多路复用之epoll 模型

news2024/9/21 16:47:28

目录

epoll相关系统调用

1、epoll_create:

2、epoll_ctl()

3、epoll_wait

epoll模型原理

epoll的使用场景


各位好,博主新建了个公众号《自学编程村》,拉到底部即可看到,有情趣可以关注看看哈哈,关注后还可以加博主wx呦~~~(公众号拉到底部就能看到呦~~)

epoll相关系统调用

1、epoll_create:

int epoll_create(int size);

(自从linux2.6.8之后, size参数是被忽略的,用完之后, 必须调用close()关闭

返回值一个文件描述符

调用这个函数的时候,底层(内核层)会帮我们构建出一个epoll模型。epoll模型是什么?先不用管,就先理解它是一个模型就好了,它是有一个整体的、抽象的概念。

2、epoll_ctl()

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

作用:向epoll模型中添加(删除、修改等) 对应的文件描述符 以及 对应的事件

1、epfd:epoll模型编号;

2、op选项:

EPOLL_CTL_ADD :注册新的fd到epfd中;

EPOLL_CTL_MOD :修改已经注册的fd的监听事件;

EPOLL_CTL_DEL :从epfd中删除一个fd;

 

该函数表示向epfd这么一个epoll模型当中,添加、删除、修改(op选项决定)对应文件描述符 (fd) 的相应事件 (event) (这里是用户告诉内核)

(结构体event下面会再说到)

3、epoll_wait

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

 

第一个参数表示我们所创建的epoll模型。

第二、三个参数表示两个输出型参数:表示内核告诉用户:哪些文件描述符对应的哪些事件已经就绪了,我给你放在了epoll_event列表当中,并且告诉你有多大。

第四个参数和poll用法一样

用了epoll,那么整个文件描述符都是由系统来管理了(直观的感受是不需要自己再去定义数组了)

对于那个event结构体,如下图: 

epoll宏的集合:

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

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

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

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

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

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

EPOLLONESHOT:只监听一次事件, 当监听完这次事件之后, 如果还需要继续监听这个socket的话, 需要

再次把这个socket加入到EPOLL队列里

epoll模型原理

1、创建epoll模型即在内核当中为我们创建了一颗红黑树。

在红黑树上的结点:放置两个元素(fd和event)。所以调用epoll_ctl的时候你要帮助我关心哪些fd上面的哪些event(K,V模型)。如果要修改或者增加、删除,就是对红黑树的结点进行操作。

2、建立回调函数。

在OS上,使用驱动层的某些功能,完成某些回调功能。

3、创建就绪队列。

当底层有事件已经就绪的时候,那么就调用OS的某些回调功能的机制,然后在系统层面上生成一个新的结点(元素也是fd\event)(可能没有fd),然后放在就绪队列当中

Epoll_ctl就是帮助我们删除、增加、修改等。(本质帮我们创建或者消除结点,然后生成相应的回调函数)

Epoll_wait就直接从就绪队列里面拿就可以了。(本质上为拷贝)

思考几个问题:

1、OS怎么知道数据是发送过来给自己的?

本质上是通过中断机制。(可自行上网搜一搜)

2、OS怎么知道一个事件已经就绪了?

缓冲区有一个低水位线这样一个概念,当数据不断交付给上层的时候,数据越来越多,多到一定程度的时候就证明事件就绪了

3、不管是poll还是select,都是通过轮询的方式,效率较低。

而epoll所用的是属于回调机制,即事件就绪的文件来去主动向上通知交付。

(关于epoll的用法,还涉及到ET模型和LT模型,这里就不做过多赘述了,感情去的小伙伴可以上网搜索一下)

epoll的使用场景

epoll的高性能, 是有一定的特定场景的. 如果场景选择的不适宜, epoll的性能可能适得其反.

对于多连接, 且多连接中只有一部分连接比较活跃时, 比较适合使用epoll.

例如, 典型的一个需要处理上万个客户端的服务器, 例如各种互联网APP的入口服务器, 这样的服务器就很适合epoll.

如果只是系统内部, 服务器和服务器之间进行通信, 只有少数的几个连接, 这种情况下用epoll就并不合适. 具体要根

据需求和场景特点来决定使用哪种IO模型

好啦,本节的内容就到这里啦~~

原创不易,如果觉得写的不错,就点个赞呗~~~笔芯~~~~

下面是笔者的微信公众号,也欢迎来关注呀~~~

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

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

相关文章

Redis原理篇

目录Redis数据结构动态字符串SDS整数集合Intset键值型Dict压缩链表 ZipList快速链表QuickList跳表SkipList对象RedisObjectRedis网络模型Redis通信协议-RESP协议Redis内存回收过期key处理内存淘汰策略Redis数据结构 动态字符串SDS Redis构建了一种新的字符串结构,…

从C#5.0说起:再次总结C#异步调用方法发展史

本篇继续介绍WaitHandler类及其子类 Mutex,ManualResetEvent,AutoResetEvent的用法。 .NET中线程同步的方式多的让人看了眼花缭乱,究竟该怎么去理解呢? 其实,我们抛开.NET环境看线程同步,无非是执行两种操…

软件测试基础知识总览【纯知识,建议收藏慢慢学】

1. 软件测试定义 首先要明确测试的定义,所谓测试,就是以检验产品是否满足需求为目标。 而软件测试,自然是为了发现软件(产品)的缺陷而运行软件(产品) 比较标准的软件测试的定义是:在规定的条件下对程序进行操作,以发现错误,对软件质量进行评估。 IEE…

算法总结,不断更新

文章目录摩尔投票法DFS算法BFS算法题源来自于力扣网 摩尔投票法 适用场景 如何在选票无序的情况下,选出获胜者。 例题: 找出数组中,出现次数超过总数一半的数字(出现次数 > n/2)。 输入:[1,1,3,2,4,6,…

10000字吐血总结+24张图带你彻底弄懂线程池

大家好。今天跟大家聊一聊无论是在工作中常用还是在面试中常问的线程池,通过画图的方式来彻底弄懂线程池的工作原理,以及在实际项目中该如何自定义适合业务的线程池。 一、什么是线程池 线程池其实是一种池化的技术的实现,池化技术的核心思…

MVC|JAVA|SSM框架计算机硬件评测交流平台的开发和实现

收藏点赞不迷路 关注作者有好处 文末获取源码 项目编号:BS-PT-070 一,项目简介 计算机硬件在社会上有很多广泛的发烧友,他们急需一个发布专业硬件测评数据的平台并进行交流互动的社区。本次开发实现的计算机硬件交流平台就是作为一个专业的…

Android序列化之Parcel源码分析(2)

文章目录1.Parcel.java2.Parcelable和Parcel的关系3.Parcel写入数据源码分析3.1.java层Parcel创建3.2.native层Parcel创建3.3写入IBinder接口标识符3.4写入String数据4.Parcel读取数据源码分析4.1获取IBinder接口标识符4.2读取String数据1.Parcel.java Android可以通过Parcel进…

【OpenCV学习】第15课:处理卷积边缘问题

仅自学做笔记用,后续有错误会更改 (卷积的概念可以看看第14课) 理论 卷积边缘问题:从下图最右方的结果可以看出,卷积操作之后, 剩余的绿色像素部分, 我们是没有处理到的 那么如何处理这个问题呢&#xf…

论文3:查找文献在指定期刊的引用格式

文章目录说明:1.谷歌学术搜索(可以用一些国内的镜像),并点击被引用次数2.勾选在引用文章中搜索,并在搜索框搜索指定期刊的关键词3.这里指定期刊是RAL即IEEE Robotics and Automation Letters4.任意点开上图中的一篇文章…

支付宝当面付网站对接支付教程

有很多人会开支付宝当面付但是不会配置它老会出现一下情况 第二种情况如下: 如果遇到以上情况可以按照我的步骤就可以解决 详细步骤: 一、应用APPID获取方法 1.打开网站:https://openhome.alipay.com/platform/developerIndex.htm&#x…

Canal配置多个实例以及将Mysql指定表的binlog导入指定的Kafka的Topic

Canal配置多个实例以及将Mysql指定表的binlog导入指定的Kafka的Topic 进入Canal的conf目录 复制模板配置文件 cp -r example/ Ordercp -r example/ Orderdetail修改canal.propertieswenjain vim canal.properties修改内容如下,指定输出模式为kafka canal.serverM…

【元胞自动机】心房颤动/扑动模型研究(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

(附源码)ssm学校疫情服务平台 毕业设计 291202

ssm学校疫情服务平台 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对学校疫情服务平台等问…

【数电实验】触发器及其应用

实验三 触发器及其应用 一 实验目的 1 了解触发器的触发方式(上升沿触发、下降沿出发)及其触发特点; 2 测试常用触发器的逻辑功能; 3 掌握用触发器设计同步时序逻辑电路的方法。 二 实验内容 1 测试双D触发器74HC74的逻辑功能…

手工编译konsole备忘

背景 系统自带的终端弱爆了,本来想编译深度终端的,但DTK风格的程序在非DDE桌面(应该是dde_kwin这个窗管的问题)巨难看,无意中添加了Konsole,发现已经有我需要使用的右键打开当前目录文件管理器的功能。 …

Go context.Context的学习

一、前言 Golang context是Golang应用开发常用的并发控制技术,它与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力,它可以控制多级的goroutine。 context翻译成中文是”上下文”,即它可以控制一组呈树状结构的goroutine&a…

java计算机毕业设计ssm疫情期间校园车辆入校预约管理服务系统1171a(附源码、数据库)

java计算机毕业设计ssm疫情期间校园车辆入校预约管理服务系统1171a(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe…

没有二十年功力,写不出 Thread.sleep(0) 这一行“看似无用”的代码

这篇文章要从一个奇怪的注释说起,就是下面这张图: 我们可以不用管具体的代码逻辑,只是单单看这个 for 循环。 在循环里面,专门有个变量 j,来记录当前循环次数。 第一次循环以及往后每 1000 次循环之后,进…

ssm+vue基本微信小程序的校园二手商城系统 计算机毕业设计

在当今社会的高速发展过程中,产生的劳动力越来越大,提高人们的生活水平和质量,尤其计算机科技的进步,数据和信息以人兴化为本的目的,给人们提供优质的服务,其中网上购买二手商品尤其突出,使我们…

211大数据专业大四学生,放弃字节转正,选择老家大型国企,听听他怎么说?...

点击上方 "大数据肌肉猿"关注, 星标一起成长点击下方链接,进入高质量学习交流群今日更新| 1052个转型案例分享-大数据交流群分享学习群一位大数据专业同学的秋招学习和求职经历,他是211大四学生,年初才开始学习,但还好赶…