web并发模型
并发:cpu划分时间片,轮流执行每个请求任务,时间片到期后,换到下一个、
并行:在多核服务器上,每个cpu内核执行一个任务,是真正的并行
IO密集型的应用,由于请求过程中很多时间都是外部IO操作,CPU在wait状态,所以并发执行可以有效提高系统吞吐量
纯CPU密集型的应用:在单核上并发执行多个请求,不能提高系统吞吐量(由于任务来回场景切换的开销,吞吐量反而会下降);只有多核并行运算,才能有效提高吞吐量
web并发模型有:multi-process multi-thread multi-process+multi-thread event I/O coroutine
多进程优点
- 并发模型非常简单,由操作系统调度运行稳定强壮
- 非常容易管理(通过操作系统进行监控与系统管理)
- 隔离性好
- 代码兼容性极好,不必考虑线程安全问题
- 多进程可以有效利用多核cpu,实现并行处理
多进程缺点
- 内存消耗大户(每个独立进程都需要加载完整的应用环境,内存消耗超大)
- cpu消耗偏高(多进程并发,需要CPU内核在多个进程间频繁切换,而进行的场景切换是非常昂贵的,需要大量的内存换页操作)
- 很低的I/O并发处理能力
- 每个进程的并发能力非常有限,单台服务器启动的进程数有限,并发能力无法有效提高
- 只适合处理短请求,不适合处理长请求(每个请求都能在很短时间内执行完毕,因而不会造成进程长期阻塞,一但某个进程特别是IO操作阻塞,会造成进程阻塞,当大面积IO操作阻塞发生,服务器就无法响应了)
多线程优点
- 多线程并发内存消耗比较小
- 多线程并发CPU消耗比较小
- 很容易创建和高效利用共享资源
- IO并发能力很高
- 可高效利用多核CPU,实现并行运算
多线程的缺点
- VM的内存管理要求超高
- 对内存管理要求非常高,应用代码稍不注意,就会产生OOM
- GC的策略会影响线程并发能力和系统吞吐量,需要对GC策略和调优有很好的经验
- 在大内存服务器上的物理利用率问题(VM内存堆不宜过大,一般2GB为宜,过大的内存堆会造成GC效率下降,在物理内存很大的服务器上为了有效利用更多内存,需要跑多个VM,增加了复杂度)
- 对共享资源的操作
- 应用代码和第三方库都必须是线程安全的
- 单进程多线程模型不方便通过操作系统管理(一旦出现线程死锁或者线程阻塞很容易导致整个VM进程挂起失去响应,隔离性很差)
event IO原理
- 单进程单线程
- 内部维护一个事件队列
- 每个请求切成多个事件
- 单进程顺序从事件队列中取出每个事件执行下去
event IO的优点
- 惊人的IO并发处理能力
- 极少的内存消耗(单一进程单一线程,无场景切换无需保存场景)
- CPU消耗偏低(无进程或者线程场景切换的开销)
event IO的缺点
- 必须使用异步编程
- CPU密集型的运算会阻塞整个进程
- 所有IO操作必须使用异步库
- 只能跑在1个CPU内核上,无法有效利用多核并行运算(运行多个进程利用多核CPU)
coroutine原理
- 在单个线程上运行多个纤程,每个纤程维护一个context
- 纤程非常轻量级,单个线程可以轻易维护几万个纤程
- 纤程的调度主要依赖应用程序框架
- 纤程的切换(必须自己编程实现,一般框架实现了纤程调度)
- 纤程本质上是基于event IO之上的高级封装,但消除了event IO原始的异步编程复杂度
coroutine的优点
- 支持极高的IO并发,和event IO基本相当
- 纤程的创建和切换的系统开销非常小,CPU和内存消耗都很小
coroutine的缺点
- 纤程运行在单线程上,无法有效利用多核实现并行运算(通过启动多个进程或者多个线程来利用多核CPU)
- CPU密集型的运算会阻塞整个进程
- 所有IO操作必须使用异步库
web并发模型的更多相关文章
- 用 Python 理解 Web 并发模型
用 Python 理解 Web 并发模型 http://www.jianshu.com/users/1b1fde012122/latest_articles 来源:MountainKing 链接: ...
- 用python理解web并发模型
最简单的并发 import socket response = 'HTTP/1.1 200 OK\r\nConnection:Close\r\nContent-Length:11\r\n\r\nHel ...
- Server Develop (五) Linux并发模型
Linux并发模型 目前可以实现并发程序的方法有Apache模型(Process Per Connection,简称PPC),TPC(Thread PerConnection)模型,以及select模 ...
- Linux并发模型
Linux并发模型 Linux并发模型 目前可以实现并发程序的方法有Apache模型(Process Per Connection,简称PPC),TPC(Thread PerConnection)模型 ...
- (转)Go语言并发模型:使用 context
转载自:https://segmentfault.com/a/1190000006744213 context golang 简介 在 Go http包的Server中,每一个请求在都有一个对应的 g ...
- nginx并发模型与traffic_server并发模型简单比较
ginx并发模型: nginx 的进程模型采用的是prefork方式,预先分配的worker子进程数量由配置文件指定,默认为1,不超过1024.master主进程创建监听套接口,fork子进程以后,由 ...
- Go语言 | CSP并发模型与Goroutine的基本使用
今天是golang专题的第13篇文章,我们一起来聊聊golang当中的并发与Goroutine. 在之前的文章当中我们介绍完了golang当中常用的使用方法和规范,在接下来的文章当中和大家聊聊gola ...
- 课堂笔记--Strom并发模型
Strom并发模型: topology是如何运行的?(可与mapreduce对比) 第一层:cluster 第二层:supervisor(host.node.机 ...
- 构建自己的Java并发模型框架
Java的多线程特性为构建高性能的应用提供了极大的方便,可是也带来了不少的麻烦.线程间同步.数据一致性等烦琐的问题须要细心的考虑,一不小心就会出现一些微妙的,难以调试的错误. 另外.应用逻辑和线程逻辑 ...
随机推荐
- 自定义VS的ItemTemplates 实现任意文件结构
上一篇说到重写IHttpHandler实现前后端分离,这次说一下如何建立一个如下文件结构. VS建立webform时是根据模板来的.C#的模板目录如下: F:\Program Files (x86)\ ...
- BestCoder Round #81 (div.2)1001
Machine Accepts: 580 Submissions: 1890 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...
- 在windows中搭建php开发环境
一.wampserver wampserver是一个安装集成包,包含了开发所需的apache,mysql,php,简单方便. 下载地址 http://www.xiazaiba.com/html/279 ...
- 慕课linux学习笔记(七)常用命令(4)
帮助命令 Man命令 Man的级别 命令帮助 可被内核调用的函数帮助 函数和函数库帮助 特殊文件帮助 /dev 配置文件帮助 游戏的帮助 其他杂项的帮助 管理员可用命令帮助 内核相关文件的帮助 -f ...
- js页面加载进度条(这个就比较正式了,改改时间就完事儿)
不废话,直接上代码 思路不难,就是一个animate方法配合随机数 duration内个三秒钟,是自定义的,可以改成页面加载时间,这样就完美了 <!doctype html> <ht ...
- attachEvent和addEventListener
attachEvent和addEventListener在前端开发过程中经常性的使用,他们都可以用来绑定脚本事件,取代在html中写obj.onclick=method. 相同点: 它们都是dom对象 ...
- phpmyadmin开启远程服务器连接
1.修改 braries/config.default.php,将 $cfg['AllowArbitraryServer'] 的值由 false 改成 true. 2.有其他需求的也可以自己在这里修 ...
- wordpress安装地址与博客地址
可千万别乱改动你的wordpress安装地址和博客地址 一月 27th, 2009 Posted in web学习, 博客建设 | 12 Comments » 我最近一个月学习数据库的一些使用,把他爱 ...
- python bottle使用多个端口(多个进程)提高并发
我的程序是用python结合bottle框架写的,但bottle自带wsgi原本只是单进程单线程运行模式(Bottle 默认运行在内置的 wsgiref 服务器上面.这个单线程的 HTTP 服务器在开 ...
- iOS中构造函数与析构函数
一.构造函数 在OC中凡是已init开头的函数我们都称之为构造函数,在声明构造函数的时候,不带参数的一般直接声明为“-(id)init”,带参数的一般声明为“-(id)initWith...”. 1 ...