apache和nginx那点事儿--阻塞和异步
先明白的事儿:当一个程序在执行的时候,一般会创建一个进程,也可以有多个进程。一个进程至少会创建一个线程,多个线程共享一个程序进程的内存。程序的运行最终是靠线程来完成操作的。线程的数量跟CPU核数有关,一个核最多能发出两个线程。线程的操作主要分为:一:给CPU进行程序命令的执行。二:IO的操作(读取或输出数据)或者请求网络数据。
什么是阻塞:就是线程在执行IO操作获取数据时,这个IO可能会需要一定的时间才能等到数据返回,然后才能接着执行下面的命令。那么,此时,这个线程的等待状态我们就把它称为阻塞。没有充分利用起cpu的资源。
什么是非阻塞:还是这个线程在进行 IO操作时,无需等待数据的返回,可以接着往下执行代码命令。cpu资源一直在充分利用。
但是总要知道数据什么时候返回吧,常见的两个解决方案:
第一:如果程序是单线程的情况下,在接着执行下面的代码过程中,需要额外不断的轮询查看这个IO请求的数据是否返回。
第二:使用多线程,一个进程继续等待数据返回,另一个线程继续操作执行下面的代码。cpu资源一直在充分利用。
什么是同步和异步:同步指的当线程进行IO操作请求数据时,是你主动"关心"数据的返回。异步是当前线程无需主动关心数据是否返回,当数据返回时,会有相关的事件通知你。
举个通俗的例子:
你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
由此可见:阻塞并不等于同步,非阻塞也不等于异步。阻塞不阻塞的区别点在于:线程当遇到IO操作,需要等待IO返回数据时,是否能继续往下执行代码。而同步与异步的区别点在于:IO要返回的数据是需要线程主动等待,还是被动的等待数据处理完之后主动通知你。
最好的理想方案就是:异步非阻塞。而nginx就使用的非阻塞+异步。apache使用的是同步阻塞。这也就是为什么nginx能比apache处理更多的请求更高的并发的原因。
apache与nginx的工作原理:
假如下面是类似apache和nginx的伪代码:
listen //监听端口
while(true){
$conn = accept() //一直循环接收连接
$read_content = read(conn)//读取请求的文件
$esponse = process(conn) # 执行业务逻辑
echo $espnse //返回客户端内容
}
apache:
每一个连接,apache就会创建一个进程,每个进程内单线程,apache最多能创建256个进程。对于一个负载相对较高的网站来说,256的进程,也就是256个线程,因为线程处理请求时,是同步阻塞模式,接收请求之后,会一直等待该请求读取程序文件(IO)(同步),执行业务逻辑,返回客户端,所有操作完成之后才能处理下一个请求(阻塞)如果服务器已经达到256的极限,那么接下去的访问就需要排队这也就是为什么某些服务器负载不高的原因了。
nginx:
nginx接收一个请求后,不会等待这个请求的文件读取操作完成之后才接收下一个请求,它不会等待这个请求的后续的处理结果。而是会马上循环处理下一个请求(不阻塞)。请求的程序文件执行完成之后,会主动通知该线程,不用你主动去等待或者轮询查看(异步)。最后返回给客户端。这样做,每个请求过来就不需要等待很长的时间排队,而是马上就能接收,开始进行处理了。等处理完成之后,会主动通知回调这个线程进行数据返回。
apache和nginx那点事儿--阻塞和异步的更多相关文章
- Apache与Nginx的优缺点比较
1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下ngin ...
- Apache与Nginx区别
1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx ...
- Apache与Nginx对客户端请求的处理机制对比
Apache与Nginx对客户端请求的处理机制对比 模块 大致为四个模块,核心模块.HTTP模块.邮件模块,以及第三方模块 核心模块主要包含两类功能的支持,一类是主体功能,包括进程管理,权限管理,错误 ...
- (转)apache和nginx的区别
nginx 相对 apache 的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下ngin ...
- Apache与nginx优缺点对比
1.nginx相对于Apache优点: nginx轻量级,同样起web服务,比apache占用更少的内存资源: 抗并发,nginx处理请求是异步非阻塞型的,Apache处理请求是阻塞型的,所以在处理高 ...
- Linux Apache和Nginx网络模型详解
进程阻塞和挂起的定义: 阻塞是由于进程所需资源得不到满足,并会最终导致进程被挂起 进程挂起的原因并不一定是由于阻塞,也有可能是时间片得不到满足,挂起状态是进程从内存调度到外存中的一种状态,若在 ...
- Linux Apache和Nginx的比较
1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx ...
- Apache与Nginx的区分比较
什么是Nginx代理代理服务器,它和Apache相比又有什么区别呢?你又该如何选择使用呢,用其中一个还是两者都用?我们将会在这里探索一下这些问题的答案. Apache服务器从1995年就开始使用了.相 ...
- select与epoll、apache与nginx实现原理对比
转自:http://www.tuicool.com/articles/AzmiY3 关于select与epoll 两种IO模型,都属于多路IO就绪通知,提供了对大量文件描述符就绪检查的高性能方案,只不 ...
随机推荐
- jdbc的URL配置
Microsoft SQL ServerMicrosoft SQL Server JDBC Driver (一般用来连接 SQLServer 2000)驱动程序包名:msbase.jar mssqls ...
- 阿里巴巴java开发手册学习记录,php版
一.编程规约 (一)命名风格 1.目录使用小写+下划线 home,view,model,admin_view 2.类 UpperCamelCase PhpMailer方法 lowerCamelCase ...
- layui treeSelect
官方地址:https://fly.layui.com/extend/treeSelect/ 下面介绍一下这个插件的使用方法 1.html页面 <div class="layui-inp ...
- Electron-forge应用(打包填坑)
Electron-forge应用 一. 使用Electron-Forge做应用的缘由 最近遇到一个需求,Web应用登录时要校验用户的登录Mac地址,以确定该用户是在授权过的电脑设备上登录的.没错 ...
- Vim的环境设定与记录
vim 会主动将曾经做过的行为记录下来,记录在文件 ~/.viminfo,好方便下次作业. 更改 /etc/vimrc配置操作环境 vim的环境设定参数 :set nu :set nonu 设 ...
- JavaSelenium 页面常用基本操作语法
元素定位 findElement() 方法返回一个元素, 如果没有找到,会抛出一个异常 NoElementFindException() fi ...
- 关于java php go 中AES加解密秘钥长度问题
今天心血来朝,想用go把php中的一个小功能重写一下,但在解密aes加密的数据时碰到了个坑! php的mcrypt拓展(貌似php7.1版本以上不支持了)提供了aes的加解密: 而且php aes 的 ...
- 最短路SPFA模板
// // dijkstra妯℃澘.cpp // algorithm // // Created by david.xu on 2018/8/6. // Copyright 漏 2018骞?david ...
- 一文搞定Spring Boot + Vue 项目在Linux Mysql环境的部署(强烈建议收藏)
本文介绍Spring Boot.Vue .Vue Element编写的项目,在Linux下的部署,系统采用Mysql数据库.按照本文进行项目部署,不迷路. 1. 前言 典型的软件开发,经过" ...
- 解决el-tree lazy懒加载时,连续勾选前两个子节点后第二次进入默认选中时,将父节点也勾选的问题
在用到el-tree的懒加载和默认勾选功能时,若第一次勾选前几个连续节点,第二次进入默认勾选时,由于el-tree子节点尚未完全加载(只加载出来前几个),默认勾选已经开始(已加载出来的子节点被默认勾选 ...