文档章节

多进程 VS 多线程 VS 线程池 VS EventLoop

精通吹水
 精通吹水
发布于 2016/04/20 15:41
字数 875
阅读 371
收藏 4

多进程 VS 多线程 VS 线程池 VS EventLoop

在现在的编程过程中,经常听到多进程,多线程,线程池,EventLoop 的概念,选择一个正确的驱动模型,有助于提升代码的性能。

注:本文仅仅讨论并发的情况。

进程和线程

  • 进程:操作系统中资源管理对象,管理虚拟内存,文件句柄,线程等资源,但是进程不是执行单元

  • 线程:具体的执行单元。CPU是实际的物理执行单元,通过寄存器可以控制CPU执行的代码以及状态。而线程就是包含了一个任务的CPU上下文(寄存器),任务状态(就绪|阻塞|运行),所属用户等信息的对象。操作系统接收到时间中断(INT)后,通过轮转线程中的CPU上下文(寄存器)信息,实现了多任务的轮转

多进程

多进程:针对并发请求,一个请求开启一个进程进行处理。早起CGI就是这么干的。

代表:早期PHP,CGI类

优点:

  • 一个业务进程奔溃不影响另外一个业务进程,从操作系统层面上隔离业务执行
  • 如果进程采用Socket之类的RPC调用,那么非常容易部署到网络环境上

缺点:

  • RPC调用比较难以编写
  • 频繁的开启和关闭进程,性能比较差
  • 不允许内存共享(排除内核支持情况)

多线程

多线程:针对不同的业务逻辑,并发的开启多个线程进行执行。

代表:早期 Tomcat Bio模型

优点:

  • 内存是共享的
  • 编写并发模型比较方便
  • 有效的利用多核CPU

缺点:

  • 并发量过大的时候,开启了太多线程(有些阻塞在IO),导致CPU上下文切换太过频繁
  • 过多的线程,会占用许多内存(2MB/Thread),造成服务器奔溃
  • 需要做并发控制

线程池

线程池:开启固定的线程,当有请求过来的时候,查询是否存在空闲线程,如果存在,则使用空闲线程执行任务,否则加入等待执行队列

代表:Netty,Jetty

优点:

  • 有效的利用多核CPU
  • 内存共享
  • 减少了CPU上下文切换消耗

缺点:

  • 还是存在一部分IO等待,导致CPU无法有效的利用
  • 需要做并发控制

EventLoop

EventLoop:仅仅开启一条main线程执行任务,其他所有的IO操作等,都放在后台线程中执行,对于新的请求,都加入到queue中,等待main线程调度。

代表:Node.js

优点:

  • 大部分情况下,不需要做并发控制
  • 减少了CPU上下文切换消耗

缺点:

  • 无法有效利用多核CPU(当然可以多开EventLoop)
  • 回调陷进,调试比较困难

总结

上述的各种编程模型,都出现在我们的实际的开发过程中,其核心思想为:有效的利用CPU,减少阻塞等待和非业务代码(如上下文切换)的运行时间占用。

参考

© 著作权归作者所有

共有 人打赏支持
上一篇: Java内存-GC篇
下一篇: Android 坐标系
精通吹水
粉丝 18
博文 56
码字总数 55035
作品 0
人事招聘
私信 提问
适合抓取封堵的爬虫框架 - vscrawler

VSCrawler是一个适合用作抓取的爬虫框架,在更多场景倾向于功能扩展性而牺牲使用简便性。这让VSCrawler非常强大,让他可以灵活的应对目标网站的反爬虫策略。为了方便描述,文档中可能使用VS替...

virjar
2017/12/10
304
0
vscrawler 0.2.1发布,适合用作抓取的爬虫框架

VSCrawler是一个适合用作抓取的爬虫框架,在更多场景倾向于功能扩展性而牺牲使用简便性。这让VSCrawler非常强大,让他可以灵活的应对目标网站的反爬虫策略。 vscrawler有挺多特点 1. 多用户登...

virjar
2017/12/16
686
8
(转载)Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程 - 笑虎的文章 - 知乎

Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程 - 笑虎的文章 - 知乎 https://zhuanlan.zhihu.com/p/24283040 Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线...

avatus
09/05
0
0
DICOM:DICOM开源库多线程分析之“ThreadPoolQueue in fo-dicom”

背景: 上篇博文介绍了dcm4chee中使用的Leader/Follower线程池模型,主要目的是节省上下文切换,提高运行效率。本博文同属【DICOM开源库多线程分析】系列,着重介绍fo-dicom中使用的ThreadP...

zssureqh
2016/02/05
0
0
分布式爬虫笔记(二)- 多线程&多进程爬虫

这一次分析主要是针对上 分布式爬虫笔记(一)- 非框架实现的Crawlspider 的一次改进,从单机的爬虫改成多线程和多进程爬虫~~~ 多线程和多进程的区别 参考文章 单线程、多线程和多进程的效率...

Spareribs
2017/07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源

背景 随着应用越来越复杂,依赖越来越多,日志系统越来越混乱,有时会出现一些奇怪的日志,比如: [] [] [] No credential found 那么怎样排查这些奇怪的日志从哪里打印出来的呢?因为搞不清...

hengyunabc
今天
1
0
home hosts

home hosts lwk@qwfys:~$ cat /etc/hosts127.0.0.1 localhost127.0.1.1 qwfys192.168.56.101vm600.qwfys.com39.108.212.91alpha1.ppy.com39.108.117.122alpha2.p......

qwfys
今天
1
0
大数据教程(6.1)hadoop生态圈介绍及就业前景

1. HADOOP背景介绍 1.1、什么是HADOOP 1.HADOOP是apache旗下的一套开源软件平台 2.HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 3.HADOOP的核心组...

em_aaron
今天
4
0
hadoop垃圾回收站

在生产生,hdfs回收站必须是开启的,一般设置为7天。 fs.trash.interval 为垃圾回收站保留时间,如果为0则禁用回收站功能。 fs.trash.checkpoint.interval 回收站检查点时间,一般设置为小于...

hnairdb
昨天
3
0
腾讯与Github的魔幻会面背后的故事…

10月22日,腾讯开源管理办公室有幸邀请到Github新晋CEO Nat Friedman,前来鹅厂参观交流。目前腾讯已经有近70个项目在Github上开源,共获得17w stars,世界排名11位。Github是腾讯开源的主阵...

腾讯开源
昨天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部