并发: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并发处理能力
  1. 每个进程的并发能力非常有限,单台服务器启动的进程数有限,并发能力无法有效提高
  2. 只适合处理短请求,不适合处理长请求(每个请求都能在很短时间内执行完毕,因而不会造成进程长期阻塞,一但某个进程特别是IO操作阻塞,会造成进程阻塞,当大面积IO操作阻塞发生,服务器就无法响应了)

多线程优点

  • 多线程并发内存消耗比较小
  • 多线程并发CPU消耗比较小
  • 很容易创建和高效利用共享资源
  • IO并发能力很高
  • 可高效利用多核CPU,实现并行运算

多线程的缺点

  • VM的内存管理要求超高
  1. 对内存管理要求非常高,应用代码稍不注意,就会产生OOM
  2. GC的策略会影响线程并发能力和系统吞吐量,需要对GC策略和调优有很好的经验
  3. 在大内存服务器上的物理利用率问题(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并发模型粗浅探讨》》

web并发模型的更多相关文章

  1. 用 Python 理解 Web 并发模型

    用 Python 理解 Web 并发模型 http://www.jianshu.com/users/1b1fde012122/latest_articles   来源:MountainKing 链接: ...

  2. 用python理解web并发模型

    最简单的并发 import socket response = 'HTTP/1.1 200 OK\r\nConnection:Close\r\nContent-Length:11\r\n\r\nHel ...

  3. Server Develop (五) Linux并发模型

    Linux并发模型 目前可以实现并发程序的方法有Apache模型(Process Per Connection,简称PPC),TPC(Thread PerConnection)模型,以及select模 ...

  4. Linux并发模型

    Linux并发模型 Linux并发模型 目前可以实现并发程序的方法有Apache模型(Process Per Connection,简称PPC),TPC(Thread PerConnection)模型 ...

  5. (转)Go语言并发模型:使用 context

    转载自:https://segmentfault.com/a/1190000006744213 context golang 简介 在 Go http包的Server中,每一个请求在都有一个对应的 g ...

  6. nginx并发模型与traffic_server并发模型简单比较

    ginx并发模型: nginx 的进程模型采用的是prefork方式,预先分配的worker子进程数量由配置文件指定,默认为1,不超过1024.master主进程创建监听套接口,fork子进程以后,由 ...

  7. Go语言 | CSP并发模型与Goroutine的基本使用

    今天是golang专题的第13篇文章,我们一起来聊聊golang当中的并发与Goroutine. 在之前的文章当中我们介绍完了golang当中常用的使用方法和规范,在接下来的文章当中和大家聊聊gola ...

  8. 课堂笔记--Strom并发模型

    Strom并发模型:     topology是如何运行的?(可与mapreduce对比)         第一层:cluster         第二层:supervisor(host.node.机 ...

  9. 构建自己的Java并发模型框架

    Java的多线程特性为构建高性能的应用提供了极大的方便,可是也带来了不少的麻烦.线程间同步.数据一致性等烦琐的问题须要细心的考虑,一不小心就会出现一些微妙的,难以调试的错误. 另外.应用逻辑和线程逻辑 ...

随机推荐

  1. .net framework版本以及服务器部署问题

    自己做了个官网,部署到服务器很多问题,发现targetframework为4.0,但是公司服务器的版本为:2.0.50727,但是公司一个项目用的lambda和linq就没有事,发现这个是3.5支持的 ...

  2. 服务器安装VMware ESXI5.5

    一.VMware ESXI5.5 vSphere5.5 VIMSetup下载http://blog.sina.com.cn/s/blog_61c07ac50101gy64.html(1)VMware安 ...

  3. css 文本域textarea显示成label标签

    <html> <head>     <title>textarea显示为label</title> <style type="text/ ...

  4. BZOJ4006 JLOI2015 管道连接(斯坦纳树生成森林)

    4006: [JLOI2015]管道连接 Time Limit: 30 Sec Memory Limit: 128 MB Description 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的 ...

  5. HEAP[xxx.exe]:Invalid Address specified to RtlValidateHeap 错误的解决方法总结

    一.情况 抽象出问题是这样的: class DLL_API1 A { func() { vector vec; B b; b.func(vec); return TRUE; } } 其中B是另一个导出 ...

  6. Hadoop基本原理之一:MapReduce

    1.为什么需要Hadoop 目前,一块硬盘容量约为1TB,读取速度约为100M/S,因此完成一块硬盘的读取需时约2.5小时(写入时间更长).若把数据放在同一硬盘上,且全部数据均需要同一个程序进行处理, ...

  7. 高效的jQuery代码编写技巧总结

    最近写了很多的js,虽然效果都实现了,但是总感觉自己写的js在性能上还能有很大的提升.本文我计划总结一些网上找的和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度 ...

  8. 页面每次加载时重新获取css文件

    <script> (function(){ var version=''; var xmlhttp; // code for IE7+, Firefox, Chrome, Opera, S ...

  9. python代码风格规范

    类注释模板: :: class AnotherClass: """ 类注释 """ def method(self, arg1, arg2, ...

  10. Jasper_table_pass parameter to table component

    <subDataset name="Dataset1" uuid="2a894ef4-dbcc-47df-bfaf-027766c7352e"> 2 ...