并发与并行的区别 The differences between Concurrency and Parallel
逻辑控制流
在程序加载到内存并执行的时候(进程),操作系统会通过让它和其他进程分时段占用CPU(CPU slices)让它产生自己独占CPU的假象(同时通过虚拟内存让它产生独占内存的假象)。在CPU在执行一个进程的指令时,被执行的许多指令连接起来(也可以理解为程序计数器PC的变化)就构成了“逻辑控制流”。
逻辑控制流的概念也不局限于进程,它在异常处理程序、线程、Java进程中均有体现。而“并发(concurrency)”和”并行(parallel)“都是对逻辑控制流而言的。
并发
当两个逻辑控制流交替执行的时候,我们就称它们是”并发(concurrency)“的。更确切的说,对于逻辑控制流A、B,如果B被执行晚于A被执行的开始且早于A被执行的结束,那么A和B就是并发的。例如下图:

其中A和B是并发的,因为B的执行晚于A的开始且早于A的结束。但是B和C就不是并发的,因为C的执行并没有早于B的结束。同理A和C是并发的。
注意到并发和cpu的个数或者计算机的个数是没有关系的,只要两个逻辑流满足上面的关系我们就称它们并发。
并行
如果两个逻辑控制流同时(一个cpu时段内)在不同的cpu(多核)或者计算机上被执行,我们就称其为并行。例如下图:

其中A和C、B和D之间就是并行执行的。
注意到并行要求具有多个处理核心。
另外,我在网上看到一组很有意思的漫画,讲解了并发和并行的区别,分享一下(图片来自https://code.google.com/archive/p/rspace/source/concur/source):
假设一只老鼠正在烧书,其中书就代表要被执行的指令,火炉代表cpu,老鼠把书一本本运送并烧掉的过程就构成了逻辑控制流。

现在有两只老鼠(两个逻辑控制流)在烧书,例如下面这个图,由于只有一个火炉,一个老鼠烧书的时候,另外一个就要等着(保存上下文),直到烧完后轮到他烧(上下文切换),即他们烧书是交替进行的,我们就说他们在并行。(多个火炉满足这样的交替关系我们也可以说他们在并行):

当两只老鼠烧书同时进行时,我们就说它们是并发的,例如下面这个例子,由于有两个火炉(多核),烧书本身可以同时发生:

参考:
- 《深入理解计算机系统》第三版
- Rob Pike - ‘Concurrency Is Not Parallelism’
并发与并行的区别 The differences between Concurrency and Parallel的更多相关文章
- java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器
多线程并发就像是内功,框架都像是外功,内功不足,外功也难得精要. 1.进程和线程的区别 一个程序至少有一个进程,一个进程至少有一个线程. 用工厂来比喻就是,一个工厂可以生产不同种类的产品,操作系统就是 ...
- [Go] 并发和并行的区别
并发和并行的区别:1.并行是让不同的代码片段同时在不同的物理机器上运行,并行的关键是在不同的物理机器上同时运行 2.并发是同时管理很多事情,比如在一个物理机器上进行不停的调度,有些事情可能只做了一半就 ...
- Python Web学习笔记之并发和并行的区别和实现
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行.你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发.你吃饭吃到一半,电话来了,你一边打 ...
- 【Java_基础】并发、并行、同步、异步、多线程的区别
1. 并发:位于同一个处理器上的多个已开启未完成的线程,在任意一时刻系统调度只能让一个线程获得CPU资源运行,虽然这种调度机制有多种形式(大多数是以时间片轮巡为主).但无论如何,都是通过不断切换需要运 ...
- CPU时间分片、多线程、并发和并行
1.CPU时间分片.多线程? 如果线程数不多于CPU核心数,会把各个线程都分配一个核心,不需分片,而当线程数多于CPU核心数时才会分片. 2.并发和并行的区别 并发:当有多个线程在操作时,如果系统只有 ...
- Java多线程原理+基础知识(超级超级详细)+(并发与并行)+(进程与线程)1
Java多线程 我们先来了解两个概念!!!! 1.什么是并发与并行 2.什么是进程与线程 1.什么是并发与并行 1.1并行:两个事情在同一时刻发生 1.2并发:两个事情在同一时间段内发生 并发与并行的 ...
- geotrellis使用(六)Scala并发(并行)编程
本文主要讲解Scala的并发(并行)编程,那么为什么题目概称geotrellis使用(六)呢,主要因为本系列讲解如何使用Geotrellis,具体前几篇博文已经介绍过了.我觉得干任何一件事情基础很重要 ...
- Python 多线程教程:并发与并行
转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...
- go并发和并行
Go语言的并发和并行 不知道你有没有注意到一个现象,还是这段代码,如果我跑在两个goroutines里面的话: var quit chan int = make(chan int) func loop ...
随机推荐
- Android 开发笔记___DateUtil——Time
package com.example.alimjan.hello_world; /** * Created by alimjan on 6/30/2017. */ import java.text. ...
- 淘宝联盟api调用笔记
一.流程及主要请求接口 每日凌晨1点开始,服务器定时自动请求淘宝联盟数据,请求完毕之后,执行一个存储过程对数据进行整理,删除过期...购买数量<...的商品......,请求接口分别有(tbk_ ...
- Web桌面应用框架3:Web桌面应用开发的N种Style
研究Web桌面应用开发有一段时间了,总结了Web桌面应用开发的一些主流方式. 一.前端Style 这种方式的就是直接实现一个Web程序,再封装一个浏览器展示,相当粗暴和有效.著名的框架就是Electr ...
- css基础-语法篇
CSS基础 1.css简介 cascading style sheets 汉译层叠样式表,WEB标准中的表现标准语言,表现标准语言在网页中主要对网页信息的显示进行控制,简单说就是如何修饰网页信息 ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(九)Linux下安装redis及redis的常用命令和操作
redis简介 Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis与其他key-value缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存 ...
- 【转载】 Java:按值传递还是按引用传递详细解说
前天在做系统的时候被Java中参数传递问题卡了一下,回头查阅了相关的资料,对参数传递问题有了新的了解和掌握,但是有个问题感觉还是很模糊,就是Java中到底是否只存在值传递,因为在查阅资料时,经常看到有 ...
- javac 实现原理
javac 概述 javac 是jdk bin目录下的一个脚本. 用于编译 java程序的源代码,但是 其实现的本质 是基于 jdk 标准类库中的 javac类库实现,所以java的编译器实质上是一个 ...
- Numpy入门 - 数组基本运算
本节主要讲解numpy数组的基本运算,包括两数组相加.相减.相乘和相除. 一.两数组相加add import numpy as np arr1 = np.array([[1, 2, 3], [4, 5 ...
- JavaWeb框架_Struts2_(六)----->Struts2的输入校验
1. 输入校验章节目录 输入校验概述 客户端校验 服务器端校验 手动编程校验 重写validate方法 重写validateXxx()方法 输入校验流程 校验框架校验 Struts2 内置的校验器 常 ...
- 在.NET Core类库中使用EF Core迁移数据库到SQL Server
前言 如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题. 起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合 ...