写一个正确的并行程序要比写顺序执行程序困难。 其原因是并行程序中潜在的风险和错误的种类更多 —— 首先,在一个顺序执行程序中的错误同样会发生在并行程序中;其次,并行程序比顺序执行程序需要关注更多的风险,例如状态的竞争、数据的竞争、死锁、失效的信号以及活锁(livelock)。

同样测试并行程序要比测试顺序执行程序困难。首先,测试并行程序的程序本身就是并行程序;其次,并行程序的错误更难预测和重现。在顺序执行程序中的错误具有确定性。在给定的输入和初始状态下,一个顺序执行程序出错了,那么每次它都会出错,在相同条件下。而一个并行程序出错了,则有可能是一些不确定因素导致的。

由于这点,重现并行程序的错误变得非常困难。不仅错误是随机的,而且现象可能也不确定,甚至在同样的环境下测试也可能不发生错误,也就是说在客户那里每天都发生的错误可能在你的测试实验室中就不会发生。进一步说,试图调试和监控并行程序会引入时间片(timing)和同步的概念,这也有可能阻止错误的发生。在海森堡不确定理论(Heisenberg's uncertainty principle)中,观察一个系统的状态往往会改变它。

所以,基于以上这些令人沮丧的消息,我们应该如何保证并行程序可以正常工作呢?我们使用和其他工程学同样的方法来管理并行程序测试的复杂性——尽量可能地隔离这个复杂性。

构造限制并行交互的程序

我们可以在程序中全部使用公有的和静态的变量。提醒你,这不是一个好主意,但是它确实可行 —— 只是这样做更困难并且程序更脆弱。通过封装,我们可以不必关心所有程序代码就可以分析某部分程序的行为。

同样地,通过把并行交互(concurrent interactions)封装在几个地方,例如,工作流管理器、资源池、工作队列、以及其他的并行对象中。这样会使得分析和测试并行程序变得更简单。一旦并行交互被封装后,你就可以集中精力测试并行机制其自身而不被其他错误所困扰。

并行机制,例如共享的工作队列,经常被作为从一个线程到另一个线程的管道。这些机制中,通常包含了必要的同步机制来保证其中数据的完整性 —— 但是被传入和传出的对象属于应用程序而非工作队列,所以应用程序就有责任负责这些对象的线程安全。你可以使这些对象成为线程安全的(最简单的办法就是使它们不可变(immutable)同时这也是最可靠的办法),但是另一个说法是:使这种不可变性更有效。

有效的不可变的对象 (effectively immutable object)是说,这种对象在设计的时候并非不可变的 —— 它们可以具有可变的状态 —— 但是当其他线程访问这样的对象的时候,程序通常认为它们是不可变的。换句话说,一旦你把一个可变的对象放入一个共享的数据结构中,此时这个对象可以被其他线程所访问时,确保这个对象不会被其他线程重复修改。通过限制主要几个类的可变性(mutability)可以限制潜在的不正确的并行行为的范围。

代码(1)是如何有效地利用不变性(immutability)来大大简化测试的例子。 客户端代码向工作管理器(work manager)提交一个求最大公倍数的请求,计算程序(calculation)被表示为Callable,执行者(Executor)返回一个Future表示计算程序。客户端代码等待Future计算结果。

FactorTask 这个类是不可变的,因此是线程安全的,无需额外的并行交互的测试。但是FactorTask返回一个数组,这个数组是可变的。线程间共享可变状态需要进行同步处理,但是由于应用程序代码的结构,因此一旦这个BigInteger的数组被FactorTask返回,它的内容应该是总是不变的,由此,客户端的代码可以在Executor框架中使用"piggyback"技术来隐式地(implicit)进行同步,这样的话,在访问这个数组的时候就无需额外的同步机制。

21/212>

并行网络测试软件,并行程序测试相关推荐

  1. bucket sort sample sort 并行_IBM布局AI硬件大杀器:硬软件并行开发、开源模拟AI工具包...

    原标题:IBM布局AI硬件大杀器:硬软件并行开发.开源模拟AI工具包 智东西(公众号:zhidxcom) 编 | 子佩 智东西11月4日消息,为了解决AI对数据.能源和内存资源的巨大需求,IBM一直致 ...

  2. 第二章:并行硬件和并行软件

    第二章:并行硬件和并行软件 背景知识 ​ 冯诺依曼结构:内存与CPU分开,CPU分为控制单元和算术逻辑单元,内存的速度限制了CPU的速度 ​ 进程.多任务和线程:没啥好说的,操作系统都有 ​ 对冯·诺 ...

  3. 拥抱并行流,提高程序执行速度

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:后青春期的Keats cnblogs.com/keatsCo ...

  4. 慕课软件质量保证与测试(第九章.程序中隐藏错误数量估计)

    慕课金陵科技学院.软件质量保证与测试.第九章.软件质量与质量保证.程序中隐藏错误数量估计 0 目录 9 软件质量与质量保证 9.2 程序中隐藏错误数量估计 9.2.1 课堂重点 9.2.2 测试与作业 ...

  5. 前端构建工具与应用程序测试

    1.前端构建工具 什么是前端构建? 什么是构建工具? 自动构建工具 Npm Scripts(推荐) Npm Scripts(NPM脚本)是一个任务执行者.NPM是安装Node时附带的一个包管理器,Np ...

  6. 软件部件仿真测试平台的设计与实现(计算机工程与设计2017-11)

    引 言 嵌入式软件部件测试可在目标机平台执行:如果不具备目标机环境,可基于宿主机平台[1-3]以全数字仿真[4]的形式模拟部件运行环境.基于宿主机开发部件仿真测试平台时,通常采用基于时钟驱动的循环调度 ...

  7. 【软件质量保证与测试】2.4软件测试与软件开发的关系

    文章目录 1. 软件测试与软件开发过程关系概述 2. 软件测试在软件开发生命周期中的位置 2.1 软件开发生命周期 2.1.1 软件规划阶段测试 2.1.2 软件设计阶段测试 2.1.3 软件开发阶段 ...

  8. 软件质量保证与测试技术习题

    软件质量保证与测试技术习题 第一章 引论 第二章 软件质量与软件缺陷 第三章 软件测试基础 第4章 软件测试的方法 第五章单元测试.第六章集成测试作业 第七章系统测试作业 第八章验收测试作业 第一章 ...

  9. 软件测试之第十一章 软件开发与测试模型

    第十一章 软件开发与测试模型 一. 软件开发模型 1 为什么学习软件开发模型 了解开发能够更好的有针对性的做好测试. 2 什么是软件开发模型 软件开发生命周期模型是软件产品从最初构思到退役的过程. 3 ...

最新文章

  1. 华为nova5ipro的优缺点_华为nova5pro和nova5i的区别
  2. Geoserver怎样设置地图shp文件为相对路径,可轻松复制移植
  3. python 一次性定时器_python 定时器每天就执行一次的实现代码
  4. 线上报名 | 高性能深度学习推理引擎 TensorRT 实战编程讲解
  5. JAVA实现在数据不匹配时把数据写到文件中
  6. Java中的内存泄露的几种可能
  7. 串口操作之API篇 CreateFile
  8. java生成和读取keystore_java-如何以编程方式创建新的KeyStore?
  9. hdu 5964:平行四边形 【计算几何】
  10. 开源啦:连DeepMind也捉急的游戏,OpenAI给你攻破第一关的高分算法
  11. MySQL中常见的函数常见的问题
  12. 【Oracle】RedHat 6.5 安装 11g数据库
  13. python必备入门代码-小白入门Python开发,必备技能有哪些?
  14. 单片机矩阵键盘扫描程序c语言,51单片机矩阵键盘扫描程序
  15. 程序员课外拓展004:Photoshop CC 2018详细图文安装教程
  16. matlab语言定义变量类型,matlab定义变量-MATLAB,变量
  17. 数据分析步骤(思维导图)
  18. sin35 在C语言中怎么表示,sin35度等于多少
  19. [数据挖掘笔记] KMeans豆瓣文本聚类
  20. JAVA初学,小白编程,8大基本类型

热门文章

  1. A Morphable Model For The Synthesis Of 3D Faces 论文解析 3DMM
  2. Scratch编程初体验3-飞行的小猫
  3. Mydrivers: DVD Jon出手,绕过ATT激活iPhone
  4. PSP Skype 使用国内卡
  5. 伪原创文章需要注意的地方有哪些
  6. Python:小球的归属
  7. linux下openvpn服务搭建
  8. 第一代电子计算机使用的逻辑部件是( ),第一代电子计算机使用的逻辑部件是
  9. 微信利用小号和大号的好友聊天(基于wxpy库)
  10. Springboot毕设项目电子竞技赛事管理系统f1v55java+VUE+Mybatis+Maven+Mysql+sprnig)