C++多核高级编程 - 08 并行程序的测试

来源:互联网 发布:python lambda 包含for 编辑:程序博客网 时间:2024/06/08 07:08

测试在软件生命周期中是不可缺少的,它是软件工程的一部分,重要性不用多说。原书中此章讲的是并行程序的测试和逻辑容错,但关于逻辑容错的部分内容少了点,还是觉得测试这部分对实际工作有着较大的作用。


一, 测试并行程序中的问题和挑战

多线程或多处理器程序会遇到的一些问题:

  • 模拟最小到最大的容积负荷
  • 在调试期间负责精确的控制流
  • 在调试期间负责精确的竞争条件错误
  • 复制全系统的进程竞争和线程竞争
  • 寻找隐藏的不安全的线程函数
  • 测试与调试非确定算法
  • 证明在软件中不可能出现死锁或数据竞争
  • 模拟边界和平均负荷的混合
  • 当上百或上千线程或进程运行时,检测中间结果
  • 确定要产生可接受的性能所需要的线程或进程的准确数量

其实无论对于开发人员还是测试人员,以上个点基本可以覆盖并行程序的测试用例的构成方式,或思考方向。


测试中必须检查的5个并发挑战:

开发过程中曾经提过有关并行程序的挑战

挑战 1   -   软件分解,任务分解
挑战 2   -   任务间通信
挑战 3   -   多个任务或Agent 对数据或资源的并发访问
挑战 4   -   识别并发执行的任务之间的关系
挑战 5   -   需要多少个进程或线程
挑战 6   -   寻找可靠的,可重现的调试和测试
挑战 7   -   与拥有多进程组件的设计的相关人员进行沟通


同样在测试过程中,这些挑战也正是测试的重点对象,下面同样列举并行程序测试中几种挑战

挑战 1   -  多个任务间不正确或不充分的通信

挑战 2   -   两个或多个指令或多任务对数据的不安全更新,造成数据损坏

挑战 3   -  当任务和资源间存在多对一的资源竞争时

挑战 4   -  需要执行的并行执行的单元数无法被接受

挑战 5   -  在沟通包含多处理器和多线程的软件时缺少文档或文档不充分


其实这些并行程序测试的挑战基本思路是映射到开发过程中的挑战,可以根据所开发程序的特点对其中一些点构造更详细的测试用例来进行测试。

例如:

针对客户服务器类的程序可以针对线程间通信正确性进行加强一些的测试。

针对大规模数学运算的并行程序则可以对数据不安全更新,或运算单元的一些特性进行加强测试。



二,并行程序的缺陷排除

解决程序缺陷前可以简单的回答一下三个问题:

1)设计模型和PBS分解能正确并完全地表示解决方案模型吗?

2)实现模型正确地映射到设计模型PDAL?

3)实现模型中所有的并发挑战都得到了解决?


这只是大概思考的三个方向,具体处理细节不放在此处总结。但这里总结了一下并行编程会遇到的一些问题,在工作中可以借鉴一下。


并行常见错误:

1)  死锁:任务等待不会发生的事件,例如哲学家问题中一个哲学家始终不放弃筷子造成死锁。


2)  优先级倒置:发生在较低优先级任务阻塞了高优先级的任务。


3)  性能降级:反映在系统的性能在响应时间,执行时间,和结果计算等方面的降低。


4)  无限期推迟:可能受到资源或其他因素的影响,系统无限期的拖延了任务的调度。


5)  互斥量耗尽:系统能创建的互斥量到达最大的数目。


6)  线程耗尽:系统能够分配的线程的最大数目。


上述问题有时在程序中产生的现象是一样的,例如死锁和无限期推迟时都是程序无法反应,或处于僵死的状态,但问题的本质差别是不一样的。

需要分析具体的问题才会有更多的体会。