1.nginx源码分析--master和worker进程模型
2.select,poll,epoll的区别以及使用方法
3.UNIX环境高级编程UNIX网络编程12这三本书先看哪个一个?网络编程和web编程疑惑,pythontornado源码学习
nginx源码分析--master和worker进程模型
一、Nginx整体架构
正常执行中的nginx会有多个进程,其中最基本的朗读功能源码是master process(主进程)和worker process(工作进程),还可能包括cache相关进程。
二、核心进程模型
启动nginx的主进程将充当监控进程,主进程通过fork()产生的子进程则充当工作进程。
Nginx也支持单进程模型,此时主进程即是工作进程,不包含监控进程。
核心进程模型框图如下:
master进程
监控进程作为整个进程组与用户的交互接口,负责监护进程,会员权益源码不处理网络事件,不负责业务执行,仅通过管理worker进程实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。
master进程通过sigsuspend()函数调用大部分时间处于挂起状态,直到接收到信号。
master进程通过检查7个标志位来决定ngx_master_process_cycle方法的运行:
sig_atomic_t ngx_reap;
sig_atomic_t ngx_terminate;
sig_atomic_t ngx_quit;
sig_atomic_t ngx_reconfigure;
sig_atomic_t ngx_reopen;
sig_atomic_t ngx_change_binary;
sig_atomic_t ngx_noaccept;
进程中接收到的信号对Nginx框架的意义:
还有一个标志位:ngx_restart,仅在master工作流程中作为标志位使用,与信号无关。
核心代码(ngx_process_cycle.c):
ngx_start_worker_processes函数:
worker进程
worker进程主要负责具体任务逻辑,主要关注与客户端或后端真实服务器之间的数据可读/可写等I/O交互事件,因此工作进程的漫画源码教程阻塞点在select()、epoll_wait()等I/O多路复用函数调用处,等待数据可读/写事件。也可能被新收到的进程信号中断。
master进程如何通知worker进程进行某些工作?采用的是信号。
当收到信号时,信号处理函数ngx_signal_handler()会执行。
对于worker进程的工作方法ngx_worker_process_cycle,它主要关注4个全局标志位:
sig_atomic_t ngx_terminate;//强制关闭进程
sig_atomic_t ngx_quit;//优雅地关闭进程(有唯一一段代码会设置它,就是接受到QUIT信号。ngx_quit只有在首次设置为1时,才会将ngx_exiting置为1)
ngx_uint_t ngx_exiting;//退出进程标志位
sig_atomic_t ngx_reopen;//重新打开所有文件
其中ngx_terminate、ngx_quit、ngx_reopen都将由ngx_signal_handler根据接收到的信号来设置。ngx_exiting标志位仅由ngx_worker_cycle方法在退出时作为标志位使用。前端指标源码
核心代码(ngx_process_cycle.c):
select,poll,epoll的区别以及使用方法
在Linux网络编程中,I/O多路复用技术如select、poll和epoll,旨在提高服务器与多个客户端连接的并发处理能力。原生socket的阻塞特性限制了它无法同时处理多个请求。为了解决这个问题,我们有以下选项: 1. select:最早出现在年的4.2BSD中,它允许监控多个描述符,一旦就绪即通知程序。尽管跨平台支持好,但存在最大文件描述符数量(Linux默认)的限制,且随着文件描述符增多,陪诊源码复制开销和扫描所有socket的开销会增加。 2. poll:年System V Release 3引入,没有select的最大文件描述符限制。同样会复制大量描述符,开销随描述符数量线性增加。poll也采用水平触发机制,但处理大量就绪描述符时效率较低。 3. epoll:Linux 2.6及以后引入,是最高效的方法。epoll支持事件回调,减少拷贝开销,对大量描述符更友好。它支持水平触发和边缘触发,边缘触发理论上性能更高,但实现复杂。epoll_wait只需检查就绪链表,而不是遍历所有描述符,节省CPU时间。 总结来说,epoll通过内核回调机制,优化了描述符的管理,降低了开销,并提供了灵活性。使用epoll时,可以借助epoll_create、epoll_ctl和epoll_wait这三个核心函数,如在echo服务器的示例中操作。具体实现和详细机制请参考《select,poll,epoll的区别以及使用方法》文章及源代码。UNIX环境高级编程UNIX网络编程这三本书先看哪个一个?网络编程和web编程疑惑,pythontornado源码学习
接触Python Web开发一年,疑惑丛生,主要涉及进程、线程编程及网络编程。在实际项目中,应如何正确运用进程和线程?对网络编程的深入理解,特别是高性能服务器设计实现,感到困惑,尤其是面对Tornado服务器代码,难以理解。
关于UNIX环境高级编程、UNIX网络编程(卷1、2)这三本书的阅读顺序,应先从基础知识入手。推荐先阅读《图解TCP/IP》一书,把握面向连接与无连接、TCP粘包与UDP有界等核心概念。紧接着,深入学习Linux/Unix系统编程手册中关于socket的章节,这本书以超越apue的讲解方式,对socket、select、poll、epoll等关键概念进行了详细解析,有助于理解并发编程原理。
了解并阅读Tornado源码,这一阶段应较为轻松,因为之前对相关概念和原理已有基础理解。《Effective TCP/IP》一书则提供了更高级的指导,帮助深化对网络编程的理解。最后推荐阅读《UNIX网络编程》(卷1),尽管其内容丰富,但先阶段主要关注其基本网络模型的介绍,如多进程、多线程版本的echo服务器程序、非阻塞web客户端程序等,这有助于初步构建对网络编程的实践认知。
理解高性能服务器的实现,源码阅读是关键。例如,学习lighttpd的IO复用技术。在进程线程编程方面,理解操作系统级别的概念同样重要。网络编程确实涉及众多复杂概念,但通过持续学习和实践,能力将逐步提升。在自学过程中,任何疑惑与不解,欢迎向社区或专业人士求教,共同进步。