首先了解几个概念
1. 串行
最基本的程序执行方式,串行程序的整个运行时,只有一个调用栈和一个运行时上下文。
2. 并发
多线程出现后比较常见的程序执行方式,多线程程序运行时,会有多个运行时上下文和对应的多个调用栈。逻辑上多个线程同时发生,物理上是由操作系统调度,CPU某一时刻依然只执行一个线程的任务。
3. 并行
多核处理器出现后会越来越常见的程序执行方式,物理上多个任务可以同时运行,这个概念介于操作系统和体系架构之间,从操作系统而言,依然是调度多个线程去CPU执行,只不过有了多个CPU/核心,不同线程可以绑定从而完全占用一颗核心,所以从体系架构的角度,同一时刻是有多个任务同时运行,另外一些说法,如‘多处理器程序’‘多核程序’都可以认为属于并行程序的范畴。
从概念的范围看,并行<并发,即并行的程序肯定是并发的,并发的程序不一定是并行的,但是,无论是逻辑上的并发(单处理器)还是物理上的并发(并行,多处理器),所面临的共享数据操作一致性问题是一样的,在很多情况下,多核编程可以近似认为是多线程编程,比如linux对多核的使用就是pthread亲和性绑定
4 并行编程的难点
难点: 同时从宏观和微观两种角度分析问题,并能灵活在两种角度之间切换。
在之前单处理器的世界里,计算机科学在编译器优化、处理器优化、多线程编程等方面有很深厚的积累,形成了对编程人员而言非常抽象的各种基础库,编程人员无须知道编译器、体系结构、多线程互斥同步等的实现细节。
进入多处理器后,这一个高度抽象的基础库还没有形成,虽然有一些并行库或者开发套件,但抽象程度还不够,依然需要编程人员能理解一定的底层系统结构细节和并行计算模型的能力和局限。
本文的目的是为对多核编程感兴趣的同学提供入门级别的学习材料,主要包括两个方面:
1) 尝试解释清楚几个最基本的概念,这些概念广泛存在于各种论文、技术文档甚至源代码注释里,如果不掌握这些概念,会对某些多核的关键代码不知其所以然。
2) 提供笔者收集到的比较好的源代码和博客目录,需要注意的是,多核编程目前属于比较冷门的领域(对比app,游戏开发),好的代码和资料还是比较难收集的。