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

标签 language-agnostic parallel-processing concurrency

并发编程和并行编程有什么区别?我问谷歌,但没有找到任何可以帮助我理解这种差异的东西。你能给我一个关于两者的例子吗?

现在我找到了这个解释:http://www.linux-mag.com/id/7411 - 但是“并发是程序的属性”与“并行执行是机器的属性”对我来说还不够 - 我仍然不能说什么是什么。

最佳答案

并发编程关注看似重叠的操作,并且主要关注由于非确定性控制流而产生的复杂性。与并发程序相关的定量成本通常是吞吐量和延迟。并发程序通常受 IO 限制,但并非总是如此,例如并发垃圾收集器完全在 CPU 上。并发程序的教学示例是网络爬虫。该程序发起对网页的请求,并在下载结果可用时同时接受响应,累积一组已访问过的页面。控制流是不确定的,因为每次运行程序时不一定以相同的顺序接收响应。这一特性使得并发程序的调试变得非常困难。有些应用程序基本上是并发的,例如Web 服务器必须同时处理客户端连接。 Erlang、F# asynchronous workflows 和 Scala 的 Akka 库可能是最有前途的高度并发编程方法。

多核编程是并行编程的一种特殊情况。并行编程涉及为了提高吞吐量的特定目标而重叠的操作。通过使控制流具有确定性,可以避免并发编程的困难。通常,程序会生成并行运行的子任务集,并且父任务仅在每个子任务完成后才继续。这使得并行程序比并发程序更容易调试。并行编程的难点是粒度和通信等问题的性能优化。后者在多核环境中仍然是一个问题,因为将数据从一个缓存传输到另一个缓存会产生相当大的成本。密集矩阵-矩阵乘法是并行编程的教学示例,可以通过使用 Straasen 的分而治之算法并并行解决子问题来有效解决。 Cilk 也许是最有前途的多核高性能并行编程方法,它已被 Intel 的 Threaded Building Blocks 和 Microsoft 的 Task Parallel Library(在 .NET 4 中)采用。

关于language-agnostic - 并发编程和并行编程有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1897993/

相关文章:

haskell - Par函数底层逻辑

javascript - 如何只处理许多并行 promise 中最后创建的?

Java用另一个对象监视一个对象

scala - 将消息发送到Scala中的函数

algorithm - 在有障碍物的网格上填充固定大小的正方形

algorithm - 查找数组中元素 >= k 的最大连续范围的次线性算法

c# - 为什么 C# 中不允许使用 const 参数?

mysql - 使用 R doParallel 或 foreach 从 mysql 并行获取数据

java - Java程序中有一个规则可以找出哪些对象可能并发访问?

python - 好的图遍历算法