并发编程中的重重量级模型和轻量级模型算法
使用轻量级并发开发编程
不论是Amdahl定律仍是Gustafson的定律都没有考虑引入并发须要付出的额外开销。同时也没有考虑那些能够将顺序代码转变成能够利用并行优点的算法的设计模式。重要的是减小程序中必须执行的顺序代码,改善对并行执行单元的利用。设计模式
之前的.NET 版本,若是你想在一个进程内并行执行C#应用程序,你必须建立和管理多线程(软件线程)。因此,你必须编写复杂的多线程代码。分解算法到多个线程上,协调不一样的代码单元,在它们之间共享信息,而且收集执行结果确确实实是一件复杂的编程工做。随着逻辑核心的增多,状况变得甚至更糟了,由于你须要更多的线程来获取更好的可伸缩性。多线程
多线程模型的设计并非为了帮助开发人员应对多核革命的。事实上,建立一个新的线程须要不少不少的处理器资源,而且把每个算法分解到并行的线程上会引入不少的开销。大多有用的结构和类的设计并不能被不一样的线程同时访问,因此必须添加不少的代码处理这种状况。这些额外的代码是开发人员难以专一主要目的:利用并行执行改善程序性能。架构
由于这种多线程模型处理多核并发太复杂了,因此这就是众所周知的重量级并发模型。这引入了额外的负担。因为在框架级别缺少对多线程互访的支持,为了解决这个问题须要添加太多的代码,这使代码异常的难理解。并发
前面提到的与先前.NET提供的多线程模型有关的问题和现代微处理器不断增长的逻辑核心的数目,促使建立新的模型编写并发代码。新的模型就是众所周知的轻量级并发模型,由于它减小了在不一样的逻辑核心上建立和执行代码的代价。可是这并不意味着它消除了引入并发致使的全部代价,可是这个模型是为如今多核微处理器的开发设计的。重量型并发模型是在多处理器时代产生的,当时一个电脑能够有不少个只有一个物理核心的微处理器。轻量级并发模型考虑了某些物理核心支持不少逻辑核心的架构。框架
轻量级并发模型并不只仅是调度不一样物理核心的负载。它同时增长了对框架级别多线程互访问的的支持,同时使代码更加简单易于理解。编程语言
几乎全部的现代编程语言都将要转向支持轻量型的并发模型。幸运的.Net 4就是其中的一员。因此,全部能够生成.NET应用程序的托管语言均可以利用这种新的模型。性能
建立良好的基于任务模型的设计优化
有的时候,你必须优化一个已存的解决方案以便充分利用并行的特性。在这种状况下,有必须理解已经存在的串行设计,理解采用的并行算法是否会下降伸缩性,不然你必须进行重构以在不引入问题或者产生不一样结果状况下获取性能的提高。你能够将问题的一部分或者整个问题建立基于任务模型的设计,而后你就能够引入并行了。当你设计新的解决方案的时候,也能够应用相同的技术。
依据如下步骤你能够建立有效的基于任务模型的设计:
1. 将每一个问题分解成不少的小问题,而且忘记有关串行执行的东西。
2. 向下面同样考虑与每一个子问题有关的东西:
能够并发处理的数据,就将数据进行分解实现并发。
须要不少任务和一些复杂并行处理的数据,就分解这些数据和任务来实现并发。
能够并行执行的任务,就分解这些任务来实现并发。
3. 组织你的设计展示并发意图。
4. 肯定串联不一样子问题须要的任务。尽可能的避免产生依赖。
5. 时刻谨记以并发和潜在的并行思想进行设计。
6. 分析并行问题的执行计划须要考虑如今的多核微处理器和未来的架构。为获取更好的伸缩性进行设计。
7. 尽量的最小化危险的部分。
8. 不管什么时候,尽量的使用基于任务模型实现并发编程。
9. 协调步调,不断迭代重复这些步骤。
前面提到的步骤并不意味着全部的子问题均可以成为运行在不一样的线程上的并行任务。
当编写代码的时候,根据性能和伸缩性的目标,设计须要考虑并行的可能性,并选择最好设计。并行的思想、将工做分解成不一样的任务来完成是很重要的。以这种方式,你就能够根据须要将你的代码并行化。若是你有一个经典的串行执行的设计,经过使用基于任务模型的编程技术使其并行化须要付出很大努力。