14、高效可扩展多线程远程服务器及VERA实验报告

高效可扩展多线程远程服务器及VERA实验报告

在软件开发领域,高效的多线程远程服务器设计以及有效的软件测试方法至关重要。下面将详细介绍相关的设计模式和软件测试实验。

1. 复合会合调用设计模式

在多线程远程服务器的设计中,复合会合调用(CompositeRendezvousCalls)设计模式是MT - Rendezvous和CompositeCalls设计模式的集成。

1.1 原有模式的问题及解决方案

最初,用户在单调用时也被迫使用复合调用,效率较低,而且存根需要区分单调用和复合调用,以防止为单调用创建解释器服务器。为了解决这些问题,采用的解决方案是保留MT - Rendezvous架构,添加一种新的服务器调用——解释器服务器(InterpreterServer)。这样,复合调用被MT - Rendezvous作为单调用管理,并传递给解释器服务器,解释器服务器解释程序时会发出一些单调用,这些单调用会被发送回存根,沿着与MT - Rendezvous调用相同的路径进行。

1.2 单调用和复合调用的处理流程
  • 复合调用路径
    复合调用在CompositeRendezvousCalls中遵循与MT - Rendezvous中单调用相同的路径。所有复合调用都指向解释器服务器。
  • 单调用路径
    1. 解释器将调用传递给服务器存根。
    2. 转发器从存根获取调用。
    3. 转发器创建信使任务以异步进行调用。
    4. 信使任务进行调用,服务器线程接受调用。
    5. 服务器线程完成会合并返回调用结果。
    6. 信使任务完成并将结果返回给存根。
    7. 存根将结果发送给解释器服务器(而不是客户端)。
  • 复合调用解释完成后的结果路径
    1. 结果(变量表的Out和InOut变量)被发送回调用的信使任务。
    2. 信使任务将结果返回给服务器存根。
    3. 后续步骤与单调用结果返回步骤相同。
调用类型 路径步骤
复合调用 指向解释器服务器,与单调用路径相同
单调用 解释器 -> 存根 -> 转发器 -> 信使任务 -> 服务器线程 -> 信使任务 -> 存根 -> 解释器服务器
复合调用结果 信使任务 -> 存根 -> 后续与单调用结果相同

下面是单调用和复合调用处理流程的mermaid流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([客户端]):::startend -->|单调用| B(存根):::process
    A -->|复合调用| C(解释器服务器):::process
    C -->|单调用| B
    B --> D(转发器):::process
    D --> E(信使任务):::process
    E --> F(服务器线程):::process
    F -->|结果| E
    E -->|结果| B
    B -->|结果| C
    B -->|结果| A
2. Ada 95中的复合会合调用

该设计模式已在多种语言中实现,包括C、C++和Ada 95。在Ada 95实现中有一些值得讨论的细节。

2.1 流机制的优势

Ada 95中的流机制以及预定义的扁平化方法Read和Write非常受欢迎。通信层被建模为流,使得对象扁平化和反扁平化更容易,便于在网络上发送调用。而且,Ada流是类型化的,允许在非结构化介质(如网络连接)上进行类型安全的通信。但需要注意的是,只有当客户端和服务器都可信时才能假设类型安全,否则服务器应检查接收到的请求的完整性。

2.2 在TransLib中的应用

该设计模式将用于TransLib(一个用于构建事务应用程序的Ada 95框架)。在TransLib中,每个事务被视为一个客户端,预定义的Read和Write用于加载和存储持久对象,也用于事务中止时的撤销操作。为了减轻程序员处理事务标识符(tids)的繁琐任务,使用了系统编程附件操作来处理任务属性,执行事务的任务会被标记其tid,这样系统始终知道给定任务正在为哪个事务工作。

2.3 Ada 95特性的作用
  • 泛型 :可用于为模式参与者创建模板,允许在运行时以零额外成本实例化不同的解释器进行动态调度。
  • 动态任务 :在多个地方很有用,服务器任务和信使任务都是动态的,任务判别式进一步简化了任务创建。
  • 重排队语句 :可作为存根、转发器和信使之间的转发机制。
  • 受保护对象 :可用于实现存根状态,因为它必须处理来自转发器和信使任务的并发调用。
3. 复合会合调用的应用场景

复合会合调用设计模式有许多潜在的应用场景:
- 事务框架 :如Translib和其他事务框架,用于实现提交、中止和崩溃恢复。
- 分布式存储 :用于分布式存储(或检查点)设施,如文件系统示例。
- 断开连接的分区 :可用于断开连接的Ada 95分区,延迟调用直到最终重新连接。
- 无线和高成本通信环境 :可节省一些网络消息。
- 可扩展分区 :可用于允许下载新的复合操作。
- 分布式调试 :解释器可作为间接层,用作调试器的钩子。

4. VERA实验

随着测试成本的不断上升,行业需要修订测试流程和技术,以经济的方式验证复杂系统。Marconi研究中心设计了VERA软件测试实验,旨在找到一种具有成本效益的验证过程。

4.1 实验目的和参与者
  • 目的 :评估四种验证技术(代码审查、Fagan检查、静态分析和自动测试用例生成),以确定Ada软件的成本效益验证过程。
  • 参与者 :三名软件工程师,只有一名在Ada和静态分析方面具有专家级知识,另外两名在其他语言的软件开发和测试方面有经验。
实验者 Ada经验(年) 静态分析经验(年) 软件测试经验(年)
X 0.2 0 1
Y 0 0 2
Z 6 6 4
4.2 基线项目和实验协议
  • 基线项目 :选择Alenia Marconi Systems开发的雷达控制系统中的一个自包含的60 KLOC模块作为基线项目,该系统用Ada83编写,实验仅关注功能正确性。
  • 实验协议 :基线软件已由AMS开发团队审查,在VERA实验中,使用Rational的Ada Analyzer进行静态分析,使用Rational的TestMate进行自动测试用例生成。所有缺陷使用Fagan缺陷分类方案进行分类,评估技术的效率和有效性。
缺陷类型 描述
主要 可能在指定操作范围内导致操作失败的缺陷
次要 工艺、拼写或违反标准编程代码的缺陷,不会导致操作失败
调查 实际分类当时无法确定,需要进一步调查以确定是主要还是次要缺陷,或是否应丢弃的缺陷
4.3 选定的技术
  • 代码审查 :是雷达系统部门在集成阶段之前查找代码缺陷的主要验证过程,但存在缺乏一致性和严谨性的问题,如检查表使用被忽视、参与者可能参与了被审查软件的编写、审查速度过快等。
  • Fagan检查 :是一种更严谨的软件审查方式,由Fagan在1976年提出。该过程有七个严格定义的阶段,包括规划、概述、准备、检查会议、过程改进、返工和跟进。与代码审查不同,检查有入口标准,且为每个参与者分配角色,推荐团队规模为四人,主要角色包括主持人等。

下面是Fagan检查过程的mermaid流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(规划):::process
    B --> C(概述):::process
    C --> D(准备):::process
    D --> E(检查会议):::process
    E --> F(过程改进):::process
    F --> G(返工):::process
    G --> H(跟进):::process
    H --> I([结束]):::startend

综上所述,复合会合调用设计模式为多线程远程服务器的设计提供了高效且灵活的解决方案,而VERA实验为Ada软件的测试提供了有价值的参考,Fagan检查与静态分析的组合被认为是最具成本效益的验证过程。在实际的软件开发中,可以根据具体需求选择合适的设计模式和测试方法,以提高软件的质量和开发效率。

高效可扩展多线程远程服务器及VERA实验报告

5. 相关模式及对比

在开发多线程分布式服务时,还有许多其他模式也能帮助解决相关问题。

  • MT - Rendezvous和CompositeCalls :这两种模式分别描述了一些与之相关的内容。
  • Reactor模式 :可用于将多线程与请求处理解耦,但它不处理调用协议,也不能像复合会合调用那样节省网络消息。
  • Interpreter模式 :可以支持复合调用所使用的语言。

下面是几种模式的对比表格:
| 模式名称 | 作用 | 特点 |
| ---- | ---- | ---- |
| MT - Rendezvous | 处理多线程相关问题 | - |
| CompositeCalls | 处理复合调用相关问题 | - |
| Reactor | 解耦多线程与请求处理 | 不处理调用协议,不节省网络消息 |
| Interpreter | 支持复合调用语言 | - |

之前也有一些模式在Ada 95环境中被实例化,但此次更进了一步,解决了同一应用中多个模式实例之间的交互问题,并且目标应用领域考虑的是完全分布式环境。

6. 实验结果分析

在VERA实验中,对四种验证技术的不同组合进行了评估。通过对实验数据的分析,发现Fagan检查与静态分析的组合是最具成本效益的验证过程。

以下是不同验证技术组合的效率和有效性对比列表:
- 代码审查 + 自动测试用例生成 :效率一般,能发现一定数量的缺陷,但由于代码审查的不严谨性,整体效果有限。
- Fagan检查 + 自动测试用例生成 :效率较高,Fagan检查的严谨性能发现较多潜在缺陷,结合自动测试用例生成可进一步提高测试效果。
- 静态分析 + 自动测试用例生成 :效率尚可,静态分析能提前发现一些代码问题,自动测试用例生成可补充测试覆盖度。
- Fagan检查 + 静态分析 :效率高且效果好,Fagan检查的全面性和静态分析的精确性相结合,能以较低成本发现较多缺陷。

下面是不同验证技术组合的效果对比mermaid流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(代码审查+自动测试用例生成):::process
    A --> C(Fagan检查+自动测试用例生成):::process
    A --> D(静态分析+自动测试用例生成):::process
    A --> E(Fagan检查+静态分析):::process
    B --> F(一般效果):::process
    C --> G(较好效果):::process
    D --> H(尚可效果):::process
    E --> I(最佳效果):::process
    F --> J([结束]):::startend
    G --> J
    H --> J
    I --> J
7. 实际应用建议

对于多线程远程服务器的设计,如果需要高效且灵活的解决方案,可以考虑使用复合会合调用设计模式。在具体实施时,可以按照以下步骤进行:
1. 确定系统需求,明确是否需要处理复合调用以及多线程的并发需求。
2. 根据需求选择合适的编程语言,如Ada 95,利用其相关特性实现模式。
3. 设计服务器架构,引入解释器服务器来处理复合调用。
4. 实现存根、转发器和信使任务等组件,确保调用的正确传递和处理。
5. 进行测试和优化,确保系统的稳定性和性能。

对于软件测试,特别是Ada软件的测试,建议优先考虑Fagan检查与静态分析的组合。具体操作步骤如下:
1. 对软件进行静态分析,使用合适的工具(如Rational的Ada Analyzer)检查代码中的潜在问题。
2. 组织Fagan检查团队,按照Fagan检查的七个阶段(规划、概述、准备、检查会议、过程改进、返工、跟进)进行全面审查。
3. 根据检查和分析结果,对代码进行修改和优化。
4. 进行后续的测试和验证,确保软件的质量。

通过合理应用这些设计模式和测试方法,可以提高软件的开发效率和质量,降低开发成本,满足不同应用场景的需求。在未来的软件开发中,这些技术和方法有望得到更广泛的应用和进一步的发展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值