Linux常见IO模型-3

news2024/9/21 2:35:48

在前两篇博客中,我们讲述了常见的IO模型,并对多路转接模型中的select模型进行了细致介绍和具体的代码实现。那么接下来,我们在本篇博客中将对剩余的多路转接模型中的:poll和epoll进行介绍。

目录

1.poll

1.1操作流程

1.2代码实现

2.epoll

2.1操作流程

2.2代码实现

2.3触发方式

2.3.1水平触发

2.3.2边缘触发

1.poll

1.1操作流程 

一、我们需要定义一个事件结构体数组,来存取监控事件和它们的状态,具体的结构体内容如下:

struct pollfd {
    int fd;//需要进行监控的文件描述符
    short events;//想要监控的事件, POLLIN--可读 POLLOUT--可写
    short revents;//监控返回后,存储实际就绪的事件
};

二、我们对不同的描述符按需进行具体的监控事件,并在数组中进行设置,例如:

//定义具体结构体数据
struct pollfd fds[MAX];
//对标准输入进行可读事件监控
fds[0].fd = 0;
fds[0].events = POLLIN;
//对标准输出进行可写事件监控
fds[0].fd = 1;
fds[0].events = POLLOUT;

三、开始监控,原理和select相似,依旧是将数组中有效数据拷贝到内核当中,进行多次的轮询遍历,第一次遍历:判断有无就绪事件,没有则挂起到监控队列;第二次遍历:进程阻塞被唤醒之后,进行一次遍历,对每个元素的revents设置实际的就绪事件。

我们介绍具体的监控接口如下:

int poll(struct pollfd *fds, nfds_t maxevents, int timeout);
/*其中,
    fds是定义事件结构体数组首地址
    maxevents数组中有效元素个数
    timeout是监控阻塞的超时时间,以毫秒为单位
*/

具体的返回值为:>0表示实际就绪的事件个数;==0表示超时;<0表示出错。

四、 调用返回之后,遍历事件结构体数组,根据revents成员确定描述符是否就绪了某个事件,进而对描述符进行操作。

1.2代码实现

我们设计简单代码,对poll模型加以使用,即对标准输入进行读端监控,得到具体代码如下:

然后编译并执行可以得到结果如下:

超时警告和读端监控都可正常运行。

2.epoll

2.1操作流程

一、在内核中创建epoll句柄即eventpoll结构,具体接口如下:

int epoll_create(int size);
/*
    其中,size是所监控的描述符上线,在Linux2.6.8中被忽略,但必须大于0
*/

具体的返回值是:返回epoll的描述符,创建错误则返回-1。(我们可以用epoll监控epoll)

二、向内核的句柄中,添加/移除/修改所要监控的描述符即对应的事件结构,具体的操作接口如下: 

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *ev);
/*
    其中,epfd是epoll_create所返回的epoll描述符
    op是对epoll要进行的操作,EPOLL_CTL_ADD/EPOLL_CTL_DEL/EPOLL_CTL_MOD
    fd是要进行操作的描述符
    struct epoll_event *ev是对描述符进行操作的详细信息  
*/

我们对其中结构体struct epoll_event进行介绍,其中包括一个uint32_t类型的变量,代表想要监控的事件,以及监控后存放实际就绪的事件;还存在一个联合体,用来存储额外信息。

三、开始监控,epoll的监控是一个异步阻塞操作,发起监控调用是为了告诉操作系统,可以开始监控,并且具体的监控任务由操作系统完成,而系统内容为epoll的每个描述的就绪事件挂了一个回调函数。

该回调函数的功能就是:描述符一旦就绪了指定的事件,将事件信息拷贝一份到epoll_create接口所创建的双向链表rdlist中,那么rdlist的作用便是:存放就绪的描述符对应的事件结构。

一旦系统监控中存在描述符就绪,则唤醒进程的阻塞,进程被唤醒之后,将会查看rdlist双向链表中是否由数据,便可确定是否有描述符就绪。(进程只需要判断rdlist链表是否为NULL,便可知是否存在事件就绪,不需要进行遍历)

具体的操作接口如下:

int epoll_wait(int epfd, struct epoll_event *evs, int maxevents, int timeout);
/*
    其中,epfd时是epoll_create所返回的描述符
    evs是epoll_event结构体数组的空间首地址,接收就绪事件
    maxevents是数组的最大元素个数,也表示了当前想要获取的最大事件个数
    timeout是设置的监控时间--以毫秒为单位
*/

具体的返回值为:>0表示实际就绪的事件个数;==0表示超时;<0表示出错。

2.2代码实现

我们首先设计Epoll类,便于后续具体操作,具体内容如下:

其中使用到的tcp_socket.hpp头文件内容在Linux常见IO模型-2中进行过编写和展示,并且其中的客户端代码不变,对服务端代码进行修改如下:

最后编译并执行,得到结果如下:

2.3触发方式

2.3.1水平触发

水平触发是只要存在事件满足对应触发条件,则会触发对应的事件。

  • 可读:缓冲区中数据大小大于高水位标记(默认1字节),就会触发可读事件;
  • 可写:缓冲区中剩余空间大小大于高水位标记,则会触发可写事件。

2.3.2边缘触发

边缘触发是尽量让用户在一次事件触发中,将所有能够的数据全部都处理完毕,尽量减少事件触发次数,减少运行态切换次数。

  • 可读:每当套接字有新的数据到来的时候,则会触发一次事件;
  • 可写:缓冲区剩余空间从无到有的时候,才会触发一次事件。

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

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

相关文章

硬件系统工程师宝典(27)-----MOSFET、BJT搭配,干活不累

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到场效应管的原理是通过“监测”栅极和源极间电压来实现控制漏极-源极之间电流的目的。今天我们来讲讲场效应管如何和BJT搭配设计控制电路…

【P44】JMeter 模块控制器(Module Controller)

文章目录 一、模块控制器&#xff08;Module Controller&#xff09;参数说明二、测试计划设计 一、模块控制器&#xff08;Module Controller&#xff09;参数说明 提供了一种在运行时将测试计划片段替换为当前测试计划的机制&#xff1b;模块控制器的目标是为增加脚本的复用…

springboot+vue实验室预约设备报修管理系统

本实验室管理系统管理员功能有个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;公告信息管理&#xff0c;知识库管理&#xff0c;实验课程管理&#xff0c;实验室信息管理&#xff0c;实验室预约管理&#xff0c;实验设备管理&#xff0c;采购记录管理&#xff0…

addon.MediaStream,erizo::MediaStream 还有addon.MediaXXX,erizo::MediaXXX

9. MediaStream 和erizo::MediaStream 类的继承关系 erizo::MediaStream source/agent/webrtc/rtcConn/erizo/src/erizo/MediaStream.h source/agent/webrtc/rtcConn/erizo/src/erizo/MediaDefinitions.h erizo::MediaSource source/agent/webrtc/rtcConn/erizo/src/erizo/…

【C++进阶4-AVLTree】尽可能条理清晰地为你讲解比普通BST更强的——AVLTree

今天&#xff0c;带来AVLTree的讲解。文中不足错漏之处望请斧正&#xff01; 是什么 AVLTree是一种自平衡的二叉搜索树。 它通过控制左右子树的高度差不超过1来调节平衡&#xff0c;从而提高搜索&#xff0c;插入和删除的效率。 实现 结构 AVLTree为了能自动调节平衡&#…

第十四章行为性模式—策略模式

文章目录 命令模式解决的问题结构实例存在的问题适用场景 JDK源码解析 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。行为型模式分为类行为模式…

Java阶段三Day07

Java阶段三Day07 文章目录 Java阶段三Day07Spring Security自定义UserDetails密码加密授权 JDK包结构文档注释规范JDK APIString APIString是不可变对象String常量池内存编码及长度使用indexOf实现检索使用substring获取子串trim去除两侧空白charAtstartsWith和endsWith大小写变…

3.1 矩阵连乘问题

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 学习目标&#xff1a; 如果我要学习动态规划中的矩阵连乘问题&#xff0c;我会采取以下学习方法&#xff1a; 1. **理解问题的背景和目标&#xff1a;首…

pytorch中分布式Collective通信API学习

随着各种大模型的不断迭出&#xff0c;感觉现在的NLP领域已经来到了大模型的时代。那么怎么来训练一个大模型呢&#xff1f;其中比较关键的一个技术基础就是分布式训练。在阅读GLM源码的时候&#xff0c;感觉其中的分布式训练代码不是很熟悉&#xff0c;看起来有点吃力&#xf…

【Nature 2023】Computational approaches streamlining drug discovery

今天为大家介绍的是一篇发表于“Nature”上面的综述文章“Computational approaches streamlining drug discovery”&#xff0c; Computer-aided drug discovery has been around for decades, although the past few years have seen a tectonic shift towards embracing com…

马尔科夫链 Markov chain

马尔科夫链 1.实例参考文献 马尔科夫链(Markov chain)及其模型在机器学习中应用广泛&#xff0c;本文结合一些参考资料做一个总结。 注意的是&#xff0c;本文中提到的马尔科夫链&#xff0c;要与隐马尔科夫(HMM)作以区分。 1.实例 设某人的训练计划中有以下四项运动&#x…

通过VCP(VMware Certified Professional)认证

文章目录 小结要求考试证书参考 小结 通过VCP(VMware Certified Professional)认证&#xff0c;去年参加了VMware的培训&#xff0c;今年通过VMware Certified Professional (2V0-21.20)的考试&#xff0c;拿到证书。 要求 需要参加VMware的指定的培训&#xff0c;我在去年五…

【数据结构】 数组 array

一、什么是数组 连续内存空间&#xff0c;存储的一组相同类型的元素 二、常用操作 1.原理 access&#xff1a;通过索引直接读取元素的值 时间复杂度&#xff1a;O(1) search&#xff1a;遍历查找某个元素 时间复杂度&#xff1a;O(N) insert&#xff1a;插入位置后的元素依…

Generative AI 新世界 | 大语言模型(LLMs)在 Amazon SageMaker 上的动手实践

在上一篇《Generative AI 新世界&#xff1a;大型语言模型&#xff08;LLMs&#xff09;概述》中&#xff0c;我们一起探讨了大型语言模型的发展历史、语料来源、数据预处理流程策略、训练使用的网络架构、最新研究方向分析&#xff08;Amazon Titan、LLaMA、PaLM-E 等&#xf…

QT超市管理系统

QT超市管理系统 前言QT介绍.pro文件主文件&#xff08;main函数&#xff09;窗口函数&#xff08;mainwindow&#xff09;用户登录&#xff08;user_login&#xff09;超市系统数据库&#xff08;maketsql&#xff09;超市商品的增删改查(dlg_addmak)收款码界面(picture)结语 前…

亚马逊云科技探路可持续,数智创未来

气候变化是全人类的共同挑战。应对气候变化&#xff0c;事关永续发展&#xff0c;关乎人类前途命运。2020年中国在联合国大会上亚马逊云科技作出庄严承诺&#xff0c;要在2030年实现碳达峰&#xff0c;2060年实现碳中和&#xff0c;这是个全球性的规划&#xff0c;也是个庄严的…

Yolov8轻量化:MobileNetV3,轻量级骨架首选

1.轻量化网络简介 轻量化网络是指在保持模型性能的前提下,尽可能减小模型参数量和计算量的神经网络。这种网络通常被用于在移动设备等资源受限的场景中部署,以提高模型的实时性和运行效率。 轻量化网络的设计思路可以包括以下几个方面: 去除冗余层和参数:通过剪枝、蒸馏等技…

MFC(五)菜单栏和工具栏

这篇文章我们来完成菜单设计和工具栏设计 菜单设计 1.点开资源视图>Menu>IDR_MAINFRAME 通过IDR_MAINFRAME我们可以编辑该资源定义&#xff0c;包括主菜单、其他菜单、工具栏等内容&#xff0c;IDR_MAINFRAME即为默认的主窗口的资源标识符 2.右键相应菜单>新插入&…

数据结构 --- 红黑树

红黑树也是一种自平衡的二叉搜索树&#xff0c;和AVL树比较&#xff0c;插入和删除时&#xff0c;旋转的次数更少。 红黑树的特性&#xff1a; 所有节点都有颜色&#xff1a;红色或者黑色所有null均视为黑色红色节点不能相邻根节点是黑色从根节点到任意一个叶子节点&#xff…

5分钟带你了解,SAS硬盘和SATA硬盘的区别?

一、SAS和SATA的关系 SAS的接口技术可以向下兼容SATA。具体来说&#xff0c;二者的兼容性主要体现在物理层和协议层的兼容。 在物理层&#xff0c;SAS接口和SATA接口完全兼容&#xff0c;SATA硬盘可以直接使用在SAS的环境中&#xff0c;从接口标准上而言&#xff0c;SATA是SAS的…