并行编程的目标
并行编程有如下3个主要目标:
- 性能。
- 生产率。
- 通用性。
性能
大多数并行编程上的工作都是为了提高性能,如果不考虑性能因素的话单线程代码显然是更加轻松的方案。这里的性能包括可扩展性(例如每CPU性能)及效率(例如每瓦特性能)。
另外一个让并行软件大行其道的原因是摩尔定律在提高单线程性能方面不再有效。这意味着我们不能够再依赖于硬件性能的提升来达到我们预期。
但是要注意一点,并行化只是众多优化措施中的一种,而且并发并不是没有代价(上下文切换消耗资源,维护并发程序的困难性)。所以通常我们对一特定问题采用并发算法之前要与最好的串行算法相比较。
生产率
首先我们要确认这不是一个技术性问题。 生产率为何在这个时代显得如此重要。试想早年一台计算机价值百万美元,而工程师的年薪对比来说却是不值一提。假如一个10人工程师团队将该机器速度优化10%,那也是非常划算的一笔生意。 而在今天硬件价格走低,高效地使用硬件不再像以前那样有吸引力(仍然有其价值),高效地利用开发者已经变得同样重要。所以在我们研发时需要考虑到并发程序本身将降低生产率这一事实。
通用性
让我们的程序尽可能的通用,这样可以摊薄开发软件的成本。但是问题在于通用性代表着更大的性能损耗以及生产率低下。(开发一个更加通用的程序通常要花费专用程序数倍的时间)
例如,Java拥有与生具来的多线程能力但是我们通常认为它的性能是低于C/C++的(尽管Java正在变得越来越快)。SQL拥有极好的性能,但是它仅仅用于数据库查询。
目前而言,兼具性能、生产率、通用性的程序并不存在,我们仍然需要在其中做平衡。越接近于地层的系统越需要通用性及性能。下面是一个简单的层次划分:
- 应用程序
- 中间件
- 系统库
- 操作系统内核
- 固件
- 硬件
我们要理解的是,并行编程不是目标。性能,生产率,通用性才是。
并行编程的替代方案
- 多个串行实例。
- 利用现有的并行软件构建应用。
- 对串行应用进行逻辑优化。
这里主要分析第二点,利用现有的并行软件构建应用。 Web服务器,关系型数据库是这方面的典型应用。例如一种常见的设计就是并行软件为用户(广义上的)提供一个单独的处理进程,然后在并行软件上并行执行(关系型数据库就是这样一种设计)。应用程序(Application)只需要负责用户接口,而关系型数据库处理并发及持久性问题。这样虽然会牺牲一点性能,但是可以显著降低开发难度。
本章主要分析并发编程的目标,后面将通过Java并发编程中的一些特性深入了解并行编程以及其应用。
欢迎关注: