epoll机制

目录

预备知识

文件描述符file descriptor

套接字socket

epoll机制发展过程

概述

epoll系统调用

epoll事件

epoll工作模式

更进一步

epoll实例

epoll句柄

epoll事件注册函数

服务端使用epoll步骤


预备知识

文件描述符file descriptor

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

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

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

套接字socket

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

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

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

分类:阻塞与非阻塞socket

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

epoll机制发展过程

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

概述

epoll用于高效地监视大量文件描述符上的事件,以便及时响应并处理这些事件。是一种I/O多路复用机制,用于管理大量的网络连接。是Linux系统中网络编程中最常用的一种机制之一。

epoll机制的核心是epoll系统调用和epoll事件,区别是:epoll系统调用是用于向操作系统内核注册文件描述符和事件类型的接口;epoll事件则是在文件描述符上发生I/O事件时向程序发送的通知。

epoll机制支持三种模式:LT(Level Triggered)、ET(Edge Triggered)和EPOLLEXCLUSIVE。LT模式是默认模式,当文件描述符就绪时,epoll会一直通知程序,直到程序采取适当的措施。ET模式是一种更高效的模式,当文件描述符就绪时,epoll只通知程序一次,如果程序没有及时采取适当的措施,则不会再次通知程序。EPOLLEXCLUSIVE模式是一种排他模式,它可以将epoll事件设置为只对当前进程可见,从而避免多个进程同时处理同一事件的情况。

使用epoll机制可以提高网络编程的性能和可靠性。与传统的select和poll机制相比,epoll支持更大的文件描述符集合和更高的并发性能,同时还可以避免由于事件队列被阻塞而导致的效率低下的问题。因此,在高并发的网络编程中,epoll机制是一种非常重要和常用的技术

epoll系统调用

用于向操作系统内核注册文件描述符和事件类型,以便操作系统内核可以监控这些文件描述符上的I/O事件,并向程序发送相应的通知。

epoll事件

当文件描述符上发生I/O事件时,操作系统内核向程序发送的通知。通常,epoll事件包括文件描述符的状态,例如可读、可写或出现错误等。epoll事件是一种用于通知程序有关文件描述符上I/O事件发生的机制。

事件类型包括以下三种:

  1. EPOLLIN:表示文件描述符上有数据可读取。这个事件通常与LT(Level Triggered)模式一起使用,当文件描述符上有数据可读取时,epoll会一直通知程序,直到程序采取适当的措施。

  2. EPOLLOUT:表示文件描述符可以写入数据。这个事件通常与ET(Edge Triggered)模式一起使用,当文件描述符上可以写入数据时,epoll只通知程序一次,如果程序没有及时采取适当的措施,则不会再次通知程序。

  3. EPOLLERR:表示文件描述符上出现错误。当文件描述符上出现错误时,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还有很多其他事件,本项目为简洁明了,不介绍)。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坠金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值