首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果在多线程服务器程序中运行并行代码,会发生什么情况?

如果在多线程服务器程序中运行并行代码,会发生什么情况?
EN

Stack Overflow用户
提问于 2019-06-28 10:38:25
回答 2查看 158关注 0票数 1

我大致理解了并行计算和并发计算之间的区别。如果我错了,请纠正我。

并行计算

如果一个系统能够支持两个或多个同时执行的动作,则称为并行。在并行编程中,效率是主要关注的问题。

并发计算

如果一个系统能够同时支持两个或多个正在进行的操作,则称为并发。但是,在并发编程中,不一定要同时执行多个操作。在并发编程中,模块化、响应性和可维护性是非常重要的。

我想知道,如果我在多线程程序中执行并行编程代码,会发生什么?,例如,在多线程服务器程序中使用的并行流。

该程序实际上是更有效的吗?

我最初的想法是,这可能不是一个好主意,因为一个经过某种方式优化的多线程程序应该已经占用了线程。这里的并行性可能会带来额外的开销。

EN

回答 2

Stack Overflow用户

发布于 2019-06-28 12:52:51

并发性和并行性之间的关键区别在于并发是同时处理许多事情(给出了并发性的错觉)或处理并发事件,本质上是隐藏延迟。相反,并行是为了提高速度而同时做很多事情。

两者都有不同的需求和用例。

并行是用来实现运行时性能和效率的,当然,由于它的本质,它会给系统(Cpu、ram等)增加一些额外的开销。但在当今的多核技术中,这一概念得到了广泛的应用。

票数 3
EN

Stack Overflow用户

发布于 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)
  • 可用的并发原语类型(线程、进程、绿色线程、epoll aysyncio等)
  • 您的系统资源(即CPU可用)
  • 应用程序并发原语如何映射到底层操作系统资源
  • 应用程序在任何给定时间拥有的并发原语的#

这个计划会不会更有效率呢?

这完全取决于此,唯一确定的答案是使用这两种解决方案在目标体系结构/系统上进行基准测试。

在我的经验中,关于复杂并发性的推理超出了基本模式的范围,这在很大程度上是一种暗箱操作。我相信这是一句名言:

让它起作用,使它正确,使它快点。 -肯特·贝克

来自于。在本例中,请确保您的程序是并发的、安全的(使其正确),并且没有死锁。然后开始测试,基准测试和运行实验。

在我有限的个人经验中,我发现分析在很大程度上超出了描述应用程序工作负载(CPU与IO)的特性,并找到了一种建模方法,以便您可以以可配置的基准测试方式来扩展您的系统的全部资源。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56805412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档