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并发处理能力
  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并发模型粗浅探讨》》

时间: 2024-11-05 21:45:39

web并发模型的相关文章

用 Python 理解 Web 并发模型

用 Python 理解 Web 并发模型 http://www.jianshu.com/users/1b1fde012122/latest_articles 来源:MountainKing 链接:http://www.jianshu.com/p/80feb3bf5c70# 前言 虽然异步是我们急需掌握的高阶技术,但是不积跬步无以至千里,同步技术的学习是不能省略的.今天这篇文章主要用Python来介绍Web并发模型,直观地展现同步技术的缺陷以及异步好在哪里. 最简单的并发 import socke

并发模型与Event Loop

JavaScript的并发模型基于"event loop".这个模型与其他在C或者Java中的模型着实不同. 运行时概念 下面的内容解释了一个理论上的模型.现代JavaScript引擎着重实现和优化了描述的几个语义. 可视化描述 栈 函数调用形成了一个frames的栈. function f(b){   var a = 12;   return a+b+35;}function g(x){   var m = 4;   return f(m*x);}g(21); 调用g的时候,创建了第

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

ginx并发模型: nginx 的进程模型采用的是prefork方式,预先分配的worker子进程数量由配置文件指定,默认为1,不超过1024.master主进程创建监听套接口,fork子进程以后,由worker进程监听客户连接,每个worker子进程独自尝试accept已连接套接口,accept是否上锁可以配置,默认会上锁,如果操作系统支持原子整型,才会使用共享内存实现原子上锁,否则使用文件上锁.不使用锁的时候,当多个进程同时accept,当一个连接来的时候多个进程同时被唤起,会导致惊群问题.

apache并发模型

并发模型: 在讨论HTTP面对并发连接之前我们先讨论一下银行工作人员面对大量客户时的工作机制,其实银行的工作机制与HTTP的工作面对并发时的工作机制是类似的. 1.    如果一个银行在刚开业只有一个柜台,假设接待一个客户需要5分钟的话,那么如果同时来10个客户,只能先接待接待一个,让另外的9个人先等着排列,如果队列很多,很多人连大厅都坐不下,保安就不让排队了. 2.    银行的人员越来越多,然后开了10个柜台,同时来了100个用户,还有90个等待,为什么不能开100个柜台呢?你不考虑成本的吗

Golang并发模型:select进阶

前一篇文章<Golang并发模型:轻松入门select>介绍了select的作用和它的基本用法,这次介绍它的3个进阶特性. nil的通道永远阻塞 如何跳出for-select select{}阻塞 nil的通道永远阻塞 当case上读一个通道时,如果这个通道是nil,则该case永远阻塞.这个功能有1个妙用,select通常处理的是多个通道,当某个读通道关闭了,但不想select再继续关注此case,继续处理其他case,把该通道设置为nil即可.下面是一个合并程序等待两个输入通道都关闭后才退

课堂笔记--Strom并发模型

Strom并发模型: topology是如何运行的?(可与mapreduce对比) 第一层:cluster 第二层:supervisor(host.node.机器) 第三层:worker(进程) 第四层:executor(线程) 第五层:task(线程的一个个对象.如Spout和Blot) //topology:N workers==每个==>1 excutor=>1 task //此时,它和mapreduce那个是一样的 topology代码    conf.setNumWorkers(2)

Java并发模型(一)

学习资料来自http://ifeve.com/java-concurrency-thread-directory/ 一.多线程 进程和线程的区别: 一个程序运行至少一个进程,一个进程至少包含一个线程. 多线程: 多线程使得在一个程序内部能够拥有多个线程并行执行,一个线程的执行可以被认为是一个cpu在执行该程序,当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序. 多线程在同一个程序内部并发执行,因此会对相同的内存空间进行并发读写操作. 思考: 如果一个线程在读一个内存时,另一个线程正向

并发模型之——基本概念

从很久之前在学校到现在我们编程的时候经常都有听说到并发编程,偶尔也会听到说并行,但我们很多人其实都不太清除并发与并行具体的区别在哪:我们刚开始学习编程语言的时候我相信我们写的都是串行程序,一步接着一步来,可以说这比并发程序更不容易出错,但在性能上要远不如并发:还有一种并发具有很强容错性:分布式程序,分布式程序也算是并发程序,还可以具有很强的容错性,可以分开部署:     并发与并行有着本质上的区别.     并发指程序在同一时间只能做一个操作,但是可以在不同的时间点()做多个操作:     如:

并发模型—共享内存模型(线程与锁)示例篇

共享内存模型,顾名思义就是通过共享内存来实现并发的模型,当多个线程在并发执行中使用共享资源时如不对所共享的资源进行约定或特殊处理时就会出现读到脏数据.无效数据等问题:而为了决解共享资源所引起的这些问题,Java中引入了同步.锁.原子类型等这些用于处理共享资源的操作; 在本篇文章中,将通过几个Demo来介绍Java的synchronized.lock.atomic相关类等,Java的共享内存并发模型也就体现在同步(synchronized).锁(lock)等这些实现上: 同步: Demo中开启两个