Nginx event核心模块之epoll模块详解(一)

来源:互联网 发布:eclipse 怎么编译java 编辑:程序博客网 时间:2024/05/16 12:44

Nginx event核心模块之epoll模块详解(一)

       在介绍epoll之前,先介绍下两个重要的数据结构,一个是ngx_event_t,另外一个是ngx_connection_t。这两个数据结构是关于事件和连接的。以下是两个数据结构的代码:

typedef void(*ngx_event_handler_pt)(ngx_event_t *ev);
typedef void (*ngx_connection_handler_pt)(ngx_connection_t *c);

struct ngx_event_s {
void *data;//在代码中经常用于存放ngx_connection_t数据信息

unsignedwrite:1;

unsignedaccept:1;

unsignedactive:1;

……….

ngx_event_handler_pthandler;//事件处理函数

…….

#if(NGX_THREADS)//如果有线程处理,线程互斥以及处理信息

unsignedlocked:1;

unsignedposted_ready:1;
unsigned posted_timedout:1;
unsigned posted_eof:1;

……
};

typedef struct ngx_event_s ngx_event_t;

structngx_connection_s {
void *data;
ngx_event_t *read;//读事件
ngx_event_t *write;//写事件

ngx_socket_tfd;//connection文件描述符

……..

structsockaddr *sockaddr;//连接的socket信息
socklen_t socklen;
ngx_str_t addr_text;

……

};

typedef struct ngx_connection_s ngx_connection_t;

由上面两个数据结构中,我们发现关于EVENT事件的有相应的处理函数,而关于CONNECTION连接的没有相应的处理函数,ngx_connection_handler_pt函数指针定义的函数在structngx_listening_s数据结构中有定义。先在这里就不讨论了。

nginx epoll工作流程:

1.http模块创建listen数据,并初始化accept后处理句柄函数。 listen_fd= socket(...); ,setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR,...),setnonblocking(listen_fd),listen(listen_fd,...),listen_handler=......

2.进程模块通过fork()生产进程数,进程数可以在nginx.conf中设置,我们一般根据服务器实际的CPU核数来配置,主进程变成一个Watcher,只做子进程维护和信号处理等全局性工作。

3.每一个子进程(Worker_process)中,都会创建自己的event模块,并进行event_process_and_timer循环,其中会调用epoll模块中的epoll_process模块进行侦听,当然在进行循环前都会创建属于自己的epoll,epoll_fd = epoll_create(...);struct epoll_eventeventlist[nevents],接着将listen_fd加入epoll_fd中。最后再进入大循环,epoll_wait()等待并处理事件。

 

原创粉丝点击