迅雷|Java:Java中的Fork/Join框架的并行编程基础

迅雷|Java:Java中的Fork/Join框架的并行编程基础

文章图片


随着近年来多核 CPU 的出现 , 并行编程是充分利用新处理工作资源的方式 。 并行编程是指由于多个处理核心的可用性 , 进程的并发执行 。 从本质上讲 , 与线性单核执行甚至多线程相比 , 这会极大地提高程序的性能和效率 。 Fork/Join 框架是 Java 并发 API 的一部分 , 该框架使程序员能够并行化算法 。 本文借助 Java 中可用的 Fork/Join 框架探索并行编程的概念 。

概述
并行编程具有更广泛的内涵 , 无疑是一个广阔的领域 , 可以用几行来阐述 。 问题的症结很简单 , 但在操作上却很难实现 。 简单来说 , 并行编程意味着编写使用多个处理器来完成任务的程序 , 仅此而已!它几乎与多线程的想法押韵 。 但是 , 请注意它们之间有一些重要的区别 。 从表面上看 , 他们是一样的 , 但实质却是完全不同的 。 事实上 , 引入多线程是为了提供一种并行处理的错觉 , 根本没有真正的并行执行 。 多线程的真正作用是它窃取了 CPU 空闲时间并利用它来发挥自己的优势 。
简而言之 , 多线程是任务的离散逻辑单元的集合 , 这些任务运行以获取它们的 CPU 时间份额 , 而另一个线程可能会暂时等待 , 例如 , 一些用户输入 。 空闲 CPU 时间最佳地在竞争线程之间共享 。 如果只有一个 CPU , 它是时间共享的 。 如果有多个 CPU 内核 , 它们也都是时间共享的 。 因此 , 一个最优的多线程程序通过巧妙的分时机制来挤压 CPU 的性能 。 本质上 , 总是一个线程使用一个 CPU , 而另一个线程正在等待 。 这以一种微妙的方式发生 , 用户会感觉到并行处理 , 实际上 , 处理实际上是快速连续发生的 。 多线程的最大优势在于它是一种最大限度地利用处理资源的技术 。 现在 , 这个想法非常有用 , 可以在任何一组环境中使用 , 无论是单个 CPU 还是多个 CPU 。 这个想法是一样的 。
另一方面 , 并行编程意味着程序员可以并行使用多个专用 CPU 。 这种类型的编程针对多核 CPU 环境进行了优化 。 今天的大多数机器都使用多核 CPU 。 因此 , 并行编程在当今非常重要 。 即使是最便宜的机器也安装了多核 CPU 。 看看手持设备;即使它们是多核的 。 尽管多核 CPU 的一切看起来都很笨拙 , 但这也是故事的另一面 。 更多的 CPU 内核是否意味着更快或更高效的计算?实际上 , 在日常计算中 , 即使是单个 CPU 也很难保持忙碌 。 但是 , 多核在特殊情况下也有其用途 , 例如在服务器、游戏等或解决大问题时 。 拥有多个 CPU 的问题在于 , 它需要的内存必须与速度与处理能力相匹配 , 以及闪电般快速的数据通道和其他附件 。 简而言之 , 日常计算中的多个 CPU 内核提供的性能改进不能超过使用它所需的资源量 。 因此 , 我们得到了一台未被充分利用的昂贵机器 , 可能只是为了展示 。

【迅雷|Java:Java中的Fork/Join框架的并行编程基础】并行编程
与多线程不同 , 其中每个任务都是较大任务的离散逻辑单元 , 并行编程任务是独立的 , 它们的执行顺序无关紧要 。 任务是根据它们执行的功能或处理中使用的数据来定义的;这分别称为功能并行或数据并行 。 在功能并行中 , 每个处理器处理其部分问题 , 而在数据并行中 , 处理器处理其部分数据 。 并行编程适用于不适合单个 CPU 架构的较大问题库 , 或者可能是问题太大以至于无法在合理的估计时间内解决 。 因此 , 任务在处理器之间分配时 , 可以相对较快地获得结果 。