并行编程主要聚焦于性能,生产率和通用性上。
所谓性能,更像是可扩展性以及效率。不再聚焦于单个CPU的性能,而是在于平均下来CPU的性能。这个来源于摩尔定律的失效,
霍金曾经提过限制IT发展的终究会是1.光速(这个已经在分布式系统上更能看出来,通信的瓶颈限制着速度)2.物质的原子性(来源于不可测准原理)
并行编程开始了,即使很难。
并行和并发有着小小的区别:并行意味着问题的每个分区有着完全独立的处理,而不会与其他分区进行通信。并发可能是指所有的一切事务,
这可能需要紧密的,以锁的形式或其他的互相通信的方式形成的相互依赖。
因为并行编程的相对较难,导致工程师的生产率不会太高,会聚焦于更精密的细节,花费大量的时间。
通用性也是一个问题,当为了通用性,势必需要程序语言进行更为抽象,例如java至于C/C++的学习成本和开发成本。
单纯的CPU数量增加也会产生新的瓶颈影响性能提升:比如主存的大小,一个线程消耗了所有的可用内存,其他线程将会没有内存。缓存,特别是为了弥补内存和CPU的速度差异产生
的CPU缓存。内存带宽,这个也不可小视,因为计算机内部数据的传输并不是无限大的。I/O带宽,这个直接限制了程序的运行速度。
并行任务变得复杂不仅仅在于之上的原因,更因为:
1.对代码,对任务的分割,这会导致错误处理以及事件处理更为复杂。如果并行程序之间会牵扯到交互,通信的时间成本,共享资源的分配和更新更为复杂。启动的线程
过多,CPU缓存就会溢出,从而导致过高的缓存未命中,影响性能。
2.并行访问控制,单线程的应用程序可以对本实例中的所有资源具有访问权,例如内存中的数据结构,文件之类的。但是并行程序中,对变量的访问会牵扯到消息传递,并且协调对共享
资源的访问,需要使用到引用计数,锁,事务等方式同步
3.特定算法的固有顺序
还有更多的人为因素,代码的可读性,项目对共享资源的管控之类。