并发编程和并行编程有什么区别?

esaepe 发布于 2019-11-10 concurrency 最后更新 2019-11-10 12:11 94 浏览

并发编程和并行编程有什么区别?我问谷歌,但没有发现任何有助于我理解这种差异的东西。你能举两个例子吗? 现在我发现了这个解释:http://www.linux-mag.com/id/7411 - 但是“并发是程序的一个属性”vs“并行执行是机器的一个属性”对我来说还不够 - 仍然不能说什么是什么。

已邀请:

mut

赞同来自:

我在一些博客中发现了这个内容。认为它是有用的和相关的。 并发和并行不是一回事。如果两个任务在时间上执行的顺序没有预先确定,则两个任务T1和T2是并发的, T1可以在T2之前执行并完成, T2可以在T1之前执行并完成, T1和T2可以在相同的时间(并行)时同时执行, T1和T2可以交替执行, ... 如果操作系统调度两个并发线程在一个单核非SMT非CMP处理器上运行,则可能会获得并发但不能并行。在多核,多处理器或分布式系统上可以实现并行性。 并发通常被称为程序的属性,并且是比并行性更通用的概念。 资料来源:https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming

jeum

赞同来自:

鉴于来自处理器,可以通过该pic描述 In view of from processor, It can be described by this pic In view of from processor, It can be described by this pic

cut

赞同来自:

并发是程序的属性,并行执行是机器的属性。并行部分应该和不应该并行执行只有在确切的硬件已知时才能回答。在处理显式并行编程时,我可能想要添加导致最不愉快的结论,并不能保证显式并行程序的效率和可移植性。

xnam

赞同来自:

我相信并发编程是指多线程编程,它是关于让你的程序运行多个线程,从硬件细节中删除。 并行编程是指专门设计程序算法以利用可用的并行执行。例如,您可以并行执行某些算法的两个分支,期望它比您第一次检查第一个分支然后第一个分支时更快(平均)命中结果。

out

赞同来自:

内容太长未翻译

hrerum

赞同来自:

如果你使用线程编程(并发编程),它不一定会被执行(并行执行),因为它取决于机器是否可以处理多个线程。 这是一个直观的例子。非线程机器上的线程:

        --  --  --
     /              \
>---- --  --  --  -- ---->>
线程机器上的线程:
     ------
    /      \
>-------------->>
破折号表示执行的代码。如您所见,它们分开并分别执行,但线程机器可以同时执行多个单独的部分。

wsint

赞同来自:

并发编程考虑了看似重叠的操作,主要关注由于非确定性控制流而引起的复杂性。与并发程序相关的定量成本通常是吞吐量和延迟。并发程序通常是IO绑定但不总是,例如,并发垃圾收集器完全在CPU上。并发程序的教学示例是Web爬行程序。该程序启动对网页的请求,并在下载结果可用时同时接受响应,累积已经访问过的一组页面。控制流是不确定的,因为每次运行程序时,响应不一定以相同的顺序接收。这种特性使得调试并发程序变得非常困难。一些应用程序基本上是并发的,例如Web服务器必须同时处理客户端连接。 Erlang可能是即将推出的高度并发编程语言。 并行编程涉及为提高吞吐量的特定目标而重叠的操作。通过使控制流确定性来避免并发编程的困难。通常,程序产生并行运行的子任务集,而父任务仅在每个子任务完成后继续。这使得并行程序更容易调试。并行编程的难点在于关于粒度和通信等问题的性能优化。后者在多核上下文中仍然是一个问题,因为将数据从一个缓存传输到另一个缓存有相当大的成本。密集矩阵 - 矩阵乘法是并行编程的一个教学实例,它可以通过使用Straasen的分而治之算法并行地攻击子问题来有效地求解。 Cilk可能是共享内存计算机(包括多核)上最有前途的高性能并行编程语言。

hipsum

赞同来自:

虽然还没有完整 关于并行和并发术语之间区别的协议, 许多作者做出以下区分:

  • 在并发计算中,程序是指任何时刻都可以进行多项任务的程序。
  • 在并行计算中,程序是多个任务密切配合的程序 解决问题。
所以并行程序是并发的,但是多任务操作系统之类的程序也是并发的,即使它在一台机器上运行也是如此。 只有一个核心,因为任何时刻都可以进行多项任务。 资料来源:并行编程简介,Peter Pacheco

ea_qui

赞同来自:

并行编程在代码同时执行且每次执行独立于另一个时发生。因此,通常没有关于共享变量的预先伪装,因为这不会发生。 然而,并发编程包括由共享变量等的不同进程/线程执行的代码,因此在并发编程时我们必须建立某种规则来决定首先执行进程/线程,我们希望这样做以便我们可以确定会有保持一致,我们可以肯定地知道会发生什么。如果没有控制权并且所有线程同时计算并将事物存储在相同的变量上,那么我们最终会知道会发生什么?也许一个线程比另一个线程更快,也许其中一个线程甚至在执行过程中停止,而另一个线程继续使用损坏的(尚未完全计算的)变量进行不同的计算,可能性是无穷无尽的。在这些情况下,我们通常使用并发编程而不是并行编程。

godio

赞同来自:

  • Concurrent programming is in a general sense to refer to environments in which the tasks we define can occur in any order. One task can occur before or after another, and some or all tasks can be performed at the same time.
  • Parallel programming is to specifically refer to the simultaneous execution of concurrent tasks on different processors. Thus, all parallel programming is concurrent, but not all concurrent programming is parallel.
资料来源:PThreads Programming - A POSIX Standard for Better Multiprocessing, Buttlar, Farrell, Nichols

kaut

赞同来自:

1。定义: 经典的任务安排可以是SERIALPARALLELCONCURRENT SERIAL: 分析显示任务必须一个接一个地执行,在已知的序列欺骗顺序或它将无法工作。 即:足够简单,我们可以忍受这个 PARALLEL:分析显示任务必须同时执行 或者它不起作用
  • 任何任务的失败 - 无论是在功能上还是在时间上 - 都将导致系统完全失效。
  • 所有任务必须具有共同的可靠时间感。
即:尽量避免这种情况,否则我们会因下午茶而流泪。 CONCURRENT.分析显示我们 NEED NOT CARE 。我们并不粗心,我们已经分析了它并没关系;因此,我们可以随时使用任何可用设施执行任何任务。 I.e。:HAPPY DAYS
通常,调度可用已知事件的变化,我称之为状态变化。

2。这不是 {软件|编程}功能系统设计方法: 人们通常认为这是关于软件的,但它实际上是一个早期计算机之前的系统设计概念 软件系统的使用速度有点慢,甚至很少有软件语言试图解决这个问题。 如果您对一个好的尝试感兴趣,可以try looking TRANSPUTER language occam。 (occam具有许多主要创新(如果不是首屈一指)的功能,包括对PARSER代码部分执行构造函数的显式语言支持,其他语言主要在近年来可用的大规模并行处理器阵列时代受到影响,重新发明轮子InMOS Transputers使用超过35年前(!!!))

3。多好的系统设计需要注意: 简而言之,系统设计解决了以下问题: 动词 - 你在做什么。 (操作或算法) NOUN - 你在做什么呢? (数据或接口) WHEN - 启动,计划,状态更改,SERIALPARALLELCONCURRENT 在哪里 - 一旦你知道事情何时发生,你就可以说出它们可能发生的地方,而不是之前。 为什么 - 这是一种方法吗?还有其他方法吗?有最好的方法吗? ..最后但并非最不重要.. 如果你不这样做会发生什么?

4。 PARALLEL SERIAL 方法的视觉示例: Recent Parallel architectures available in 2014 in action on arrays of 16-, 64-, 1024- parallel RISC uP-s Quarter of century back - a part of the true parallel history with Inmos Transputer CPU demo video from the early 1990s 祝你好运

lsint

赞同来自:

In programming, concurrency is the composition of independently executing processes, while parallelism is the simultaneous execution of (possibly related) computations.
- Andrew Gerrand -
Concurrency is the composition of independently executing computations. Concurrency is a way to structure software, particularly as a way to write clean code that interacts well with the real world. It is not parallelism. Concurrency is not parallelism, although it enables parallelism. If you have only one processor, your program can still be concurrent but it cannot be parallel. On the other hand, a well-written concurrent program might run efficiently in parallel on a multiprocessor. That property could be important...
- Rob Pike -
为了理解这种差异,我强烈建议看看这个Rob Pike(Golang创作者之一)的视频。 'Concurrency Is Not Parallelism'

iid

赞同来自:

https://joearms.github.io/published/2013-04-05-concurrent-and-parallel-programming.html Concurrent =两个队列和一台咖啡机。 平行=两个队列和两台咖啡机。

tquod

赞同来自:

我明白区别是: 1)并发 - 使用共享资源串联运行 2)并行 - 使用不同的资源并排运行 因此,你可以让两件事情在彼此独立的情况下同时发生,即使他们在第(2)点或两件事情中聚集在一起,在整个正在执行的操作中使用相同的储备(1)。

ueaque

赞同来自:

将原始问题解释为并行/并发计算而不是编程。 在并发计算中,两个计算都彼此独立地前进。第二个计算不必等到第一个计算结束才能推进。然而,它没有说明如何实现这一目标的机制。在单核设置中,需要在线程之间挂起和交替(也称为抢占式多线程)。 在并行计算中,两个计算同时进行 - 即字面上同时进行。单CPU不可能实现这一点,而是需要多核设置。

suspending and taking turns versus parallel computing
根据:"Parallel vs Concurrent in Node.js"