Nginx之因此为广大码农喜好,除了其高性能外,还有其优雅的系统架构。与Memcached的经典多线程模型相比,Nginx是经典的多进程模型。Nginx启动后以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程,具体以下图:html
图1 Nginx多进程模型nginx
master进程主要用来管理worker进程,具体包括以下4个主要功能:
(1)接收来自外界的信号。
(2)向各worker进程发送信号。
(3)监控woker进程的运行状态。
(4)当woker进程退出后(异常状况下),会自动从新启动新的woker进程。
woker进程主要用来处理网络事件,各个woker进程之间是对等且相互独立的,它们同等竞争来自客户端的请求,一个请求只可能在一个woker进程中处理,woker进程个数通常设置为机器CPU核数。git
对Nginx进程的控制主要是经过master进程来作到的,主要有两种方式:
(1)手动发送信号
从图1能够看出,master接收信号以管理众woker进程,那么,能够经过kill向master进程发送信号,好比kill -HUP pid用以通知Nginx从容重启。所谓从容重启就是不中断服务:master进程在接收到信号后,会先从新加载配置,而后再启动新进程开始接收新请求,并向全部老进程发送信号告知再也不接收新请求并在处理完全部未处理完的请求后自动退出。
(2)自动发送信号
能够经过带命令行参数启动新进程来发送信号给master进程,好比./nginx -s reload用以启动一个新的Nginx进程,而新进程在解析到reload参数后会向master进程发送信号(新进程会帮咱们把手动发送信号中的动做自动完成)。固然也能够这样./nginx -s stop来中止Nginx。github
Nginx采用异步非阻塞的方式来处理网络事件,相似于Libevent,具体过程以下图:缓存
图2 Nginx网络事件服务器
master进程先建好须要listen的socket后,而后再fork出多个woker进程,这样每一个work进程均可以去accept这个socket。当一个client链接到来时,全部accept的work进程都会受到通知,但只有一个进程能够accept成功,其它的则会accept失败。Nginx提供了一把共享锁accept_mutex来保证同一时刻只有一个work进程在accept链接,从而解决惊群问题。当一个worker进程accept这个链接后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开链接,这样一个完成的请求就结束了。网络
memcached是一款很是普及的服务器端缓存软件,memcached主要是基于Libevent库进行开发的。数据结构
Memcached主要是基于Libevent的事件库来实现网络线程模型的。
Memcached的网络线程模型主要涉及两个主要文件:memcached.c 和thread.c文件。
咱们这边主要分析tcp的模型。memcached也支持udp。多线程
1. memcached首先在主线程中会建立main_base,memcached的主线程的主要工做就是监听和接收listen和accpet新进入的链接。架构
2. 当memcached启动的时候会初始化N个worker thread工做线程,每一个工做线程都会有本身的LIBEVENT_THREAD数据结构来存储线程的信息(线程基本信息、线程队列、pipe信息)。worker thread工做线程和main thread主线程之间主要经过pipe来进行通讯。
3. 当用户有链接进来的时候,main thread主线程会经过求余的方式选择一个worker thread工做线程。
4. main thread会将当前用户的链接信息放入一个CQ_ITEM,而且将CQ_ITEM放入这个线程的conn_queue处理队列,而后主线程会经过写入pipe的方式来通知worker thread工做线程。
5. 当工做线程获得主线程main thread的通知后,就会去本身的conn_queue队列中取得一条链接信息进行处理,建立libevent的socket读写事件。
6. 工做线程会监听用户的socket,若是用户有消息传递过来,则会进行消息解析和处理,返回相应的结果。
流程图
详情见:http://www.lvtao.net/c/623.html
高并发服务器代码:https://github.com/manmao/Module/tree/master/mult_process_server