原文:发表于 2013 年 8 月 26 日 由 三石

0. 处理器发展和需求背景

  回想一下并发开发的初衷,其实可以说是有两点,或者说可以从两个方面看。

  • 对于单核的处理器来说,在进行IO操作等比较费时的操作进行时,如果执行任务的方式是单任务的,那么CPU将会“空转”,直到IO操作结束。如果有多任务的调度机制,则在一个任务不需要CPU支持的时候,CPU可以被调度处理其他任务。简单地讲,并发可以提高CPU计算资源的利用率。

  • 对于多核,或者多个计算资源的情况下,并发可以在某种程度上达到“并行”,即同时运行,缩短了任务完成的时间,提高了任务完成的效率。

  我们再来看一下处理器计算能力的发展(讲并发或者并行基本都要提到),Intel的创始人之一Gordon Moore曾经说过一句话,大概意思是:当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。

  我们可以这样理解,处理器的计算能力在一定意义上和芯片上集成的晶体管数量有关,而这项集成技术的发展史飞快的。但是,什么事情都是有一个极限的,提升计算性能仅仅靠增加晶体管数量提高处理器主频是不现实的,于是多核处理器的概念就出来了。随着在硬件上多核处理器的发展和广泛使用,软件开发上的变革也在进行。简单来想,对于多个不相关的小任务来讲,可以分派到不同的处理器核心来进行处理。然而,对于一个比较大的任务,如何能够充分利用多核计算资源就是一个值得考虑的问题。解决这个问题的办法就是“分而治之”,而Fork Join正式这样一种思路的产物。

1. Fork Join 的设计简介

  看过《Introduction to Algorithms》(《算法导论》)的朋友们应该还记得,在讲到归并排序(Merge Sort)和快速排序的时候,有一种很简单又很有效率的思路就是“分而治之”,即“分治法”。而Fork Join的思路也是同理,只不过划分之后的任务更适合分派给不同的计算资源,可以并行的完成任务。

  

2. Fork Join 设计要点

  Fork Join设计出来就是为了提高任务完成的效率,围绕这个目标,有一些要点是设计中需要考虑的,下面就给出一些要点。

  • 线程的管理和线程的单纯性。基于如上的设计思路,我们可以看到子任务之间的相关性是相对比较简单的,可以并行处理。为了提高效率,并不需要重量级的线程结构和对应的线程维护,线程实现简单就好,满足需求即可,降低维护成本。

  • 队列机制,硬件支持一定是比较有限的,那么分解的任务应该用队列维护起来,一个好的队列设计是很有必要的。

  • “工作窃取”,也就是设计论文原文中提到的 Work Stealing 。对于负载比较轻的线程,可以帮助负载较重的执行线程分担任务。

  对于使用Fork Join的开发者来讲,需要注意:

  • 可用线程数和硬件支持。线程这东西,也是有开销的东西,绝对不是越多越好,尤其在硬件基础有限的情况下。

  • 任务分解的粒度。和前者有关系,就是分解的任务,“小”到什么程度是可以接受的,不可再分。

3. Fork Join数据结构支持

  按照如上设计,分解执行一个大的任务,Fork Join至少需要考虑如下一些数据结构。

  • 轻量级的线程结构。

  • 维护线程的线程池,负责线程的创建,数量维护和任务管理。

  • 维护任务,并支持Work Stealing的双端队列。如下图。

  对于子任务的分解,可以从后端取出分解再放入,而对于WorkStealing则可以从头部取出,放入其他队列的尾部。到此,本文仅仅是对Fork Join的大致设计思路做一个描述、勾勒。下一篇文章中会对JDK1.7中给出的实现作出分析。

转载于:https://www.cnblogs.com/wxgblogs/p/5477059.html

Java7中的ForkJoin并发框架初探(上)——需求背景和设计原理相关推荐

  1. [转]Java7中的ForkJoin并发框架初探(上)——需求背景和设计原理

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp83 这篇我们来简要了解一下JavaSE7中提供的一个新特性 -- For ...

  2. Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析

    为什么80%的码农都做不了架构师?>>>    根据前文描述的Doug Lea的理论基础,在JDK1.7中已经给出了Fork Join的实现.在Java SE 7的API中,多了Fo ...

  3. #Python3中tornado高并发框架

    Python3中tornado高并发框架 简介: Tornado是一种 Web 服务器软件的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别 ...

  4. SAP CRM One Order框架里旧式的索引表设计原理

    本文介绍SAP CRM One Order框架里旧式的索引表设计原理. Created by Wang, Jerry on May 17, 2017 要获取更多Jerry的原创文章,请关注公众号&qu ...

  5. java中的saturn_Saturn分布式调度平台系列:高屋建瓴之设计原理简析

    由于业务系统中使用了Saturn作为分布式调度平台并且计划对其作二次开发,因此看了官方文档及源码,简单做了梳理与总结.Saturn是唯品会开源的一款定时任务调度平台,相对于传统的Spring Batc ...

  6. 并发框架Disruptor(核心概念 入门 高性能原理-伪共享 CAS 环形数据 生产和消费模式 高级使用 )

    并发框架Disruptor 并发框架Disruptor Disruptor概述 背景 什么是Disruptor 为什么使用Disruptor Disruptor 的核心概念 Ring Buffer S ...

  7. java中fork函数_java中的forkjoin框架的使用

    fork join框架是java 7中引入框架,这个框架的引入主要是为了提升并行计算的能力. fork join主要有两个步骤,第一就是fork,将一个大任务分成很多个小任务,第二就是join,将第一 ...

  8. 来,带你鸟瞰 Java 中的并发框架!

    来自 ImportNew,作者:唐尤华 https://dzone.com/articles/a-birds-eye-view-on-java-concurrency-frameworks-1 1. ...

  9. 互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!

    1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库. 但是,当深入实现细节时,我们想起了一位智者曾经说过 ...

最新文章

  1. “package ‘ElemStatLearn‘ is not available for this version of R
  2. html中纯js互斥按钮,JS如何实现checkbox互斥功能
  3. HarmonyOS之数据管理·轻量级偏好数据库的应用
  4. 关于 Orbeon form PE 版本 Unauthorized 错误消息
  5. ajax mysql搜索_京东分页优化之Mysql优化实践
  6. 小程序--显示图形效果
  7. camera---(3)双camera 生态链
  8. android内存测试方法,Android内存测试方法.doc
  9. 【渝粤题库】陕西师范大学200561 英语写作(一) 作业
  10. 【agc006f】Blackout(神仙题)
  11. xshell用ssh连接VMware中的ubuntu
  12. 2021年低压电工模拟考试题库
  13. 标准纸张尺寸 国际标准(ISO 216)
  14. 政务终端安全管理的三个视角
  15. FlashBuilder找不到所需要的AdobeFlashPlayer调试器版本的解
  16. adb和frida的一点简单使用记录
  17. matlab 分类学习工具箱 Classification Learner的使用及导出其生成的图,混淆矩阵confusion matrix的画法
  18. 容器化与无状态微服务等
  19. 漫谈数据保护和个人信息加密
  20. 质量管理知识点大盘点(之二)

热门文章

  1. mybatis generator用法
  2. 全国省市区县数据库脚本
  3. 新時代的開端:DELPHI.NET- 語言篇
  4. Tomcat6下使用jBPM-4出现 java.lang.LinkageError。javax/el/ExpressionFactory解决办法
  5. hdu4920 矩阵乘法%3
  6. hdu4807枚举费用流
  7. 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )
  8. 【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )
  9. 【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )
  10. 【Android 异步操作】AsyncTask 异步任务 ( FutureTask 模拟 AsyncTask 执行过程 | AsyncTask 执行过程回顾 | FutureTask 分析 )