并发编程中的重重量级模型和轻量级模型

使用轻量级并发开发

不管是Amdahl定律还是Gustafson的定律都没有考虑引入并发需要付出的额外开销。同时也没有考虑那些可以将顺序代码转变成可以利用并行优势的算法的设计模式。重要的是减少程序中必须执行的顺序代码,改善对并行执行单元的利用。

以前的.NET 版本,如果你想在一个进程内并行执行C#应用程序,你必须创建和管理多线程(软件线程)。所以,你必须编写复杂的多线程代码。分解算法到多个线程上,协调不同的代码单元,在它们之间共享信息,并且收集执行结果确确实实是一件复杂的编程工作。随着逻辑核心的增多,情况变得甚至更糟了,因为你需要更多的线程来获取更好的可伸缩性。

多线程模型的设计并不是为了帮助开发人员应对多核革命的。事实上,创建一个新的线程需要很多很多的处理器资源,并且把每一个算法分解到并行的线程上会引入很多的开销。大多有用的结构和类的设计并不能被不同的线程同时访问,所以必须添加很多的代码处理这种情况。这些额外的代码是开发人员难以专注主要目的:利用并行执行改善程序性能。

因为这种多线程模型处理多核并发太复杂了,所以这就是众所周知的重量级并发模型。这引入了额外的负担。由于在框架级别缺乏对多线程互访的支持,为了解决这个问题需要添加太多的代码,这使代码异常的难理解。

前面提到的与先前.NET提供的多线程模型有关的问题和现代微处理器不断增加的逻辑核心的数目,促使创建新的模型编写并发代码。新的模型就是众所周知的轻量级并发模型,因为它减少了在不同的逻辑核心上创建和执行代码的代价。但是这并不意味着它消除了引入并发导致的所有代价,但是这个模型是为现在多核微处理器的开发设计的。重量型并发模型是在多处理器时代产生的,当时一个电脑可以有很多个只有一个物理核心的微处理器。轻量级并发模型考虑了某些物理核心支持很多逻辑核心的架构。

轻量级并发模型并不仅仅是调度不同物理核心的负载。它同时增加了对框架级别多线程互访问的的支持,同时使代码更加简单易于理解。

几乎所有的现代编程语言都将要转向支持轻量型的并发模型。幸运的.Net 4就是其中的一员。所以,所有可以生成.NET应用程序的托管语言都可以利用这种新的模型。

创建良好的基于任务模型的设计

有的时候,你必须优化一个已存的解决方案以便充分利用并行的特性。在这种情况下,有必须理解已经存在的串行设计,理解采用的并行算法是否会降低伸缩性,否则你必须进行重构以在不引入问题或者产生不同结果情况下获取性能的提升。你可以将问题的一部分或者整个问题创建基于任务模型的设计,然后你就可以引入并行了。当你设计新的解决方案的时候,也可以应用相同的技术。

依据以下步骤你可以创建有效的基于任务模型的设计:

1.      将每个问题分解成很多的小问题,并且忘记有关串行执行的东西。

2.      向下面一样考虑与每个子问题有关的东西:

可以并发处理的数据,就将数据进行分解实现并发。

需要很多任务和一些复杂并行处理的数据,就分解这些数据和任务来实现并发。

可以并行执行的任务,就分解这些任务来实现并发。

3.      组织你的设计展现并发意图。

4.      确定串联不同子问题需要的任务。尽量的避免产生依赖。

5.      时刻谨记以并发和潜在的并行思想进行设计。

6.      分析并行问题的执行计划需要考虑现在的多核微处理器和将来的架构。为获取更好的伸缩性进行设计。

7.      尽可能的最小化危险的部分。

8.      无论何时,尽可能的使用基于任务模型实现并发编程。

9.      协调步调,不断迭代重复这些步骤。

前面提到的步骤并不意味着所有的子问题都可以成为运行在不同的线程上的并行任务。

当编写代码的时候,根据性能和伸缩性的目标,设计需要考虑并行的可能性,并选择最好设计。并行的思想、将工作分解成不同的任务来完成是很重要的。以这种方式,你就可以根据需要将你的代码并行化。如果你有一个经典的串行执行的设计,通过使用基于任务模型的编程技术使其并行化需要付出很大努力。

转载于:https://www.cnblogs.com/wufengtinghai/archive/2012/06/10/2544307.html

并发编程中的重重量级模型和轻量级模型相关推荐

  1. Java并发编程中的若干核心技术,向高手进阶

    来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...

  2. java内存栅栏_内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术

    我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听说这一层面,下面我们就来讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见 ...

  3. Go并发编程中的那些事[译]

    原文地址:Concurrent programming 原文作者:StefanNilsson 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:kobehah ...

  4. volatile关键字——保证并发编程中的可见性、有序性

    文章目录 一.缓存一致性问题 二.并发编程中的三个概念 三.Java线程内存模型 1.原子性 2.可见性 3.有序性 四.深入剖析volatile关键字 1.volatile关键字的两层语义 2.vo ...

  5. Java的并发编程中的多线程问题到底是怎么回事儿?

    转载自   Java的并发编程中的多线程问题到底是怎么回事儿? 在我之前的一篇<再有人问你Java内存模型是什么,就把这篇文章发给他.>文章中,介绍了Java内存模型,通过这篇文章,大家应 ...

  6. synchronized 异常_由浅入深,Java 并发编程中的 Synchronized

    synchronized 作用 synchronized 关键字是 Java 并发编程中线程同步的常用手段之一. 1.1 作用: 确保线程互斥的访问同步代,锁自动释放,多个线程操作同个代码块或函数必须 ...

  7. 由浅入深,逐步了解 Java 并发编程中的 Synchronized!

    作者 | sowhat1412  责编 | 张文 头图 | CSDN 下载自视觉中国 来源 | sowhat1412(ID:sowhat9094) synchronized 作用 synchroniz ...

  8. Java 并发编程中的死锁 ( Kotlin 语言讲解)

    什么是死锁? 在操作系统中的并发处理场景中, 进程对资源的持有与请求过程中,会产生死锁. Say, Process A has resource R1 , Process B has resource ...

  9. 内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术

    内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术_chuhan0449的博客-CSDN博客 我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听 ...

最新文章

  1. 测试服务搭建之centos7下安装java
  2. lombok中的@Data注解与MyBatis的懒加载机制冲突解决
  3. 通读AFN②--AFN的上传和下载功能分析、SessionTask及相应的session代理方法的使用细节...
  4. Matlab的数组的小知识和方法
  5. MD5加密解密简介和应用
  6. 网络流与线性规划24题(写了一半,先鸽下了……)
  7. 在ASP.NET Atlas中调用Web Service——创建Mashup调用远端Web Service(基础知识以及简单示例)...
  8. 封装常用的js(base.js)——【05】自定义弹出框.封装水平垂直居中center(),和resize() ....
  9. apache不能解析php文件_解析漏洞
  10. python哈夫曼编码注意_[Python]哈夫曼编码
  11. CF1041A Heist
  12. 怎么把Word转PDF格式?分享几种好用的转换方法
  13. KU FPGA DDR4 SDRAM仿真/板卡测试
  14. Python干货 | 制作遥感影像图
  15. uni-app微信小程序跳转公众号;微信小程序打开公众号;微信小程序识别二维码添加好友;微信小程序通过公众号添加好友;小程序里识别企业微信二维码点击联系人名片无反应?
  16. 三款超火的国外壁纸应用,让你每天都用新手机
  17. 小猿圈 python学习-细讲数据类型-字典
  18. Linux之父、大数据之父确认参加2021世界人工智能大会
  19. 系统架构师论文-论软件架构的选择与应用
  20. 信息学竞赛有什么好的比赛网站?

热门文章

  1. 认识计算机网络教案小学,初识计算机网络教案
  2. 万字长文剖析Redis分布式锁到底安不安全
  3. Go Web编程--应用数据库
  4. java volatile 原子性_为什么volatile不能保证原子性而Atomic可以?
  5. Spring Security:自定义登录页面
  6. LockDemo 锁对象
  7. Java的native方法-----你必须要知道的JAVA知识
  8. django-装饰器实现PV统计
  9. html符号实体----介绍
  10. 高并发异步uwsgi+web.py+gevent