Linux初识epoll

简介: 简答epoll介绍


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。


概述

  • eventpoll
  • 高效:

    • 底层为红黑树
    • 使用回调机制而不是线性扫描,处理效率不会随着集合的变大而下降
    • 使用共享内存(内核与用户区之间),避免了频繁拷贝
  • 没有最大文件描述符限制:将用户所关心的文件描述符上的事件放在内核的一个事件表中,同时epoll需要一个额外的文件描述符来唯一标识内核中的这个事件表
  • 线程安全,无需进行共享资源管理

函数

#include <sys/epoll.h>
// 创建epoll实例
int epoll_create(int size);
  • size参数无实际意义
  • 返回内核中epoll事件表的文件描述符
#include <sys/epoll.h>
// 管理epoll红黑树(添加, 修改, 删除)
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
  • fd:要操作的文件描述符
  • op:option

    • EPOLL_CTL_ADD: 向事件表中注册fd上的事件
    • EPOLL_CTL_MOD: 修改fd上的注册事件
    • EPOLL_CTL_DEL: 删除fd上的注册事件
  • event:
struct epoll_event
{
  __uint32_t events;  // epoll事件
  epoll_data_t data;  // 用户数据
}
  • events:描述用户事件

    • EPOLLIN:读事件
    • EPOLLET:边缘触发模式
    • EPOLLONESHTO:在注册了此事件的文件描述符上最多触发一个可读/可写/异常事件(进一步减少可读,可写和异常等事件被触发的次数)
  • data:用于存储用户数据:其为联合体,有四种方式描述用户,最常用的为fd
typedef union epoll_data
{
  void *ptr;
  int fd;
  uint32_t u32;
  uint43_t u64;
}epoll_data_t;
#include <sys/epoll.h>
// 检测epoll树中是否有就绪的文件描述符
int epoll_wait(int epfd, struct epoll_event *event, int maxevents, int timeout);
  • 主要接口
  • epoll_wait如果检测到事件,就将所有就绪的事件从内核表中复制到第二个参数event指向的数组中(这个数组只用于输出就绪事件),极大提高了效率
  • 处理epoll返回的就绪文件描述符:
int ret = epoll_wait(epfd, events, MAX_EVENT_NUMBER, -1);
// 仅遍历ret个文件描述符
for(int i = 0; i < ret; i++) {
  int sockfd = events[i].data.fd;
}

工作模式

水平模式

  • level trigger(LT)
  • 默认工作方式,支持blockno-block socket
  • 通知次数多,易于编写,但效率低
  • 读事件:

    • 文件描述符对应的读缓冲区还有数据,读事件就会被触发,epoll_wait()解除阻塞
    • 读缓冲区一次没有读完,读事件一直触发
    • 读数据是被被动的,必须通过读事件才知道有数据到达了,因此对于读事件的检测是必须
  • 写事件:

    • 如果文件描述符对应的写缓冲区可写,写事件就会被触发,epoll_wait()解除阻塞
    • 如果写缓冲区没有写满,写事件一直触发
    • 写数据是主动的,并且写缓冲区一般都是可写的(未满),所以对写事件的检测不是必须

边缘触发

  • edge trigger(ET)
  • 高速工作模式,只支持no-block socket
  • 通知次数少(只有新事件才会通知,降低了同一事件被重复触发的次数),编写较难,但效率高
  • 读事件:

    • 当读缓冲区有新的数据进入,读事件触发一次,没有新数据不会触发事件
    • 如果数据没有被全部取走,并且没有新数据进入,读时间不会再次出发,只通知一次
    • 如果数据被全部取走或只取走一部分,此时有新数据进入,读事件触发,并且只通知一次
  • 写事件:

    • 当写缓冲区可写,写事件只触发一次
    • 写缓冲区从不满到被写满,期间写事件只触发一次
    • 写缓冲区从满到不满,状态变为可写,写事件只会被触发一次

refer

目录
相关文章
|
6月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
112 0
|
6月前
|
网络协议 Linux Python
Python网络编程基础(Socket编程)epoll在Linux下的使用
【4月更文挑战第12天】在上一节中,我们介绍了使用`select`模块来实现非阻塞IO的方法。然而,`select`模块在处理大量并发连接时可能会存在性能问题。在Linux系统中,`epoll`机制提供了更高效的IO多路复用方式,能够更好地处理大量并发连接。
|
监控 网络协议 Java
I/O多路复用【Linux/网络】(C++实现select、poll和epoll服务器)(上)
I/O多路复用【Linux/网络】(C++实现select、poll和epoll服务器)
244 0
|
5天前
|
存储 JSON Java
细谈 Linux 中的多路复用epoll
大家好,我是 V 哥。`epoll` 是 Linux 中的一种高效多路复用机制,用于处理大量文件描述符(FD)事件。相比 `select` 和 `poll`,`epoll` 具有更高的性能和可扩展性,特别适用于高并发服务器。`epoll` 通过红黑树管理和就绪队列分离事件,实现高效的事件处理。本文介绍了 `epoll` 的核心数据结构、操作接口、触发模式以及优缺点,并通过 Java NIO 的 `Selector` 类展示了如何在高并发场景中使用多路复用。希望对大家有所帮助,欢迎关注威哥爱编程,一起学习进步。
|
27天前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
22 0
Linux C/C++之IO多路复用(poll,epoll)
|
5月前
|
消息中间件 存储 监控
实战Linux I/O多路复用:借助epoll,单线程高效管理10,000+并发连接
本文介绍了如何使用Linux的I/O多路复用技术`epoll`来高效管理超过10,000个并发连接。`epoll`允许单线程监控大量文件描述符,显著提高了资源利用率。文章详细阐述了`epoll`的几个关键接口,包括`epoll_create`、`epoll_ctl`和`epoll_wait`,以及它们在处理并发连接中的作用。此外,还探讨了`epoll`在高并发TCP服务场景的应用,展示了如何通过`epoll`和线程/协程池来构建服务框架。
566 8
|
4月前
|
Linux 网络安全 虚拟化
Ngnix04系统环境准备-上面软件是免费版的,下面是收费版的,他更快的原因使用了epoll模型,查看当前Linux系统版本, uname -a,VMWARE建议使用NAT,PC端电脑必须使用网线连接
Ngnix04系统环境准备-上面软件是免费版的,下面是收费版的,他更快的原因使用了epoll模型,查看当前Linux系统版本, uname -a,VMWARE建议使用NAT,PC端电脑必须使用网线连接
|
6月前
|
监控 Linux
Linux的epoll用法与数据结构data、event
Linux的epoll用法与数据结构data、event
81 0
|
存储 监控 网络协议
I/O多路复用【Linux/网络】(C++实现select、poll和epoll服务器)(下)
I/O多路复用【Linux/网络】(C++实现select、poll和epoll服务器)
213 0
|
6月前
|
监控 网络协议 Linux
Linux I/O多路复用深入解析:从select到epoll的演进之路
Linux I/O多路复用深入解析:从select到epoll的演进之路
442 0