我大致理解了并行计算和并发计算之间的区别。如果我错了,请纠正我。
并行计算
如果一个系统能够支持两个或多个同时执行的动作,则称为并行。在并行编程中,效率是主要关注的问题。
并发计算
如果一个系统能够同时支持两个或多个正在进行的操作,则称为并发。但是,在并发编程中,不一定要同时执行多个操作。在并发编程中,模块化、响应性和可维护性是非常重要的。
我想知道,如果我在多线程程序中执行并行编程代码,会发生什么?,例如,在多线程服务器程序中使用的并行流。
该程序实际上是更有效的吗?
我最初的想法是,这可能不是一个好主意,因为一个经过某种方式优化的多线程程序应该已经占用了线程。这里的并行性可能会带来额外的开销。
发布于 2019-06-28 12:52:51
并发性和并行性之间的关键区别在于并发是同时处理许多事情(给出了并发性的错觉)或处理并发事件,本质上是隐藏延迟。相反,并行是为了提高速度而同时做很多事情。
两者都有不同的需求和用例。
并行是用来实现运行时性能和效率的,当然,由于它的本质,它会给系统(Cpu、ram等)增加一些额外的开销。但在当今的多核技术中,这一概念得到了广泛的应用。
发布于 2019-06-28 14:05:16
我想知道,如果我在多线程程序中执行并行编程代码,会发生什么?例如,在多线程服务器程序中使用Java的并行流。
根据我对Java运行时的有限知识,每个程序都是多线程的,应用程序入口点是沿着其他运行时线程(gc)运行的gc线程。
假设您的应用程序生成两个线程,并在其中一个线程中创建一个parallelStream。看起来,parallelStreams api使用了一个启动NUM_PROCESSES -1线程的ForkJoinPool.commonPool。此时,您的应用程序可能有比CPU更多的线程,因此,如果您的parallelStream计算是受CPU约束的,那么您已经在线程上超额订阅了-> CPU。
https://stackoverflow.com/a/21172732/594589
我不熟悉java,但有趣的是parallelStream共享相同的线程池。因此,如果您的程序生成了另一个线程并启动了另一个parallelStream,那么第二个parallelStream将与第一个线程共享底层线程池线程!
在我的经历中,我发现很重要的一点是:
这个计划会不会更有效率呢?
这完全取决于此,唯一确定的答案是使用这两种解决方案在目标体系结构/系统上进行基准测试。
在我的经验中,关于复杂并发性的推理超出了基本模式的范围,这在很大程度上是一种暗箱操作。我相信这是一句名言:
让它起作用,使它正确,使它快点。 -肯特·贝克
来自于。在本例中,请确保您的程序是并发的、安全的(使其正确),并且没有死锁。然后开始测试,基准测试和运行实验。
在我有限的个人经验中,我发现分析在很大程度上超出了描述应用程序工作负载(CPU与IO)的特性,并找到了一种建模方法,以便您可以以可配置的基准测试方式来扩展您的系统的全部资源。
https://stackoverflow.com/questions/56805412
复制相似问题