示例说明多线程的两组概念:串行VS并行 和 并发VS顺发

2023-11-24 19:20

本文主要是介绍示例说明多线程的两组概念:串行VS并行 和 并发VS顺发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

顺发(Sequential)、并发(Concurrent)、串行(Serial)和并行(Parallel)都是多线程任务中的重要概念。由于多线程的复杂性,所以需要使用者有对这些概念有清晰尝试的认识。然而目前网上大量的文章描述的解释大多不是很清楚,甚至还有一些的解释或示例是错误的。因此,本文就这几个概述概念通过具体的实例进行解释。

顺发VS并发

顺发 (Sequential)

小李要参加一个会议,于是出门前先洗澡打扮,再开车到现场,参加了这个会议。我们发现有这几件事是顺序进行的:

洗澡 --> 打扮 --> 开车 --> 参会

这个过程有以下特点:

  1. 每件事情是按时间顺序发生;
  2. 任何两件事情都是独立的;
  3. 所有的事情均由同一个人完成。

所以,顺发的概念在多任务处理中,对应的就是1个处理器的核心,按顺序一件一件处理任务,即在任务执行时,只有当前任务完成才会开始下个任务

顺便,再以这个示例说一下并行:就在小李准备开会的过程中,会议的相关人员实际上已经开始工作了,比如:

小李:洗澡 --> 打扮 --> 开车 --> 参会 
主持人:准备会议进程 --> 主持会议
工作人员A:部署现场 --> 配合会议 --> 收拾会场
报告人:准备PPT --> 做报告 --> 问讨论

这个过程有以下特点:

  • 每个人都在顺发地执行自己的任务。
  • 任意两人都是完全同时可以做各自的任务。

所以,并行的概述也很清楚,即处理器的多个核心,同时独立地各自完成不同的任务。

并发 (Concurrent)

我们再举三个例:洗澡,来电话,吃东西,对于这三件事。A和B两人有不同的方式:
A:先洗澡,再打电话,最后吃东西
B:边洗澡,边打电话,边吃东西。

A就是顺发,即每件任务都是顺序发生,在一个任务没完成前,不开始另一个任务。这样在处理任务时就会发生阻塞,即另一任务的开始需要等等当前任务的结束。

而B则是并发方式,即可以在当前任务进行中时,随时切换到另一任务,如在吃东西的时候不能说话,但是吃完一口后,就切换到打电话的任务中,从而保证电话任务的正常运行;而在听电话,不吃东西的时候,又可以洗澡。总之,并发是多件任务看上去是同时在进行,实际上仍然是单个处理器在处理,只不过可以在多个任务中不断切换,从而能够有效避免阻塞。

由于任务切换是耗时的操作,所以在总任务量不变的情况下,并发的速度肯定没有顺发快。不过现代计算机发展非常快,任务切换的耗损已经基本可以忽略不计,所以并发的性能与顺发基本相同。所以两个任务顺序执行的话,先开始的任务一定会比后开始的先完成,而并发执行则不一定。

再附一张Erlang 之父 Joe Armstrong画的一张并发与并行原理示意图。
在这里插入图片描述

串行VS并行

一个项目的实现过程,基本就包括了串行和并行的内容。

串行 (Serial)

一个项目通常需要 设计、开发、测试和上线几个步骤,这几个过程肯定是串行的,即:

开始--->设计(10人天) --> 开发(200人天) --> 测试(20人天) -->结束

这三个过程是串行的,即如字面意思一样,可以串成一串来执行,不能同时进行。

并行 (Parallel)

在上面的示例中,虽然三个过程是串行的,但是开发过程本身是可以并行的。比如:

人员分配与任务安排 1天
开发人员1 40天
项目整合 2天
开发人员2 40天
开发人员3 40天
开发人员4 40天
开发人员5 40天

这样除了项目开始的规划用1天和项目整合用2天,这样200人天的工作5个开发人员40天完成,总用时是43天。

小结

最后用几个示例再总结一下四个概念:

  • 小李洗澡完了,再打电话,最后吃东西,这是串行顺发
  • 小李一边洗澡,一边打电话,一边吃东西,这是串行并发,需要指出的是这里的串行的并不是这三个任务,而这三个任务切片后的子任务的串行,即洗澡切片1 -->吃东西切片1--> 打电话切片1 --> 吃东西切片2 --> ...
  • 小李一边洗澡,一边吃东西,而同时小张帮小李打了电话,属于并行

所以,顺发和并发都是单核心的情况,而串行和并行是关于使用CPU核心数量问题:串心是单核心,而并行用了多核心。

最后,再补充一组概述:同步VS异步,强调的是方法调用,以下来自[2]

同步和异步通常用来形容方法的调用方式:

  • 同步方法一旦开始,调用者必须等待方法执行完成,才能继续执行后续方法。
  • 异步方法一旦开始,立即返回,调用者无需等待其中方法执行完成,就可以继续执行后续方法。
    通常我们写的方法都是同步方法,方法间执行都是串行化的,在一个线程内运行。
    举一个例子:
    你和朋友去吃饭,你们到达饭店,点了一桌满汉全席。由于你们饿的不行,就在饭店等待厨师做好菜,等菜上桌。你和你的朋友吃完饭,付了钱,舒舒服服的去商场购物了,一次饭局就结束了。这就是同步调用。
    如今,我们正处在互联网时代,当你们饿的时候,就打开饿了么,点了一桌满汉全席,支付了餐费,这时你就完成了点菜。商家接到了你的订单之后,就会马上开始安排(毕竟顾客就是上帝嘛)。现在你们无须默默等待,以免被饿所折磨,于是你们打开了京东,开始了新的购物。当饿了么小哥饭菜送到时,一签单就完事了,并且你们也完成了购物。这就是异步调用。

参考:
[1] 并发(concurrent)、并行(parallel)、顺序(sequential)、串行(serial)是什么 区别, https://blog.csdn.net/u013288190/article/details/114257211
[2] 同步和异步, https://blog.csdn.net/p_programmer/article/details/80878404

这篇关于示例说明多线程的两组概念:串行VS并行 和 并发VS顺发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/422432

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

高并发环境中保持幂等性

在高并发环境中保持幂等性是一项重要的挑战。幂等性指的是无论操作执行多少次,其效果都是相同的。确保操作的幂等性可以避免重复执行带来的副作用。以下是一些保持幂等性的常用方法: 唯一标识符: 请求唯一标识:在每次请求中引入唯一标识符(如 UUID 或者生成的唯一 ID),在处理请求时,系统可以检查这个标识符是否已经处理过,如果是,则忽略重复请求。幂等键(Idempotency Key):客户端在每次

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

log4j2相关配置说明以及${sys:catalina.home}应用

${sys:catalina.home} 等价于 System.getProperty("catalina.home") 就是Tomcat的根目录:  C:\apache-tomcat-7.0.77 <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" /> 2017-08-10

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器

zeroclipboard单个复制按钮和多个复制按钮的实现方法 最近网站改版想让复制代码功能在多个浏览器上都可以实现,最近看网上不少说我们的代码复制功能不好用的,我们最近将会增加代码高亮等功能,希望大家多多支持我们 zeroclipboard是一个跨浏览器的库类 它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的

Java并发编程之——BlockingQueue(队列)

一、什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作123 因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空