并发和并行之间的区别是什么?
当前回答
并发:如果一个处理器解决了两个或多个问题。
并行性:如果一个问题由多个处理器解决。
其他回答
并发性=>在共享资源的重叠时间段内执行多个任务时(可能最大化资源利用率)。
并行=>当单个任务被划分为可以同时执行的多个简单的独立子任务时。
假设你有一个有两个线程的程序。程序可以通过两种方式运行:
Concurrency Concurrency + parallelism
(Single-Core CPU) (Multi-Core CPU)
___ ___ ___
|th1| |th1|th2|
| | | |___|
|___|___ | |___
|th2| |___|th2|
___|___| ___|___|
|th1| |th1|
|___|___ | |___
|th2| | |th2|
在这两种情况下,我们都有并发性,这仅仅是因为我们有多个线程在运行。
如果我们在具有单个CPU内核的计算机上运行此程序,操作系统将在两个线程之间切换,允许一次运行一个线程。
如果我们在带有多核CPU的计算机上运行这个程序,那么我们就可以同时并行运行两个线程。
我非常喜欢Paul Butcher对这个问题的回答(他是《七周内的七个并发模型》的作者):
虽然它们经常被混淆,但并行性和并发性是不同的事情。并发性是问题域的一个方面代码需要同时处理多个(或接近同时)事件。相反,并行性是解决方案的一个方面您希望通过处理使程序运行更快的域并行处理问题的不同部分。有些方法是适用于并发,有些适用于并行,有些则适用于两者。了解您面临的问题,并选择合适的工具工作
同意:具有共享资源潜力的多个执行流
前任:两个线程竞争I/O端口。
视差:将问题分成多个相似的块。
前任:通过对文件的每一半运行两个进程来解析大文件。
简单示例:
并发是:“两个队列访问一台ATM机”
并行是:“两个队列和两台ATM机”
推荐文章
- foreach和map有区别吗?
- 设计模式:工厂vs工厂方法vs抽象工厂
- 为什么处理排序数组比未排序数组慢?
- 构造函数何时抛出异常是正确的?
- Thread start()和Runnable run()有什么区别
- 什么是“一级”对象?
- 什么时候应该使用Debug.Assert()?
- 为什么浮点数不准确?
- IOException:进程不能访问文件“文件路径”,因为它正在被另一个进程使用
- 地图和字典的区别是什么?
- 跳跃表vs.二叉搜索树
- 在Swift中,什么相当于Objective-C的“@synchronized”?
- 是AsyncTask真的概念上有缺陷或我只是错过了一些东西?
- 递归还是迭代?
- Stack Overflow如何生成其seo友好的url ?