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()等待并处理事件。
- Nginx event核心模块之epoll模块详解(一)
- Nginx event核心模块之epoll模块详解(二)
- Nginx event核心模块之epoll模块详解(三)
- Nginx event核心模块之process部分详解(四)
- nginx 源码学习笔记(二十二)—— event 模块(三) ——epoll模块
- nginx 源码学习笔记(二十二)—— event 模块(三) ——epoll模块
- Nginx学习之七-模块ngx_epoll_module详解(epoll机制在nginx中的实现)
- Nginx学习之七-模块ngx_epoll_module详解(epoll机制在nginx中的实现)
- Nginx源码分析 - Event事件篇 - epoll事件模块
- Nginx的epoll模块
- Nginx event 模块分析
- nginx中的event模块
- nginx event 模块解析
- Nginx Event模块
- nginx 重中之重 event 模块
- nginx http核心模块指令(一)
- nginx学习(四) event模块
- 【Nginx】核心模块
- 利用jquery的ajax提交获得文件下载
- Oracle的Redo的作用及原理
- Ubuntu使用FTP时显示500 Illegal PORT command
- Mindscape WPF Elements使用教程:排序、过滤和分组
- iBatis入门例子
- Nginx event核心模块之epoll模块详解(一)
- Java异常处理的陋习展播
- 感受
- Address already in use: JVM_Bind(端口冲突)
- 大小端测试
- Android中正确自适应屏幕翻转
- 堆栈与函数调用
- Eclipse的版本历史
- 总结用cygwin+eclipse+NDK编译hellojni的详细步骤,以及所遇到问题的解决方法