web服务器和客户端完成并行处理请求三大方式

从设计架构上来说,Nginx服务器是与众不同的。不同之处一方面提现在它的模块化设计,另一方面,也是更重要的一方面。体现在它对客户端请求的处理机制上。

Web服务器和客户端是一对多的关系,Web服务器必须有能力同时对多个客户端提供服务。一般来说,完成并行处理请求工作有三种方式:多进程方式、多线程方式和异步方式。

多进程方式

服务器每当接收到一个客户端时,就由服务器主进程生成一个子进程出来和该客户端建立连接进行交互,知道连接断开,改子进程就结束了。

多进程方式的优点在于,设计和实现相对简单,各个子进程之间相互独立,处理客户端请求的过程彼此不受到干扰,并且当一个子进程产生问题时,不容易将影响蔓延到其他进程中,这保证了提供服务的稳定性。当子进程退出时,其占用资源会被操作系统回收,也不会留下任何垃圾。而其缺点也是很明显的。操作系统中生成一个子进程需要进行内存复制等操作,在资源和时间上会产生一定的额外开销,因此,如果web服务器接受大量的并发请求,就会对系统资源造成压力,导致系统性能下降。

初期的Apache服务器就是采用这种方式对外提供服务的。为了应对大量并发请求,Apache服务器采用“”预生成进程”的机制对多进程方式进行了改进。“预生成进程”的工作方式很好理解。它将生成子进程的时机提前,在客户端请求还没到来之前就预先生成好,当请求到来时,主进程分配一个子进程和该客户端进行交互,交互完成后,该进程也不结束,而被主进程管理起来等待下一个客户端请求的到来。改进的多进程方式在一定程度上缓解了大量并发请求情形下web服务器对系统资源造成的压力。但是由于Apache服务器在最初的架构设计上采用了多进程方式,因此不能从根本上解决性能问题。

多线程方式

多线程和多进程的方式相似,它是指,服务器每当接收到一个客户端时,会由服务器主进程派生一个线程出来和该客户端进行交互。

优点:

由于操作系统产生一个线程的开销远远小于产生一个进程的开销,所以多线程方式在很大程度上减轻了web服务器对系统资源的要求。

该方式使用多线程进行任务调度,开发方面可以遵循一定的标准,这相对来说比较规范和有利于协作。

缺点:在线程管理方面,该方式有一定的不足。

多个线程位于同一个进程内,可以访问同样的内存空间,彼此之间相互影响;

在开发过程中,不可避免的要有开发者自己对内存进行管理,其增加了出错的风险。

服务器系统需要长时间连续不停的运转,错误的逐渐积累可能对整个服务器产生重大影响。

异步方式

异步方式是和多进程多线程方式完全不同的一种处理客户端请求的方式。在介绍该方式之前,我们先复习一下同步、异步以及阻塞和非阻塞的概念。

网络通信中的同步机制和异步机制是描述通信模式的概念。同步机制,是指发送方发送请求后,需要等待接收到接收方发回的响应后,才接着发送下一个请求;

异步机制,和同步机制正好相反,发送方在发送一个请求后,不等待接收方响应这个请求,就继续发送下一个请求。

在同步机制中,所有的请求在服务器端得到同步,发送方和接收方对请求的处理步调是一致的;在异步机制中,所有来自发送方的请求形成一个队列,接收方处理完成后通知发送方。

阻塞和非阻塞用来描述进程处理调用的方式,在网络通信中,主要指网络套接字Socket的阻塞和非阻塞方式。Socket的实质也就是IO操作。Socket的阻塞调用方式为,调用结果返回之前,当前线程从运行状态被挂起,一直等到调用结果返回之后,才进入就绪状态,获取cpu后继续运行。Socket的阻塞调用方式和非阻塞调用方式正好相反,在非阻塞方式中,如果调用结果不能马上返回,当前线程也不会被挂起,而是立即返回执行下一个调用。

在网络通信中,经常可以看到有人将同步和阻塞等同,异步和非阻塞等同。事实上,这两对概念有一定的区别,不能混淆。两对概念的组合,就会产生四个新的概念,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞

同步阻塞方式:发送方向接收方发送请求后,一直等待响应。接收方接收请求后进行的IO操作如果不能马上得到结果,就一直等到返回结果后,才响应发送发,期间不能做任何事情。这种方式实现简单,但是效率不高

同步非阻塞方式:发送发向接收方发送请求后,一直等待响应。接收方接收请求后进行的IO操作如果不能马上的到结果,也可以继续往下调用去做其他事情,但由于没有结果返回会,不响应,直到结果返回了才响应发送方。实际上并不会使用这种方式。

异步阻塞方式:发送方向接收方发送请求后,不用等待响应,可以接着进行其他工作;接收方不能马上返回,就阻塞,期间不能做任何事情。实际工作中也不使用这种方式,一般使用异步非阻塞的方式。

异步非阻塞方式:发送方向接收方发送请求后,不用等待响应,可以接着进行其他工作;接收方不能马上返回,就去做其他的事情,往下调用,如果其他事情做完,才等待返回。当IO操作完成以后,将完成状态和结果通知接收方,接收方再响应发送方。

猜你喜欢

转载自blog.csdn.net/u011032846/article/details/81507216