「三分钟系列05」3分钟看懂并发与并行
并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。并发和并行都可以是很多个线程,就看这些线程能不能同时被(多个)cpu执行,如果可以就说明是并行,而并发是多个线程被(一个)cpu 轮流切换着执行。
有个有趣的说法是这样比喻的:
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
再来看一个经典的例子:
并发是两个队列,使用一台咖啡机,并行是两个队列。使用两台咖啡机,如果串行,一个队列使用一台咖啡机,那么哪怕前面那个人便秘了去厕所呆半天,后面的人也只能死等着他回来才能去接咖啡,这效率无疑是最低的。
为什么操作系统上可以同时运行多个程序而用户感觉不出来?
这是因为无论是单CPU还是多CPU,操作系统都营造出了可以同时运行多个程序的假象。实际的过程操作系统对进程的调度以及CPU的快速上下文切换实现的:每个进程执行一会就先停下来,然后CPU切换到下个被操作系统调度到的进程上使之运行。因为切换的很快,使得用户认为操作系统一直在服务自己的程序。
再来解释并发就容易理解多了。
并发(concurrent)指的是多个程序可以同时运行的现象,更细化的是多进程可以同时运行或者多指令可以同时运行。但这不是重点,在描述并发的时候也不会去扣这种字眼是否精确,并发的重点在于它是一种现象。并发描述的是多进程同时运行的现象。但实际上,对于单核心CPU来说,同一时刻只能运行一个进程。
所以,这里的"同时运行"表示的不是真的同一时刻有多个进程运行的现象,这是并行的概念,而是提供一种功能让用户看来多个程序同时运行起来了,但实际上这些程序中的进程不是一直霸占CPU的,而是执行一会停一会。
所以,并发和并行的区别就很明显了。它们虽然都说是"多个进程同时运行",但是它们的"同时"不是一个概念。并行的"同时"是同一时刻可以多个进程在运行(处于running),并发的"同时"是经过上下文快速切换,使得看上去多个进程同时都在运行的现象,是一种OS欺骗用户的现象。
实际上,当程序中写下多进程或多线程代码时,这意味着的是并发而不是并行。并发是因为多进程/多线程都是需要去完成的任务,不并行是因为并行与否由操作系统的调度器决定,可能会让多个进程/线程被调度到同一个CPU核心上。只不过,调度算法会尽量让不同进程/线程使用不同的CPU核心,所以在实际使用中几乎总是会并行,但却不能以100%的角度去保证会并行。也就是说,并行与否程序员无法控制,只能让操作系统决定。
再次注明,并发是一种现象,之所以能有这种现象的存在,和CPU的多少无关,而是和进程调度以及上下文切换有关的。
总结一下,并发(concurrency)和并行(parallellism)是:
- 解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
- 解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
- 解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群
并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
并行在多处理器系统中存在,而并发可以在单处理器和多处理器系统中都存在,并发能够在单处理器系统中存在是因为并发是并行的假象,并行要求程序能够同时执行多个操作,而并发只是要求程序假装同时执行多个操作(每个小时间片执行一个操作,多个操作快速切换执行)。
所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。
「三分钟系列05」3分钟看懂并发与并行相关推荐
- 「Python爬虫系列讲解」三、正则表达式爬虫之牛刀小试
本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...
- 「Python爬虫系列讲解」七、基于数据库存储的 BeautifulSoup 招聘爬取
本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...
- 「Python爬虫系列讲解」八、Selenium 技术
本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...
- 「Python爬虫系列讲解」十二、基于图片爬取的 Selenium 爬虫
本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...
- 「Python爬虫系列讲解」十四、基于开发者工具 Network 的数据抓包技术
本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...
- 「Python爬虫系列讲解」十一、基于登录分析的 Selenium 微博爬虫
本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...
- 「微服务系列 13」熔断限流隔离降级
我们知道微服务分布式依赖关系错综复杂,比方说前端的请求转化为后端调用的服务请求,一个前端请求会转为成很多个后端调用的服务请求,那么这个时候后台的服务出现不稳定或者延迟,如果没有好的限流熔断措施,可能会 ...
- 【转帖】十分钟经济学--让你看懂中国经济形势
十分钟经济学--让你看懂中国经济形势 本文以最浅显的道理阐述经济的真相.还事实以清白,真相只有一个,让我们擦亮眼睛,洞观今天发生的一切.本文将在以下几方面阐述中国经济的真相. 1. 什么是经济发展? ...
- 「Python爬虫系列讲解」二、Python知识初学
本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...
- 计算机主板的结构平面草图,10分钟浓缩10年 教你看懂主板基本结构
什么?装机员又拿AM3的CPU往A88上面装了?隔壁老王又买了个H61来配i3-4160?这年头,玩DIY的人少,懂DIY的人也少,想当年啊--打住,还是不想当年了,来点实际的,10分钟浓缩10年,瞬 ...
最新文章
- ICLR2020 | 谷歌最新研究:用“复合散度”量化模型合成泛化能力
- 全球域名商解析新增保有量15强:爱名网落榜
- Blazor——Asp.net core的新前端框架
- [leetcode sort]56. Merge Intervals
- 清空 linux 服务器,Linux服务器清理
- Spark基础学习笔记11:Scala运算符
- Linux防火墙iptables配置详解
- linux系统移植步骤
- UNIX网络编程的5种IO模型
- 电影海报页面设计Html5,如何设计电影海报
- 《网络科学导论》——博弈模型笔记
- 100个开源C/C++项目中的bugs(一)数组和字符串处理的错误
- Verilog分频器
- .net 6项目使用DB First时报“Unable to resolve service for type......”的错
- 苹果开发者账号可以创建多少测试证书_苹果开发者账号对应生成的证书都有哪些...
- 任意文件读取与下载漏洞学习
- 红蓝攻防演练过程中零失陷经验分享
- 程序员35岁危机是一个善意的谎言,保持危机感但不用惊恐
- fabric-ca-client颁发Orderer节点证书
- 【Unity3D Shader编程】之一 夏威夷篇 游戏场景的创建 第一个Shader的书写