nginx基于epoll模型如何实现高效事件驱动流程?
- 内容介绍
- 文章标签
- 相关推荐
本文共计5209个文字,预计阅读时间需要21分钟。
一般而言,这个epoll句柄在程序的整个运行周期中只会有一个,类似于nginx的每个worker进程只维护一个epoll句柄。在创建完句柄之后,对于我们的程序监听的每个端口,本质上都是一个文件描述符,这个文件描述符上可以发生accept事件,也就是可以直接接收客户端的请求。
相关推荐:《Nginx教程》
1. epoll模型介绍
在介绍nginx的实现原理之前,我们首先需要介绍一下epoll模型的基本使用方式。epoll在使用的时候主要有三个方法:
// 创建epoll句柄 int epoll_create(int size); // 往epoll句柄中添加需要进行监听的文件描述符 int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event); // 等待需要监听的文件描述符上对应的事件的发生 int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout);
首先,我们会调用epoll_create()方法创建一个epoll实例的句柄,可以将这里的句柄理解为一个eventpoll结构体实例,而这个结构体中有一个红黑树和一个队列,红黑树中主要存储需要监听的文件描述符,而队列则是在所监听的文件描述符中有指定的事件发生时就会将这些事件添加到队列中,如下图所示为eventpoll的示意图:
一般来说,这个epoll句柄在程序的整个运行周期中只会有一个,比如nginx每个worker进程就都只维护了一个epoll句柄。在创建完句柄之后,对于我们的程序监听的每一个端口,其实本质上也都是一个文件描述符,这个文件描述符上是可以发生Accept事件,也即接收到客户端请求的。
本文共计5209个文字,预计阅读时间需要21分钟。
一般而言,这个epoll句柄在程序的整个运行周期中只会有一个,类似于nginx的每个worker进程只维护一个epoll句柄。在创建完句柄之后,对于我们的程序监听的每个端口,本质上都是一个文件描述符,这个文件描述符上可以发生accept事件,也就是可以直接接收客户端的请求。
相关推荐:《Nginx教程》
1. epoll模型介绍
在介绍nginx的实现原理之前,我们首先需要介绍一下epoll模型的基本使用方式。epoll在使用的时候主要有三个方法:
// 创建epoll句柄 int epoll_create(int size); // 往epoll句柄中添加需要进行监听的文件描述符 int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event); // 等待需要监听的文件描述符上对应的事件的发生 int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout);
首先,我们会调用epoll_create()方法创建一个epoll实例的句柄,可以将这里的句柄理解为一个eventpoll结构体实例,而这个结构体中有一个红黑树和一个队列,红黑树中主要存储需要监听的文件描述符,而队列则是在所监听的文件描述符中有指定的事件发生时就会将这些事件添加到队列中,如下图所示为eventpoll的示意图:
一般来说,这个epoll句柄在程序的整个运行周期中只会有一个,比如nginx每个worker进程就都只维护了一个epoll句柄。在创建完句柄之后,对于我们的程序监听的每一个端口,其实本质上也都是一个文件描述符,这个文件描述符上是可以发生Accept事件,也即接收到客户端请求的。

