C++多核高级编程 ' 第3章

来源:互联网 发布:php 2年工作经验 编辑:程序博客网 时间:2024/05/16 13:58

第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 小结