并发和串行、并行的概念

article/2025/9/13 16:41:49

先抛开语言不管,只聊概念,说起并发,就很容易想到它和串行并行的区别。

串行:一次只能取得一个任务并执行这个任务,这个任务执行完后面的任务才能继续;

并发:指的是在同一个时间段内,多条指令在CPU上同时执行;

并行:指的是在同一时刻,多条指令在CPU上同时执行。

并发和并行都是为了充分利用 CPU 多核计算资源提出来的概念。并发程序其实并不要求 CPU 具备多核计算的能力,在同一时间段内,多个线程会被分配一定的执行时间片,在 CPU 上被快速轮换执行。

串行还是并发,这都是任务安排者视角看到的东西。前者要求你看到前一个任务结束了,下一个任务才能安排;而后者呢,你可以同时提交许多任务,执行者(们)之间会相互协调并自己安排执行顺序(但未必合理,比如可能出现死锁),你把任务安排下去就不用管了。相比之下,“并行”是任务执行者视角的东西,和前两者所处平面不同。

尤其是,纠正一个错误的观念:并不像一般人以为的“单核单线程没有并行”;事实上,哪怕用了单核单线程 CPU 的电脑,它上面也存在真正的“并行”。只不过,这个并行并不是 CPU 内部的、线程之间的并行;而是 CPU 执行程序的同时,DMA 控制器也在执行着网络报文收发、磁盘读写、音视频播放/录制等等任务。

典型案例:你买了个新硬盘,打算把自己的重要文件复制过去。于是你找到 music 目录,把所有的音乐文件夹选中,复制 50G 音乐到新硬盘;然后打开 photo 目录,把100G照片复制到新硬盘;又打开 mov 目录,把 800G 视频复制到新硬盘……

最后,你看到 Windows 显示了10个文件复制窗口;其中一个窗口的提示是“还有一千六百个文件待复制,需要三天零八小时七分钟三十二秒”。

这就是典型的“并发”任务。

在这个场景里,你同时启动了10个文件复制进程,帮你复制十大类文件。如果没有“并发”支持,你只能先复制一个文件夹,等上半小时,看它复制完了才能继续复制下一个。这当然很累人。一旦有了并发支持,你就能同时启动十个复制任务。在计算机忙碌的同时,你完全可以出去旅个游。

但是,细心的你可能会注意到:如果这十个文件复制任务没有分成十个进程去做,而是写个批处理甚至干脆用 Linux 的 dd 命令全盘复制,那么复制完所有文件只需五六个小时。这是因为,十个进程会彼此争抢资源;而每次进程执行权切换,硬盘就不得不重新寻道——这是非常非常浪费时间的。其结果,就是把本来五六个小时就能搞定的事情,争抢成了三天都搞不定……

换句话说,这里面没有并行,只有并发。

说的更清晰点,对电脑操作者,你的确是“并发”了十个任务;但对程序这个执行者来说,它们仍然是“串行”使用硬盘——进程1用200ms,交出控制权;换进程2用200ms硬盘,交出控制权;然后是进程3、4、5、6、7……

它们只是快速切换执行权、从而让你得到了一个“同时执行”的假象而已。

因此,对这类任务,其实你还是自己写个批处理更好。节省你的生命,也节省硬盘的使用寿命。

当然,如果你的两台电脑分别装了块新硬盘,显然它们对各自硬盘读写就是“并行”的,互不干扰。你完全可以用第三台电脑远程登陆上去,然后分别在两者上面启动各自的复制进程。只要没有数据相关,先让电脑A复制完再去捣鼓电脑B,这显然是不明智的。

类似的,同一台电脑里面,网卡收发信息和硬盘读写并不相关;CPU忙碌时让显卡空闲也是极大的浪费。换句话说,不同任务有不同的执行实体;那么我们当然不应该“在CPU上执行任务A”时“禁止任务B使用网卡”。没错,只要执行任务的硬件不同(包括但不限于不同的CPU核心、网卡A和网卡B、C、D、显卡、硬盘、打印机等等),它们就可以并行工作。

一个好的程序,一方面不应该在单个硬件上造成过多切换(比如在一块硬盘上同时开10个文件复制进程就是一种极其低效的使用方式),另一方面则要尽量利用每个空闲的硬件(比如任务A使用硬盘时应该允许任务B使用网卡),这才不至于降低执行效率、使得硬件使用不够充分。

综上,串行在执行单个简单任务时,执行速率是最高的。因为完全没有干扰,任何硬件想用就用。但是,串行方式的硬件利用率不高。比如当某个任务不需要使用打印机时,在它完成之前,打印机就只能闲置。

为了解决这个问题,我们首先要允许“并发”。“并发”的意思是,你可以同时提交多个任务,但系统并不能保证它们可以并行执行。甚至于,在极端的、类似“单个硬盘上同时启动10个复制进程”的场景里,“并发”反而引起了过多的切换动作,成几倍甚至几十倍的降低了文件复制效率——这种场景下,并发甚至要不如串行。

想要提高并发的效率,我们就必须深入进去,关注“这些任务之间究竟有没有出现并行”。比如,如果文件复制程序写的非常糙,那么很可能是“先从旧硬盘读取数据,然后写入新硬盘;数据写入新硬盘后,继续从旧硬盘读取数据”。这在单硬盘上是合理的,少了一些寻道操作;但在两块硬盘的场景下,这就相当于“串行使用两块硬盘”,这个利用效率显然太低了,每块硬盘只有50%左右的利用率(当然,现代OS会主动多读一些数据到磁盘缓存,这个机制可以有效提高硬盘利用率)。那么,如果同时启动两个复制进程,反而会不时出现“进程A读旧硬盘,同时进程B写新硬盘”这种场景,从而把每块硬盘的利用率提高到60%~80%。

换句话说,“并发”的确经常能让“并行”自然而然的出现,硬盘利用率也的确被提高了;只是这种提高缺乏保证(比如,运气不好时,复制进程A可能和进程B争着读取旧硬盘,从而导致很多不必要的寻道动作);而且,由于并发并不保证合理的执行顺序,反而经常“搬起石头砸自己的脚”。比如,一旦同时启动更多复制进程(比如三五个),那么过多的进程切换引起的过多的磁盘重新寻道动作就会抵消一切好处。

因此,很多时候,我们需要一个优秀的、头脑清醒的程序员;只有在他的有意识的安排下,才能在确保硬件利用率的同时、不因过多的争抢和切换降低执行效率。

参考:

并发和并行的区别

并发与并行的区别是什么? - 知乎

[并发概念] 串行、并行与并发_大唐雨夜的博客-CSDN博客_并行与串行的概念

Have Fun


http://chatgpt.dhexx.cn/article/nclDhWn3.shtml

相关文章

牛腩新闻发布--过程或函数 'news_selectByCaId' 需要参数 '@caid',但未提供该参数(二)

发现问题 之前有一篇博客是因为存储过程中没有添加相应的函数,导致出现了“过程或函数 ‘news_selectByCaId’ 需要参数 ‘caid’,但未提供该参数”,这次继续出现了这样一个问题,但是出现的错误就不再过程函数中了,而…

牛腩新闻发布--过程或函数 'news_selectByCaId' 需要参数 '@caid',但未提供该参数(三)

发现问题 这篇博客是建立在“牛腩新闻发布–过程或函数 ‘news_selectByCaId’ 需要参数 ‘caid’,但未提供该参数(二)”,因为在那篇博客中说出了我当时遇到的“过程或函数 ‘news_selectByCaId’ 需要参数 ‘caid’,…

【牛腩】-'T_news_selectByCaId' 需要参数 '@caid',但未提供该参数。”

问题截图 解决方案: 改动存储过程 BEGINselect n.id,n.title,n.createTime,c.[name],n.caId from T_news ninner join T_category c on n.caIdc.id and n.caIdcaidorder by n.createTime desc END检查传参是或否正确如果以上都没有错误,那就看一下是否…

【重要补充】关于第三方潜在SDK导致的5.1.2Data use sharing

接上一篇《关于IDFA、CAID和「5. 1.2 - Data use & sharing」》后,我们发现,苹果在14.5出来前,对于IDFA替代方案之数据收集的审核打击力度越来越大。 因5.1.2条款被拒,目前可以确认的原因有以下两大: 一、如果你…

spring笔记⑬——spring事务

事务的四个特征 CAID是事务的四个特征,所有事务都必须满足以下特性。 原子性(Atomicity):一个事务要么全部执行,要么不执行一致性(Consistency):事务的运行并不改变数据库中数据的一致性隔离性&#xff0…

SQL查询语句(内联,as,in,通配符)

最近在学习牛腩新闻发布系统,正如牛老师所说,作为一个优秀的.NET开发人员,对SQL语句不熟怎么能行呢,接下来就总结下牛老师写的存储过程中SQL语句,挺经典,举一反三 首先先展示出来适用于系统的三张表 新闻类…

【微信小程序 | 实战开发】配置微信小程序APPID并快速接入

写在前面: 你是否想要掌握人工智能的最新技术和应用?你是否想要成为未来社会的创新者和领导者?你是否想要和全球的优秀导师和同学一起学习和交流?如果你的答案是肯定的,那么欢迎来到床长人工智能教程网站,这里是你实现梦想的起点! 个人名片: 🐼作者简介:一名大一在校…

获取苹果收集设备ID的方法

目录 问题 解决 问题 如果我们想要通过工具获取苹果手机 iPhone 或者 iPad 的设备 ID,也就是 UDID。这个时候,很多人可能会问 UDID 是什么,UDID 是 iOS 设备的一个唯一识别码,每台 iOS 设备都有一个独一无二的编码,…

浅谈大数据广告下个人隐私保护,开发者视角的广告原理

本文已收录于 Github CodeClass 和 Gitee CodeClass 致力于打造高质量编程学习课堂,内含百篇原创技术文章,千本计算机开源电子书,谷歌、阿里大神开源 LeetCode 题解,各类编程学习资源,欢迎 star ,一起学习&…

简单理解MySQL的存储引擎

1、什么是存储引擎? 在说明存储引擎之前,首先你需要简单了解MqSQL的整体架构。 从上图可知,存储引擎位于整体架构的最底层。 存储引擎真正负责了MySQL中数据的存储和提取。 可以这样理解: 其实我们平时写的各种SQL语句相当于指…

iOS隐私新规如何破局?盗版SKAdnetwork可行吗?

背景:   在2020年的开发者大会上,苹果宣布iOS14设备将会在App首次打开时主动弹窗请求是否选择允许广告追踪,即被获取设备的IDFA。这也就意味着新系统需要用户手动选择允许,而旧系统是手动选择关闭,这一关键改变无异…

牛腩新闻发布--过程或函数 'news_selectByCaId' 需要参数 '@caid',但未提供该参数(一)

发现问题 今天敲击牛腩,在敲击Web页面的List.aspx之后,点击Ctrl+F5运行,发现运行不了,首先是数据库中调取数据有问题,因为这个数据是用存储过程调取的,所以需要修改存储过程,这时候只需要改成如下代码就行: 将这个更改完之后就可以在数据库中调取到应需要的数据了,但是…

【牛腩】DELETE 语句与 REFERENCE 约束“FK_news_category“冲突。该冲突发生于数据库“newssystem“,表“dbo.news“, column ‘caId‘

【前言】 牛腩中删除类别的时候会提示受到主外键的约束,导致无法删除这个类别。 【问题描述】 DELETE 语句与 REFERENCE 约束"FK_news_category"冲突。该冲突发生于数据库"newssystem",表"dbo.news", column ‘caId’。…

【牛腩】过程或函数 ‘news_selectByCaId‘ 需要参数 ‘@caid‘,但未提供该参数

【前言】 在运行牛腩的时候会有提示过程或者函数缺少参数。这个是因为存储过程中写的缺少参数,添加相应的参数就可以了。 【问题描述】 过程或函数 ‘news_selectByCaId’ 需要参数 ‘caid’,但未提供该参数 过程或函数 ‘news_selectByContent’ 需要…

关于IDFA、CAID和「5. 1.2 - Data use sharing」

今天,2021年3月18日,突然收到了之前从未遇到过的拒审邮件,邮件原文如下: 发件人 Apple 5. 1.2 - Data use & sharing Please review this information carefully as it impacts your app’s availability on the App Store a…

中国广告协会的CAID方案

前些时间看到一个消息,腾讯、百度和字节跳动测试工具绕开苹果的ATT(AppTrackingTransparency,简称 ATT,旨在保护用户隐私的应用追踪透明度框架),估计这个应该是在测试CAID。 过一两天又出现一个消息&#x…

微信H5链接包装

最近看到好多人问一个问题,就是在微信中发游戏链接给好友,让链接显示成一个抖音的样式,如下: 这种链接包装,做起来说难不难,说简单也不简单。网上很多服务商都可以做,不过靠谱程度就参差不齐了…

微信内 H5 页面自定义分享

起源: 最近公司在做一个活动的h5页面,在微信内打开时需要进行微信授权,然后后端会重定向到这个页面并且携带了一些参数(openid等)。问题是点击微信的原生分享时,会把携带的这些参数一起分享出去&#xff0…

H5容器技术方案

●●● Native开发原生应用是手机操作系统厂商(目前主要是苹果的iOS和google的Android)对外界提供的标准化的开发模式,他们对于native开发提供了一套标准化实现和优化方案。但是他们存在一些硬伤,比如App的发版周期偏长、有时无法…

H5的分享功能

在H5的 页面分享该活动给好友&#xff0c;代码如下&#xff1a; 1&#xff1a;需要添加 js引用&#xff1a; <script srchttp://res.wx.qq.com/open/js/jweixin-1.2.0.js></script> 2&#xff1a;需要添加对象&#xff1a; var wx require("weixin-js-sdk…