I/O多路复用模型实现——epoll

news2024/10/7 18:30:50

epoll IO多路复用模型实现机制

    • I/O多路复用
    • epoll
      • epoll_create(int size)
      • epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
      • epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
      • epoll event
    • epoll流程

I/O多路复用

I/O 多路复用的本质,是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作。
所谓I/O多路复用指的是这样一个过程:

  1. 我们拿到了一堆文件描述符(不管是网络相关的、还是磁盘文件相关等等,任何文件描述符都可以)
  2. 通过调用某个函数告诉内核:“这个函数你先不要返回,你替我监视着这些描述符,当这堆文件描述符中有可以进行I/O读写操作的时候你再返回”
  3. 当调用的这个函数返回后我们就能知道哪些文件描述符可以进行I/O操作了。
    也就是说通过I/O多路复用我们可以同时处理多路I/O。

epoll机制可以用来进行I/O多路复用

epoll 的核心数据结构是:1个红黑树和1个链表。还有3个核心API在这里插入图片描述
熟悉一下epoll

epoll

epoll_create(int size)

创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大

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

第一个参数是epoll_create()的返回值
第二个参数表示动作
	EPOLL_CTL_ADD:注册新的fd到epfd中
	EPOLL_CTL_MOD:修改已经注册的fd的监听事件
	EPOLL_CTL_DEL:从epfd中删除一个fd
第三个参数是需要监听的fd
第四个参数是告诉内核需要监听什么事,在被监测的文件描述符上实际发生的事件。

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

第1个参数 epfd是 epoll的描述符
第2个参数 events则是分配好的 epoll_event结构体数组,epoll将会把发生的事件复制到 events数组中
第3个参数 maxevents表示本次可以返回的最大事件数目,通常 maxevents参数与预分配的events数组的大小是相等的
第4个参数 timeout表示在没有检测到事件发生时最多等待的时间(单位为毫秒),如果 timeout为0,则表示 epoll_wait在 rdllist链表中为空,立刻返回,不会等待;timeout = -1表示调用将一直阻塞,直到有文件描述符进入ready状态或者捕获到信号才返回

epoll event

EPOLLIN:描述符处于可读状态
EPOLLOUT:描述符处于可写状态
EPOLLET:将epoll event通知模式设置成edge triggered
EPOLLONESHOT:第一次进行通知,之后不再监测
EPOLLHUP:本端描述符产生一个挂断事件,默认监测事件
EPOLLRDHUP:对端描述符产生一个挂断事件
EPOLLPRI:由带外数据触发
EPOLLERR:描述符产生错误时触发,默认检测事件

epoll流程

Epoll流程:

当某个进程调用epoll_create方法时,内核会创建一个eventpoll对象(也就是程序中epfd所代表的对象)。eventpoll对象也是文件系统中的一员,和socket一样,它也会有等待队列。

在这里插入图片描述

创建epoll对象后,可以用epoll_ctl添加或删除所要监听的socket。以添加socket为例,如下图,如果通过epoll_ctl添加sock1、sock2和sock3的监视,内核会将eventpoll添加到这三个socket的等待队列中
在这里插入图片描述

当socket收到数据后,中断程序会操作eventpoll对象,而不是直接操作进程。
当socket收到数据后,中断程序会给eventpoll的“就绪列表”添加socket引用。如下图展示的是sock2和sock3收到数据后,中断程序让rdlist引用这两个socket。
在这里插入图片描述

eventpoll对象相当于是socket和进程之间的中介,socket的数据接收并不直接影响进程,而是通过改变eventpoll的就绪列表来改变进程状态。
当程序执行到epoll_wait时,如果rdlist已经引用了socket,那么epoll_wait直接返回,如果rdlist为空,阻塞进程。
假设计算机中正在运行进程A和进程B,在某时刻进程A运行到了epoll_wait语句。如下图所示,内核会将进程A放入eventpoll的等待队列中,阻塞进程。
在这里插入图片描述

当socket接收到数据,中断程序一方面修改rdlist,另一方面唤醒eventpoll等待队列中的进程,进程A再次进入运行状态(如下图)。也因为rdlist的存在,进程A可以知道哪些socket发生了变化。

在这里插入图片描述

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

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

相关文章

悲观锁实现一人一单+jmeter并发测试

项目工程代码来自&#xff1a;https://mp.weixin.qq.com/s/nDhkmDHU_kqY-geDZrIOtw 核心代码 Service public class GoodsOrderServiceImpl extends ServiceImpl<GoodsOrderMapper, GoodsOrder> implements GoodsOrderService {Autowiredprivate IGoodsService goodsSe…

怎样从零基础学黑客

可以说想学黑客技术&#xff0c;要求你首先是一个“T”字型人才&#xff0c;也就是说电脑的所有领域你都能做的来&#xff0c;而且有一项是精通的。因此作为一个零基础的黑客爱好者来说&#xff0c;没有良好的基础是绝对不行的&#xff0c;下面我就针对想真正学习黑客的零基础朋…

CentOS yum报错问题汇总(持续更新)

一、为 repo AppStream 下载元数据失败1.错误现象为 repo ‘AppStream’ 下载元数据失败错误&#xff1a;为 repo ‘AppStream’ 下载元数据失败2.错误原因1.网络连接不上如果出现该错误&#xff0c;请先确保服务器可以正常连接互联网。可以ping一下百度的域名&#xff0c;能pi…

python小基础-更多请自学,或者某某教程-2023-2-21 小扒菜的自学之路【1】

python基础 基础学习 自己跟着菜鸟教程看的一些基础,会java或者js的话,1个半小时就可以over 好久没更新博客了,现在慢慢来发吧,基础内容不太多,自己理解会很快的(下面是一段个人的小经历,大家也可以看看,嘻嘻) 假期看了灵魂摆渡几部电视剧,无聊中收到了一个python爬虫公开课穷,…

华为OD机试 - 考古学家(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

外贸人如何利用领英LinkedIn开拓海外市场?这七大妙招你要知道

在社交媒体大行其道的时代下&#xff0c;作为职场人士专用的LinkedIn&#xff08;领英&#xff09;在全球则拥有5亿高端会员&#xff0c;覆盖全球200多个国家&#xff0c;也是唯一一个在中国不受限制的国外社交平台&#xff0c;与Facebook、谷歌、苹果并称为“硅谷四巨头”。 …

二倍均值随机算法之抢拼手气红包场景应用

拼手气类的游戏&#xff0c;更能激发用户购物和社交的趣味性&#xff0c;以及游戏竞争心理&#xff0c;拼手气类的活动甚至可以影响人们消费心理。 拼手气红包就是最简单的例子&#xff0c;哪怕你手气红包只有0.01元&#xff0c;在众多竞争者中脱颖而出&#xff0c;抢到的那一刻…

Elasticsearch7.8.0版本进阶——多文档操作流程

目录一、多文档操作1.1、多文档操作的概述1.2、多文档操作与单文档模式区别二、用单个 mget 请求取回多个文档2.1、用单个 mget 请求取回多个文档的图解2.2、用单个 mget 请求取回多个文档的步骤三、bulk API 的模式请求取回多个文档3.1、bulk API 的模式请求取回多个文档的图解…

优炫数据库百城巡展,成都首站圆满举行

2月17日&#xff0c;由四川省大数据发展研究会、北京优炫软件股份有限公司联合举办的“首届四川省推进信息技术应用创新产业服务研讨会暨优炫数据库百城巡展成都首站隆重举行。此次活动是优炫数据库百城巡展的起点站&#xff0c;更是国产数据库市场美好乐章的一次强力鸣奏。 来…

HarmonyOS Connect认证测试

在HarmonyOS Connect生态产品的认证测试过程中&#xff0c;你是否存在这些疑问&#xff1a;认证流程具体包括哪些操作环节&#xff1f;如何根据实际场景选择合适的认证方式&#xff1f;如何选择认证测试标准的版本…… 本期FAQ为大家带来HarmonyOS Connect认证测试的常见问题…

ChatGPT类工具如何实现「降维打击」| 聊天机器人闭门研讨观点总结

导读随着ChatGPT出现&#xff0c;语言大模型的进步与对话交互方式相结合&#xff0c;正在搅动科研、产业&#xff0c;以及普通人的想象力。我们对智能的探索是正在步入决胜之局&#xff0c;还是仍在中场酣战&#xff1b;是需要精巧完备的一致系统&#xff0c;还是可以遵循实效至…

什么是网站ICP备案,什么样的网站需要办理ICP?

进入互联网时代&#xff0c;企业业务的展开或多或少都要接触网络&#xff0c;甚至也会在线上建立公司的业务平台。很多企业会选择建立一个网站来直接展现公司面貌和业务。在我们完成了搭建好网站的全部内容后&#xff0c;最重要的一步&#xff1a;在网站建成进入到上线展现时&a…

【无标题】10.货币系统

题目描述: 在网友的国度中共有 n 种不同面额的货币&#xff0c;第 i 种货币的面额为 a[i]&#xff0c;你可以 假设每一种货币都有无穷多张。为了方便&#xff0c;我们把货币种数为 n、 面额数组为 a[1..n] 的货币系统记作 (n,a)。 在一个完善的货币系统中&#xff0c;每一个非…

TCP/IP网络编程——关于 I/O 流分离的其他内容

完整版文章请参考&#xff1a; TCP/IP网络编程完整版文章 文章目录第 16 章 关于 I/O 流分离的其他内容16.1 分离 I/O 流16.1.1 2次 I/O 流分离16.1.2 分离「流」的好处16.1.3 「流」分离带来的 EOF 问题16.2 文件描述符的的复制和半关闭16.2.1 终止「流」时无法半关闭原因16.2…

Python 之 Pandas 时间函数 time 、datetime 模块和时间处理基础

文章目录一、time 模块1、时间格式转换图2. struct_time 元组元素结构3. format time 结构化表示二、datetime 模块1. date类2. 方法和属性3. datetime 类三、timedelta 类的时间加减四、时间处理基础Python 中提供了对时间日期的多种多样的处理方式&#xff0c;主要是在 time …

Spring架构篇--2.4 远程通信基础--Socket通信

前言&#xff1a;通信中我们常常建立socket 通过其tcp完成通信&#xff1b; 1 Socket 介绍&#xff1a; 所谓socket 通常也称作”套接字“&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求&#…

四色菊皇家大学-BCG U2T产品宣传活动

BCG U2T产品的宣传和介绍。 2023年2月16日&#xff0c;四色菊皇家大学艺术文化中心&#xff0c;高等教育、科学、研究和创新部长Dnuch Tantodtit博士主持了BCG U2T产品的市场推广项目。四色菊皇家大学校长Saksit Anganaphanayakorn博士&#xff0c;以及U2T项目的管理人员、教职…

Ubuntu16.04使用apache创建个人用户主页并添加口令认证

文章目录一.安装apache二、apache文件和目录简述2.1 网站数据目录2.2 Apache配置文件三、创建个人用户主页3.1 开启个人用户主页功能3.2 建立目录和首页面3.3 开启模块3.4 测试四、添加口令认证4.1 生成密码数据库4.2 修改配置文件一.安装apache 创建虚拟机&#xff0c;保持默…

代码随想录【Day21】| 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先

530. 二叉搜索树的最小绝对差 题目链接 题目描述&#xff1a; 给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。 示例&#xff1a; 提示&#xff1a;树中至少有 2 个节点。 难点&#xff1a; 解答错误&#xff01;仅考虑了…

2023年软件测试工程师怎样跳槽,才能越跳越值钱?

2023年就业难&#xff1f;可那个转行干软件测试的小哥哥才刚拿到2W薪资的offer&#xff0c;紧接着又跳槽去了大厂 作为软件测试工程师怎样跳槽才能越跳越值钱呢&#xff1f; 把控好跳槽频次 我们在编写简历的时候&#xff0c;总想尽可能展示出自己的技能&#xff0c;但是简历上…