Epoll 小结(Nginx)

本文详细介绍了epoll的工作原理及使用方法,包括epoll的数据结构、创建与关闭、事件添加、监听事件的操作流程,并解释了LT与ET两种模式的区别及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 数据结构

//表示一个要监听的事件
//其中events表示监听的标志位 EPOLLIN  EPOLLOUT
//表示被触发后的data
struct epoll_event{
    uint32_t events;
    epoll_data_t data;
}
//其中只有ptr数据结构比较重要
typedef union epoll_data{
    void *ptr;
    int fd;
}

在nginx的实现,

struct epoll_event e;//定义需要监听的事件
e.events = 传进来的值 ;//用来表示监控输入还是输出
e.data.ptr = connection;//当有事件触发时,获取得到data.ptr从而得到连接

2. epoll create/close

int epoll_create(int size)// size预估事件多少
                          // 返回epoll的fd

epoll_close(efd);

3. 添加事件

int epoll_ctr(int efd, int op, int fd , struct epoll_event *event)
//efd 由epoll_create创建的fd
//op  分为3种操作,EPOLL_CTL_ADD EPOLL_CTL_MOD EPOLL_CTL_DEL
//event 添加需要监控的事件, 数据结构如上。

4. 监听事件

int epoll_wait(int efd, struct epoll_event *event, int maxeevents, int timeout)
//efd 由epoll_create创建的fd
//timeout 为一次监听的间隔
//当有事件触发 返回int 表示事件个数,event里存储的是触发的事件

5. LT && ET
LT 当缓冲区还有数据时会一直触发,支持阻塞和非阻塞两种
ET 只触发有数据那一次,只支持非阻塞
如果为非阻塞则需要

// 设置events 为ET
ep_event.events |= EPOLLET
// 获取得到原来的fd, 加上O_NONBLOCK
int old_flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, old_flags | O_NONBLOCK);

在nginx的中用到了这样的一个原理
不管在32bit 和 64bit机器上,指针的最后一位都是0, 在事件触发之后, 先通过 e.data.ptr得到conn的指针,指针的最后一位有个instance,指针的read 或者 write中有个instance,两个instance 来对比,一致表示是有效连接

### Nginxepoll 的工作原理 Nginx 使用 Linux 内核提供的 `epoll` 接口来实现高效的 I/O 多路复用机制。这种模型允许单个线程管理大量并发连接,从而显著提高性能[^1]。 #### epoll 工作流程概述 当 Nginx 启动时,会初始化并注册文件描述符到内核中的 `epoll` 实例上。每当有新的网络请求到达时,操作系统会通知 Nginx 哪些套接字已准备好读取或写入数据。这种方式避免了传统轮询方式带来的高 CPU 占用率问题[^2]。 具体来说,在 Nginx 源码中有一个名为 `ngx_event_epoll_module` 的模块专门用于处理基于 `epoll` 的事件驱动逻辑[^3]。该模块内部维护了一个红黑树结构的数据表,记录着所有正在被监控的 socket 连接状态变化情况。 ```c // 示例代码片段展示如何创建监听端口 ngx_listening_t * ngx_create_listening(ngx_conf_t *cf, struct sockaddr *sockaddr, socklen_t socklen) { ... ls = ngx_array_push(&cf->cycle->listening); ... } ``` 这段 C 语言函数展示了 Nginx 如何设置服务器监听端口的过程的一部分[^4]。 ### 配置 Nginx 使用 Epoll 实际上,默认情况下如果是在支持的操作系统环境下(如Linux),Nginx 就已经自动选择了最优的事件处理器——即对于大多数现代 Linux 发行版而言就是 `epoll` 。因此通常不需要特别指定配置项启用此功能。 不过为了确保使用的是 `epoll` ,可以在编译安装 Nginx 之前确认 configure 脚本选项里包含了 `--with-select_module --with-poll_module` 参数;尽管如此做主要是为了让那些不支持更先进技术的老平台也能正常工作而不是强制切换回旧有的 select 或 poll 方法。 另外值得注意的一点是,虽然可以通过调整 worker_processes 和 worker_connections 等参数间接影响到 `epoll` 表现,但这并不改变底层采用哪种多路复用机制的事实。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值