当前位置: 首页 > news >正文

epoll机制

预备知识

文件描述符file descriptor

文件描述符是Linux系统中对文件、套接字等I/O资源的抽象,每个打开的文件或套接字都有一个唯一的文件描述符。应用程序可以使用文件描述符来读写文件或进行网络通信。

epoll允许程序监控多个文件描述符,以便在这些描述符中的任何一个上发生I/O事件时进行处理。在epoll中,文件描述符通常被标记为“可读”、“可写”或“就绪”状态

就绪=可读 并且 可写。这种状态通常在使用epoll的边缘触发模式时使用,它只会通知程序发生了状态改变的文件描述符,而不是所有可读或可写的文件描述符。

套接字socket

定义:套接字通常指的是网络套接字,它包括一个IP地址和一个端口号,用于标识网络上的一台计算机上的一个进程。可以用于在不同进程之间传输数据,无论这些进程在同一台计算机上还是在不同的计算机上

方法:在套接字通信中,一个进程可以创建一个套接字,并将其绑定到一个IP地址和端口号上。然后它可以通过这个套接字向另一个套接字发送数据,或者从另一个套接字接收数据。

例:Web浏览器使用套接字向Web服务器请求网页,邮件客户端使用套接字向邮件服务器发送和接收电子邮件。

分类:阻塞与非阻塞socket

  • 阻塞: 当试图对该文件描述符进行读写时,如果当时没有数据可读,或者暂时不可写,程序就进入等待状态,直到有东西可读或者可写为止。
  • 非阻塞: 如果没有数据可读,或者不可写,读写函数马上返回,而不会等待。

epoll机制

(21条消息) 多路复用机制_坠金的博客-CSDN博客

epoll

epoll工作模式:

  • 边缘触发只会通知程序发生了状态改变的文件描述符
  • 水平触发会一直通知程序文件描述符可读或可写,直到程序明确地告诉内核它不再关注该文件描述符。

区别:

  • 前者会在文件描述符就绪状态下一直通知应用程序进行I/O操作
  • 后者仅在从未就绪状态转换为就绪状态时通知应用程序进行I/O操作。

应用:

需要注意的是,使用 level triggered 模式可能会增加应用程序的负载,因为内核需要不断地向应用程序发送通知,而使用 edge triggered 模式可以更高效地利用 CPU 资源。因此,在一般情况下,推荐使用 edge triggered 模式,因为它能更高效地处理事件。

然而,在以下几种情况下,使用 level triggered 可能更为合适:

  • 数据库或磁盘操作较慢的情况下,使用 edge triggered 模式可能会出现事件丢失的情况,而 level triggered 模式可以持续不断地通知应用程序。
  • 在应用程序中使用了多个线程或进程,并且每个线程或进程都需要处理同一个文件描述符的情况下,使用 level triggered 模式会更方便管理。
  • 在使用 epoll 时,如果你不确定应该使用哪种模式,可以先使用 level triggered 模式进行测试,以确保应用程序正确处理了所有的事件。

epoll实例

epoll实例可以看作是一个事件集合,它包含多个事件。每个事件描述了一个文件描述符上的一种特定事件类型(例如,可读、可写、出错等等),以及当该事件发生时应该采取的操作。应用程序可以使用epoll实例来等待这些事件的发生,并且在它们发生时进行处理。

epoll句柄

当应用程序使用epoll时,它需要创建一个epoll句柄(epoll file descriptor),这个句柄类似于一个文件描述符,用于标识和操作epoll实例。

epoll事件注册函数

epoll提供了三个事件注册函数:epoll_create()、epoll_ctl()和epoll_wait()。

epoll_create()

创建一个epoll实例,返回一个文件描述符。

int epoll_create(int size)

其中size参数指定epoll实例支持的文件描述符数量

epoll_ctl()

将一个文件描述符添加到epoll实例的事件集合中,或者从事件集合中删除一个文件描述符。

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

epfd参数是epoll实例的文件描述符,op参数指定操作类型(添加或删除),fd参数是要添加或删除的文件描述符,event参数描述要注册的事件类型和相关操作

epoll_wait()

等待文件描述符上的事件发生,返回所有发生事件的文件描述符。

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

与其他I/O多路复用技术相比,epoll机制具有更高的效率和更好的扩展性。因为epoll_wait()函数仅会返回就绪的文件描述符,而不会返回所有的文件描述符,从而减少了内核态和用户态之间的数据复制。而且,epoll机制允许应用程序一次性监视大量的文件描述符,因此可以有效地支持高并发的网络应用。

服务端使用epoll步骤

  1. 调用epoll_create函数在Linux内核中创建一个事件表;
  2. 然后将文件描述符(监听套接字listener)添加到所创建的事件表中;
  3. 在主循环中,调用epoll_wait等待返回就绪的文件描述符集合;
  4. 分别处理就绪的事件集合,本项目中一共有两类事件:新用户连接事件和用户发来消息事件(epoll还有很多其他事件,本项目为简洁明了,不介绍)。
http://www.lryc.cn/news/26192.html

相关文章:

  • Java使用不同方式获取两个集合List的交集、补集、并集(相加)、差集(相减)
  • 【Android笔记80】Android之Retrofit适配器和文件上传下载
  • Nodejs模块化
  • C++STL基础
  • 数学建模经验【更新中】
  • 【python学习笔记】:Excel 数据的封装函数
  • 如何获取或设置CANoe以太网网卡信息(GET篇)
  • “终于我从字节离职了...“一个年薪50W的测试工程师的自白...
  • 【Spring】八种常见Bean加载方式
  • 第五回:样式色彩秀芳华
  • 关于@Test单元测试
  • 【项目实战】WebFlux整合r2dbc-mysql实战
  • go版本分布式锁redsync使用教程
  • 大数据之Hudi数据湖_大数据治理_简介_发展历史_特性_应用场景---大数据之Hudi数据湖工作笔记0001
  • 射频功率放大器基于纵向导波的杆状构件腐蚀诊断方法的研究
  • Leedcode 二分查找 理解1
  • 【告别篇】大家好,再见了,我转行了,在筹备创业
  • Java——岛屿数量
  • 《代码整洁之道》笔记
  • 个人网站如何集成QQ快捷登录功能?
  • 从工厂打螺丝到月薪18k测试工程师,我该满足吗?
  • 【相关分析-高阶绘图】MATLAB实现皮尔逊相关分析-散点直方图
  • Spark性能优化二 Shuffle机制分析
  • 软测入门(四)Appium-APP移动测试基础
  • 华为OD机试用Python实现 -【集五福】 |老题且简单
  • Typro使用以及安装教程来啦
  • 武汉凯迪正大KD305系列智能数字绝缘电阻测试仪
  • 如何使用码匠连接 Redis
  • 防止网络攻击的10大网络安全措施
  • LeetCode 面试题 05.02. 二进制数转字符串