=====完成并行处理请求的三种方式=====
1、多进程方式(apache)
服务器接收到一个客户端,主进程生成一个子进程和客户端建立连接,进行交互。连接断开,子进程结束
优点:设计实现简单,子进程之间相互独立,处理请求过程中彼此不受干扰。某个子进程产生问题时,不容易影响到其他进程,保证了服务的稳定性。退出时,占用资源会被系统回收,也不会留下任何垃圾。
缺点:操作系统产生一个子进程,需要进行内存复制等操作,资源和时间上会产生额外开销。web服务器接收到大量请求时,会对系统资源造成压力,导致系统性能下降

2、多线程方式(IIS)
服务器接收到一个客户端时,会由服务器主进程派生一个线程出来和该客户端进行交互
优点:操作系统产生线程的开销远远小于产生一个进程的开销,很大程度上减轻了Web服务器对系统资源的要求。使用线程进行任务调度,开发方面遵行一定标准,相对来说比较规范和有利于协作
缺点:多个线程位于同一个进程,可以访问同样的内存空间,彼此之间相互影响。同时,开发过程中不可避免的要由开发者自己对内存进行管理,增加了出错的风险,积小成多,可能最终对整个服务器产生重大影响。

3、异步方式(Nginx:异步非阻塞)
同步和异步时描述通信模式的概念
同步 :发送方发送请求后,需要等待接收方发回响应后,才接着发送下个请求
异步 :发送方发送请求后,不等待接收方发回响应,继续发送下个请求
阻塞和非阻塞时描述进程处理调用的方式,网络通信中,主要指网络套接字Socket的阻塞和非阻塞方式,而Socket的实际就是I/O操作
阻塞 :调用结果返回前,之前线程从运行状态被挂起,等到调用结果返回后,才进入就绪状态,获取CPU继续执行(接收方)
非阻塞 :调用结果不能立刻返回,当前线程也不会被挂起,立即返回执行下一个调用。(接收方)

=====nginx如何处理请求=====

                              worker_process(异步非阻塞)

master process worker_process(异步非阻塞)

                              worker_process(异步非阻塞)

工作进程接收到客户端请求后,调用I/O进行处理,如果不能立即得到结果,就去处理其他请求。客户端在此期间也无需等待响应,可以去处理其他事情。当I/O调用返回结果时,就会通知此工作进程。该工作进程得到通知,暂时挂起当前处理的事务,去响应客户端的请求。

=====nginx事件处理机制=====
I/O调用把自己的状态通知给工作进程的两种方式:
1、工作进程在进行其他工作的过程中隔一段时间就去检查一下I/O运行状态,如果完成就去响应客户端,如果未完成,就继续正在进行的工作
2、I/O调用在完成后主动通知工作进程。select/poll/epoll/kqueque等这样的系统调用就是用来支持这种方式。这些系统调用,也常被称为事件驱动模型。

=====nginx事件驱动模型=====
Nginx服务器响应和处理Web请求的过程,就是基于事件驱动模型的,包含事件收集器,事件发送器,事件处理器等三部分基本单元。重点介绍一下事件处理器,我们在编写服务器处理模型程序时,基于事件驱动模型,目标对象中的事件处理器可以有以下几种实现方法:
1、事件发送器每传递过来一个请求,目标对象就创建一个新的进程,调用事件处理器来处理该请求。
--实现起来简单,但创建新的进程开销比较大,导致服务器性能差
2、事件发送器每传递过来一个请求,目标对象就创建一个新的线程,调用事件处理器来处理该请求。
--涉及到线程同步,可能会面临死锁、同步等一系列问题,编码比较复杂
3、事件发送器每传递过来一个请求,目标对象就将其放入一个待处理事件列表,使用非阻塞I/O方式调用事件处理器来处理该请求
--编码和逻辑都比前面两种复杂,但大多网络服务器都采用此方式,逐渐形成了所谓的“事件驱动处理库”。事件驱动处理库又被称为多路IO复用方法,最常见是以下三种:select模型,poll模型,epoll模型。另外,还支持其他模型。

select 库
Linux和Windows平台都支持的基本事件驱动模型库。创建关注事件的描述符集合。对一个描述符关注读事件、写事件以及异常事件,要创建三类事件描述符集合。调用底层提供的select()函数,等待时间发生(select的阻塞与是否设置非阻塞I/O没有关系),轮询所有事件描述符集合中的每一个事件描述符,检查是否有相应事件发生,如果有,就进行处理

poll库
Linux平台的基本事件驱动模型,Windows不支持。与select库基本工作方式相同,都是创建一个关注事件的描述符集合,再去等待这些事件发生,如何再轮询描述符集合,检查有没有时间发生,有就处理。
区别在于,select库创建了3个描述符集合,需要分别轮询这3个集合。poll库只需要创建一个集合,每个描述符对应的结构上分别设置读、写、异常事件。最后轮询的时候,可以同时检查这3种事件是否发生,是select库的优化实现

epoll库
Nginx服务器支持的高性能事件驱动库之一,公认的非常优秀事件驱动模型,和poll,select有很大的不同。
以上的两个库,在描述符表多的应用中,效率显得比较低下。好的做法是,把描述符列表的管理交给内核负责,一旦有某种事件发生,内核把发生事件的描述符列表通知给进程,避免轮询整个描述符列表,epoll库就是这种模型。
epoll库通过相关调用通知内核创建一个有N个描述符的事件列表;然后,给这些描述符设置所关注的事件,并把它添加到内核事件列表中去,在具体的编码过程中也可以通过相关调用对事件列表中的描述符进行修改和删除。完成设置后,epoll库就开始等待内核通知事件发生。某一事件发生后,内核将发生事件的描述符列表上报给epoll库。得到事件列表的epoll库,就可以进行事件处理了。

=====nginx服务器架构=====
nginx服务器的结构大致分为主进程、工作进程、后端服务器和缓存等部分。
nginx服务器的三大类进程:主进程、工作进程、缓存索引重建及管理进程
服务启动后,产生一个master process,主进程执行一系列工作后产生一个或者多个worker processes。
主进程主要进行nginx配置文件解析、数据结构初始化、模块配置和注册、信号处理、网络监听生成、工作进程生成和管理等工作。
工作进程主要进行进程初始化、模块调用和请求处理等工作,是nginx服务器提供服务的主体


芒果牛奶
1 声望0 粉丝

运维背锅之路