EPOLL原理学习

epoll 基础简介

相关函数介绍

epoll_create函数

epoll_create函数用于创建epoll文件描述符,改文件描述符用于后续的epoll操作,参数size目前还没有实际用处

#include <sys/epoll.h>

// return -> 返回epoll文件描述符
int epoll_create(int size);

epoll_ctl函数

epoll_ctl函数用于增加,删除,修改epoll事件,epoll事件(其实就是fd文件描述符)会存储在内核epoll结构体红黑树中。

#include <sys/epoll.h>

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
参数:
epfd: epoll文件描述符
op: 操作码 -> EPOLL_CTL_ADD:插入事件,EPOLL_CTL_DEL:删除事件,EPOLL_CTL_MOD:修改事件
fd: 事件绑定的套接字文件描述符
event:事件结构体

返回值: 成功 -> 0, 失败 -> -1

struct epoll_event结构体

struct eventpoll中有wq-等待队列(存储正在等待IO事件发生的线程),rdlist:就绪队列(双向链表实现)(存储已经就绪的IO事件),rbr:红黑树(存储注册到epoll实例上的文件描述符)

struct eventpoll { 	
    //sys_epoll_wait用到的等待队列
    wait_queue_head_t wq;
    //接收就绪的描述符都会放到这里
    struct list_head rdllist;
    //每个epoll对象中都有一颗红黑树
    struct rb_root rbr;
    ......
    }
#include <sys.epoll.h>

struct epoll_event {
    uint32_t events; // epoll事件,参考事件列表
    epoll_data_t data;
}

typedef union epoll_data {
    void *ptr;
    int fd; // 套接字文件描述符
    uint32_t u32;
    uint64_t u64;
} epoll_data_t;

epoll事件列表:

#include <sys/epoll.h>

enum EPOLL_EVENTS
{
    EPOLLIN = 0x001, // 读事件
    EPOLLPRI = 0x002,
    EPOLLOUT = 0x004, //写事件
    EPOLLEDNORM = 0x040, 
    EPOLLRDBAND = 0x080,
    ...
    EPOLLERR = 0x008, //出错事件
    EPOLLHUP = 0x010, // 出错事件
    ...
    EPOLLET = 1u << 31 // 边缘触发

epoll_wait函数

epoll_wait用于监听套接字事件,可以通过设置超时时间timeout来控制监听的行为为阻塞模式还是超时模式

  • 若队列非空,立即返回就绪事件
  • 若队列为空,进程进入阻塞状态,直到有事件发生或者超时
#include <sys/epoll.h>

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


参数:
epfd: epoll文件描述符
events: epoll事件数组
maxevents: epoll事件数组长度
timeout: 超时时间
小于0:一直等待
等于0:立即返回
大于0:等待超时时间返回,单位毫秒

LT模式和ET模式

LT模式:水平触发

socket都触发:socket接收缓冲区有数据,会一直触发epoll_wait EPOLLIN事件,直到数据被用户读取完

socket写触发:socket可写,会一直触发epoll_wait EPOLLOUT事件

ET模式: 边缘触发

socket读触发:socket数据从无到有,才会触发一次epoll_wait EPOLLIN事件

socket写触发:socket可写,会触发一次epoll_wait EPOLLOUT事件


总结

epoll 通过红黑树管理 fd、回调机制驱动事件通知、就绪队列快速返回有效事件,解决了 select/poll 的性能瓶颈。其设计核心是 “事件驱动” 和 “高效数据结构”,是 Linux 高并发编程的基石之一。

参考文章

epoll的底层实现原理_epoll底层原理-CSDN博客

linux epoll 机制


EPOLL原理学习
https://blog.mufen.site/2025/02/22/EPOLL原理学习/
作者
mufen
发布于
2025年2月23日
许可协议