并发编程和并行编程有什么区别?
并发编程和并行编程有什么区别? 我问谷歌,但没有发现任何有助于我理解这种差异的东西。 你能举两个例子吗?
现在我发现了这个解释:http://www.linux-mag.com/id/7411 - 但“并发是程序的一个属性”vs“并行执行是机器的属性”对我来说是不够的 - 我还不能说什么是什么。
如果你使用线程编程(并发编程),它不一定会像这样执行(并行执行),因为它取决于机器是否可以处理多个线程。
这是一个视觉例子。 非线程机器上的线程:
-- -- --
/
>---- -- -- -- -- ---->>
线程机器上的线程:
------
/
>-------------->>
破折号表示执行的代码。 正如你所看到的,它们都是分开执行的,但是线程化的机器可以一次执行几个独立的部分。
并发编程涉及似乎重叠的操作,主要关注由于非确定性控制流而产生的复杂性。 与并发程序相关的定量成本通常都是吞吐量和延迟。 并发程序往往是IO界限,但并非总是如此,例如并发垃圾收集器完全在CPU上。 并发程序的教学例子是一个网络爬虫。 该程序启动对网页的请求,并在下载结果可用时同时接受响应,并累积一组已经访问过的页面。 控制流是非确定性的,因为每次程序运行时,响应不一定以相同的顺序接收。 这个特性会使调试并发程序变得非常困难。 某些应用程序基本上是并发的,例如Web服务器必须同时处理客户端连接。 Erlang也许是高度并发编程中最有前途的语言。
并行编程涉及为了提高吞吐量的特定目标而重叠的操作。 通过使控制流确定性避免了并发编程的困难。 通常情况下,程序产生并行运行的子任务集合,并且只有每个子任务完成后,父任务才会继续。 这使并行程序更容易调试。 并行编程的难点在于关于粒度和通信等问题的性能优化。 后者在多核环境中仍然是一个问题,因为将数据从一个缓存传输到另一个缓存会产生相当大的成本。 密集矩阵乘法是并行编程的教学实例,它可以通过使用Straasen的分治算法并行地攻击子问题来有效解决。 Cilk可能是在共享内存计算机(包括多核)上进行高性能并行编程的最有前途的语言。
https://joearms.github.io/published/2013-04-05-concurrent-and-parallel-programming.html
并发=两个队列和一台咖啡机。
并行=两个队列和两台咖啡机。
链接地址: http://www.djcxy.com/p/2239.html上一篇: What is the difference between concurrent programming and parallel programming?
下一篇: What is the difference between a deep copy and a shallow copy?