第3章 多核编程的挑战
3.1 什么是顺序模型
3.2 什么是并发
从以下三个方面应对并发的挑战:软件开发、软件部署、软件维护;
3.3 软件开发
软件开发生命周期(SDLC,Software Development Life Cycle);
主要SDLC活动:规格说明(Specifications),设计(Design),实现(Implementation),测试和评价(Testing and evaluation),维护(Maintenance);
软件开发方法:敏捷编程、边做边改、极限编程、增量编程、面向对象、快速原型、螺旋式、结构化、瀑布;
SDLC与多核编程的关系:一定的软件开发方法对应一定的工具集、语言和库,进而决定了实现多处理和多线程的方法;
3.3.1 挑战1:软件分解
软件解决方案的分解实际上是工作分解结构(WBS,Work Breakdown Structure)或架构制品(AA,Architectural Artifacts);
WBS:将问题或解决方案分成需要执行的任务,使用任务驱动模型,使用过程式模型;
AA:将问题或解决方案分为人、地点、事物和想法的集合,使用面向对象或关系驱动模型,使用声明式模型;
分解遵从模型所使用的部分、过程和结构,合适的分解方案建立在合适的模型选取上;
3.3.2 挑战2:任务间通信
进程间通信(IPC,Interprocess Communication)机制:命令行参数、环境变量、文件描述符、具有加锁功能的文件、管道、共享内存、消息队列、信号量、Socket;
3.3.3 挑战3:多个任务或agent对数据或资源的并发访问
问题1:数据竞争
如果两个或多个任务试图同时更改共享数据,而且数据的最终值取决于哪个任务先到达,则产生竞争条件;
当两个或多个任务试图同时更新相同的数据资源时,称竞争条件为数据竞争;
问题2:死锁
问题3:无限延期
如果一个或多个任务被挂起,等待一些永远不会发生的状况或事件,就被称为无限延期;
3.3.4 挑战4:识别并发执行的任务之间的关系
同步关系:
a、start-to-start:A启动后B才能启动;
b、finish-to-start:A结束后B才能启动;
c、start-to-finish:B结束后A才能启动;
d、finish-to-finish:B结束后A才能结束;
计时考虑:有时候同步关系需要增加上特定的计时信息,这意味着在涉及同步关系时,需要考虑时间和事件;
3.3.5 挑战5:控制任务之间的资源争夺
3.3.6 挑战6:需要多少个进程或线程
线程间的通信和处理器的同步都有一定的成本;
3.3.7 挑战7和挑战8:寻找可靠的、可重现的调试和测试
3.3.8 挑战9:与拥有多进程组件的设计的相关人员进行沟通
UML图:
a、结构/架构图:组件图、部署图;
b、行为图:状态/并发状态图、顺序图、协作图、活动图;
3.3.9 挑战10:在C++中实现多处理和多线程
C++没有内置并发模型而是通过库来支持多处理和多线程;
3.4 C++开发人员必须学习新的库
Single UNIX Specification Version 3提供的实现并行化的工具:POSIX线程(pthread)、POSIX spawn函数、exec系列函数;
3.5 处理器架构的挑战
性能最优还是平台兼容的考虑
3.6 小结