文档章节

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

精通吹水
 精通吹水
发布于 2016/04/20 15:41
字数 875
阅读 337
收藏 4
点赞 2
评论 0

多进程 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,减少阻塞等待和非业务代码(如上下文切换)的运行时间占用。

参考

© 著作权归作者所有

共有 人打赏支持
精通吹水
粉丝 18
博文 56
码字总数 55035
作品 0
人事招聘
适合抓取封堵的爬虫框架 - vscrawler

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

virjar ⋅ 2017/12/10 ⋅ 0

vscrawler 0.2.1发布,适合用作抓取的爬虫框架

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

virjar ⋅ 2017/12/16 ⋅ 8

DICOM:DICOM开源库多线程分析之“ThreadPoolQueue in fo-dicom”

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

zssureqh ⋅ 2016/02/05 ⋅ 0

分布式爬虫笔记(二)- 多线程&多进程爬虫

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

Spareribs ⋅ 2017/07/13 ⋅ 0

看到有网友说Node.js是支持多线程的,我在这里解释一下

Node.js确实有一个扩展,叫tagg,可以实现多线程。但实际上是这样的,它的这个多线程只是一个线程池,去执行一部分计算的任务。 EventLoop和IO的处理部分始终是单线程的,在任务线程中不能调...

matyhtf ⋅ 2014/07/11 ⋅ 10

进程VS.线程-笔记

资料来源: http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001397567993007df355a3394da48f0bf14960f0c78753f000 1、Apache最早就是采用多进程模式 ......

hiqj ⋅ 2015/07/17 ⋅ 0

一行 Python 实现并行化 -- 日常多线程操作的新思路

春节坐在回家的火车上百无聊赖,偶然看到 Parallelism in one line 这篇在 Hacker News 和 reddit 上都评论过百的文章,顺手译出,enjoy:-) http://www.zhangzhibo.net/2014/02/01/paralleli...

MarkCo ⋅ 2016/03/31 ⋅ 0

Visual Studio编译 libuv

libuv 是 Node 的新跨平台抽象层,用于抽象 Windows 的 IOCP 及 Unix 的 libev。作者打算在这个库的包含所有平台的差异性。 特性: 非阻塞 TCP 套接字 非阻塞命名管道 UDP 定时器 子进程生成...

雅各宾 ⋅ 2013/07/25 ⋅ 1

Netty 源码分析之 三 我就是大名鼎鼎的 EventLoop(一)

目录 源码之下无秘密 ── 做最好的 Netty 源码分析教程 Netty 源码分析之 番外篇 Java NIO 的前生今世 Java NIO 的前生今世 之一 简介 Java NIO 的前生今世 之二 NIO Channel 小结 Java NIO...

永顺 ⋅ 2017/11/29 ⋅ 0

VS2010环境与OpenMP远程多线程访问MySQL数据库的限制和困惑

本地的C++代码,打开OpenMP编译选项得到debug/release版本的可执行程序A.exe,A.exe是一个socket监听服务,监听端口port的请求。A接收到请求会创建一个新的线程t去调用B.dll中的算法完成计算...

liuyan ⋅ 2012/08/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 48分钟前 ⋅ 0

VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】

前言 我是上学期学的汇编,因为有vs又不想用课上教的麻烦的dosbox以及masm32,但是一直没找到高亮插件和能调试的(难在运行不了而找不到答案上,出现的错误在最后放出,还请先达们不吝指点)...

simpower ⋅ 57分钟前 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 今天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 今天 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 今天 ⋅ 0

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 今天 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 今天 ⋅ 0

Java对象的序列化与反序列化

Java对象的序列化与反序列化

Cobbage ⋅ 今天 ⋅ 0

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 今天 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部