Nginx 原理

Web服务器处理并发连接请求的工作模型有以下几种方式:

1、单线程web服务器(Single-threaded web servers)
此种架构方式中,web服务器一次处理一个请求,结束后读取并处理下一个请求。在某请求处理过程中,其它所有的请求将被忽略,因此,在并发请求较多的场景中将会出现严重的性能问题。(即一次只能处理一个请求)
 
2、多进程/多线程web服务器
此种架构方式中,web服务器生成多个进程或线程并行处理多个用户请求,进程或线程可以按需或事先生成。有的web服务器应用程序为每个用户请求生成一个单独的进程或线程来进行响应,不过,一旦并发请求数量达到成千上万时,多个同时运行的进程或线程将会消耗大量的系统资源。(即每个进程只能响应一个请求,并且一个进程对应一个线程)
 
3、I/O多路复用web服务器
为了能够支持更多的并发用户请求,越来越多的web服务器正在采用多种复用的架构———即同步监控所有的连接请求的活动状态,当一个连接的状态发生改变时(如数据准备完毕或发生某错误),将为其执行一系列特定操作;在操作完成后,此连接将重新变回暂时的稳定态并返回至打开的连接列表中,直到下一次的状态改变。由于其多路复用的特性,进程或线程不会被空闲的连接所占用,因而可以提供高效的工作模式。(这种架构可以理解为一个进程可以生成多个线程,每个请求交给一个线程进行处理)
 
4、多路复用多线程web服务器
将多进程和多路复用的功能结合起来形成的web服务器架构,其避免了让一个进程服务于过多的用户请求,并能充分利用多CPU主机所提供的计算能力。(这种架构可以理解为有多个进程,并且一个进程又生成多个线程,每个线程处理一个请求)
 
linux下常用的I/O模型(这里借用下在网上查阅的资料,感觉还好理解):
先引入select和epoll概念:
select和epoll是两个处理I/O模型的机制,可以加速请求处理,2者处理方式不同:通俗的讲,select机制是对没有处理好的I/O请求在一段时间内进行检测,并将其状态通知给用户,即有没有完成都会通知。而epool机制则是在该I/O请求完成后才通知给用户。
 
在Unix/Linux下共有五种I/O模型,分别是:
1)阻塞I/O
2)非阻塞I/O
3)I/O复用(select和poll)
4)信号驱动I/O(SIGIO)
5)异步I/O(Posix.1的aio_系列函数)
 
对以上模型的比较:
阻塞I/O:
应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示
 
非阻塞I/O:
我们把一个套接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间。
 
I/O复用(select和poll):
I/O复用模型会用到select或者poll函数,这两个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。
 
信号驱动I/O(SIGIO):
首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。
 
异步I/O(Posix.1的aio_系列函数):
当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作
 
apache的工作模块:
prefork:多进程,每个请求用一个进程响应,这个过程会用到select机制来通知。
worker:多进程,一个进程可以生成多个线程,每个线程响应一个请求。
event:一个进程,每个进程响应多个用户请求,它是基于事件实现的。
 
基于事件机制的特性:
一个进程响应多个用户请求,利用run-loop机制,让套接字复用,请求过来后进程并不处理请求,而是直接交由其他机制来处理,通过select或epoll机制来通知请求是否完成;在这个过程中,进程本身一直处于空闲状态,可以一直接收用户请求。
 
 
对于高并发请求的实现:
1、基于线程:即一个进程生成多个线程,每个线程响应用户的每个请求。如worker模型
2、基于事件的模型,一个进程处理多个请求,并且通过epoll机制来通知用户请求完成。如event模型
 
web服务器工作流程:
我们知道web服务器是工作在用户空间的,用户空间通过系统调用来与内核打交道。
用户请求–>送达用户空间–>系统调用–>内核空间–>内核到磁盘上读取网页资源(在此过程中就牵涉到了以上几种模型的运用)

原创文章,作者:SDS,如若转载,请注明出处:http://www.178linux.com/74977

(1)
SDSSDS
上一篇 2017-05-07 22:49
下一篇 2017-05-07 23:16

相关推荐

  • Btrfs文件系统在CentOS中的应用

      Btrfs作为Linux下一代文件系统与zfs有着许多相似的功能。 扩展性 (scalability) 相关的特性,btrfs 最重要的设计目标是应对大型机器对文件系统的扩展性要求。 Extent,B-Tree 和动态 inode 创建等特性保证了 btrfs 在大型机器上仍有卓越的表现,其整体性能而不会随着系统容量的增加而降低。 其次是数据一…

    Linux干货 2016-01-20
  • Linux的哲学思想

    Linux的哲学思想 linux有个哲学的思想是一切皆文件 其中linux硬件设备也是通过文件来表示的 物理终端 物理终端指的是显示器等硬件终端设备,文件存在于 /dev/console 这个路径下 虚拟终端 虚拟终端指的是在linux命令行连接的终端,文件存在于 /dev/tty# [1,6] 这个路径下 串行终端 指的是使用计算机串行端口连接的终端设备,…

    Linux干货 2018-02-23
  • 计算机基础知识

    命令总结 echo :回显 echo $PATH:显示命令定义的路径变量 Init 3,5:关闭和打开图形界面 chvt切换虚拟终端(此命令只能本机切换) startx从新打开图形界面 powerr off关机 hostname 显示当前主机名 lsb_release -a显示操作系统版本 lscpu显示cpu信息 cat查看 who am显示当前用户身份 …

    Linux干货 2016-07-26
  • 正则表达式详解

    正则表达式详解

    2017-09-20
  • GRUB启动故障排除和内核编译

    如何进入光盘应急系统(以下修复操作仅适用于GRUB legacy, 不适用于GRUB2): 步骤一:给主机挂上安装光盘, 或者有相应启动镜像的硬盘分区(可移动的分区) 步骤二:开机时选择CDROM先启动 步骤三:进入光盘启动界面选择应急救援模式 步骤四: 不选择设置网络接口, 直接读取磁盘分区并以读写方式挂载 步骤五: 选择shell进入bash中对磁盘进行…

    Linux干货 2016-09-12