咬文嚼字之-并发与并行

2023-10-13 10:20
文章标签 并发 并行 咬文嚼字

本文主要是介绍咬文嚼字之-并发与并行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在学习过很多时髦的技术之后,越发觉得基本的理论概念是如此重要,虽然诸如并发/并行、同步/异步这种概念经常在各种场合被提及,但是语言的艺术加上理解的偏差,导致这些基本概念都很模糊。意识到这一点后,我的学习重心逐渐发生了变化,渐渐地,当了解到某项技术之后,我的第一反应,往往不是去查网络博客,而是wiki、rfc或少数经典理论书籍,搞懂这些概念也不再乏味。CS就像数学一样,具有很强的逻辑性,知识体系也不例外,这些基本概念就像欧氏几何一样坚不可摧,任何的时髦技术都无法绕过这些地基。

趁最近过年有时间,准备把自己之前模糊的概念理一理,这次只写并发与并行,或许比较粗浅,或许还有错误,欢迎挑战。

并发(concurrency)

引经据典老规矩,来自concurrency的wiki

In computer science, concurrency is the ability of different parts or units of a program, algorithm, or problem to be executed out-of-order or in partial order, without affecting the final outcome. This allows for parallel execution of the concurrent units, which can significantly improve overall speed of the execution in multi-processor and multi-core systems. In more technical terms, concurrency refers to the decomposability of a program, algorithm, or problem into order-independent or partially-ordered components or units of computation.

下面的内容不是对英文的翻译

并发是指程序、算法、请求在整体有序、局部乱序且不影响最终输出的情况下同时执行的能力,局部乱序是指事务执行单元在时间序上的乱序。比如,你洗衣服洗到一半去接电话,接完电话回来继续洗衣服,那么可以说这个过程是并发的,或者说你有处理并发的能力,从整体上来看,洗衣服和接电话两个事务在时间上产生了交错,但不影响这两个事务最终的完成。对于不支持并发的模型,电话另一端的人必须等你洗完衣服,他的呼叫才会被接听。




通过简化模型,可以更好的理解并发。现在我们在一个单核的处理器上来考虑并发,假设你洗衣服需要的时间是M,接电话需要的时间N,相比不支持并发的系统,你处理这两个事件的总时长并没有变化。区别在于电话呼叫端不需要等待。所以并发系统的优势相对于非并发系统来说,在于可以更及时地响应时间上存在重叠的多个任务。现实中提供这种能力的,是操作系统。在上面的例子中,洗衣服和接电话是任务,而执行这两个动作的人,可以类比为操作系统,这就是多任务操作系统的基本模型,或者称为分时操作系统。

在单核处理器模型下,如果期望提升整体的处理效率,就需要提升单个任务的执行效率,比如处理器的性能提升10%,这意味着你洗衣服和接电话花费的时间将变成0.9M和0.9N(当然我们没有考虑多任务操作系统自身的调度开销,毕竟洗衣服时,电话可能不在你身边,至少你也要擦擦手再接电话),这也是早期单核CPU时代很多发烧友热衷于超频的原因,因为除此之外,没有多少提升处理器性能的手段。直到主频提升带来了功耗问题,以及并行架构的逐渐成熟。

并行(parallelization)

Parallel computing is a type of computation in which many calculations or processes are carried out simultaneously. Large problems can often be divided into smaller ones, which can then be solved at the same time. There are several different forms of parallel computing: bit-level, instruction-level, data, and task parallelism. Parallelism has long been employed in high-performance computing, but has gained broader interest due to the physical constraints preventing frequency scaling. As power consumption (and consequently heat generation) by computers has become a concern in recent years, parallel computing has become the dominant paradigm in computer architecture, mainly in the form of multi-core processors.

同样,下面也不是英文的翻译,英文部分需要自己反复咀嚼揣摩。

并行是指一种同时处理多个计算或过程的计算模型。如上所述,主频提升面临的功耗问题,或许主频还有提升的空间,但相比并行计算的性价比不高,就像我们用很多低配置机器,做好任务的拆分,一样可以更快的做出MapReduce这样的海量运算,性能并不比昂贵的小型机差,当然这是宏观层面的并行了。虽然功耗是导致并行计算成为主流的原因之一,但我认为这里有更朴实的原因。




道理很简单,因为真实世界是并行的。我在写这篇文章时,你可以在洗衣服,ta可能在接电话。计算机用来解决人的问题,因此从单核向多核发展,是一个自然而然的结果,它是更符合真实世界的模型。虽然并发从操作系统层面,对真实世界进行了模拟,这是在多核或多处理器没有普及之前,对缺乏真实并行的一种弥补手段。但这并不代表并发不重要,相反在重度依赖电子设备的今天,爆炸的任务计算量是远超处理器(或处理核)数量的,是并发和并行同时支撑了这个真实世界。

定义与差异

According to Rob Pike, concurrency is the composition of independently executing computations, and concurrency is not parallelism: concurrency is about dealing with lots of things at once but parallelism is about doing lots of things at once. Concurrency is about structure, parallelism is about execution, concurrency provides a way to structure a solution to solve a problem that may (but not necessarily) be parallelizable.

这里看起来像是在玩文字游戏了(没错,这回我说的是英文部分,dealing和doing还是要细品一下),结合上面的内容,作为总结,给并发和并行下个定义。

  • 并发,指在时间上有重叠的不同任务在更细粒度(比如CPU时间片)时序上的重新编排,它不会缩短任务执行的总时长。时间片的均匀分配,让使用者认为自己独占了系统资源。实现并发的载体是操作系统基于CPU时钟分片建立的多任务系统。

  • 并行,指不同任务或同一任务的不同部分同时被处理的计算模型,它会线性缩短任务执行的总时长,实际的效果要看任务的计算量和子任务的分割优化度,可以称之为并行度。实现载体通常包括位并行处理器、SMP架构的通用处理器或类GPU的专用并行处理器等。

如Rob所说,并发是一种结构,或者说是一种同时处理多件事情的框架,而这种问题或许可以被并行更好的解决,但也不是必须的。就先写这么多吧,有新的理解再更新。

以上

引用

  • 1. Concurrent computing
  • 2. Parallel computing
  • 3. Symmetric multiprocessing
  • 4. Go Concurrency Patterns

这篇关于咬文嚼字之-并发与并行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

高并发环境中保持幂等性

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

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

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

java线程深度解析(五)——并发模型(生产者-消费者)

http://blog.csdn.net/Daybreak1209/article/details/51378055 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之

java线程深度解析(四)——并发模型(Master-Worker)

http://blog.csdn.net/daybreak1209/article/details/51372929 二、Master-worker ——分而治之      Master-worker常用的并行模式之一,核心思想是由两个进程协作工作,master负责接收和分配任务,worker负责处理任务,并把处理结果返回给Master进程,由Master进行汇总,返回给客

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理 秒杀系统是应对高并发、高压力下的典型业务场景,涉及到并发控制、库存管理、事务管理等多个关键技术点。本文将深入剖析秒杀商品业务中常见的几个核心问题,包括 AOP 事务管理、同步锁机制、乐观锁、CAS 操作,以及用户限购策略。通过这些技术的结合,确保秒杀系统在高并发场景下的稳定性和一致性。 1. AOP 代理对象与事务管理 在秒杀商品

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统,以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面,PostgreSQL采用了多版本并发控制(MVCC)机制,该机制为数据库提供了高效的数据访问和更新能力,同时保证了数据的一致性和隔离性。本文将深入解析PostgreSQL中的MVCC功能,探讨其工作原理、使用场景,并通过具体SQL示例来展示其在实际应用中的表现。 一、

使用协程实现高并发的I/O处理

文章目录 1. 协程简介1.1 什么是协程?1.2 协程的特点1.3 Python 中的协程 2. 协程的基本概念2.1 事件循环2.2 协程函数2.3 Future 对象 3. 使用协程实现高并发的 I/O 处理3.1 网络请求3.2 文件读写 4. 实际应用场景4.1 网络爬虫4.2 文件处理 5. 性能分析5.1 上下文切换开销5.2 I/O 等待时间 6. 最佳实践6.1 使用 as

Go并发模型:流水线模型

Go作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,Go并发模型有多种模式,通过流水线模型系列文章,你会更好的使用Go的并发特性,提高的程序性能。 这篇文章主要介绍流水线模型的流水线概念,后面文章介绍流水线模型的FAN-IN和FAN-OUT,最后介绍下如何合理的关闭流水线的协程。 Golang的并发核心思路 Golang并发核心思路是关注数据流动。数据流动的过程交给cha

Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentLinkedDeque

文章目录 ConcurrentLinkedDeque特点构造方法常用方法使用示例注意事项 ConcurrentLinkedDeque ConcurrentLinkedDeque 是 Java 并发工具包(java.util.concurrent 包)中的一个线程安全的双端队列(Deque)实现,实现了 Deque 接口。它使用了链表结构,并且针对高并发环境进行了优化,非常适合

并发线程基础(一)

一、多个线程多个锁(lock) 概念:每个线程拿到自己的锁之后,获取线程锁之后,执行synchronized方法内的内容。      (一)synchronized 重入          概念:我比较喜欢通过自己的语言去记住和简化概念,重入:也叫“递归锁”,指同一个线程的外层方法获得锁之后,该方法里面调用修饰锁的方法,仍然可以获取锁,相互不受影响的。           语言话:同个类中