4、大型嵌入式系统软件架构与模块化系统开发的逻辑基础

大型嵌入式系统软件架构与模块化系统开发的逻辑基础

1. 系统开发中的查询机制选择与模拟结果

在系统设计中,过滤表达式和查询表达式各有特点。过滤表达式不能包含对程序变量的引用,安装过滤器的成本相对较高;而查询表达式可以将数据字段与实际的程序状态相链接。由于每次交集操作后都需要安装新的过滤器,因此最终决定使用查询机制,尽管这样无法减少通信开销。

在模拟实验方面,程序使用 C 语言实现,并在运行频率为 300 MHz 的 UltraSparc 机器上执行。实验中使用的最大网格规模为 100x100 轨道,有 200 个列车进程并发运行。结果发现,单台机器无法满足处理要求,列车程序的执行周期从请求的 5 Hz 降低到了约 3 Hz。即便如此,每秒仍能实现平均 30000 次 SPLICE 数据空间更新,以及相同数量的读取操作,还有每秒 600 次执行用于列车决策程序的有限状态自动机。这种对过载的恢复能力是共享数据架构系统的典型特征,与其他设计方法形成鲜明对比。

当在通过标准(10 Mbit/秒)以太网连接的两台机器上运行相同实验时,接近了通信通道的极限,但处理器的负担较轻,每秒能实现 50000 次数据空间更新。通信通道的限制主要是因为共享数据空间上的所有写操作都会产生单独的数据包,而每个数据包中的数据量很少,这远非最优情况。由于程序要求所有通信都可靠,频繁的冲突可能会产生滚雪球效应:SPLICE 保证可靠通信中消息的顺序,因此丢失的消息会被重新传输。一旦达到网络的有效容量,很容易导致冲突激增。可以通过将多个数据元素收集到单个数据包中来改进,这样可以减少以太网数据包的数量,但会增加一些延迟。SPLICE 提供了自动进行这种打包的机制,而无需牺牲解决方案的独立性。

2. 大型嵌入式系统软件架构的意义

大型嵌入式系统运行环境本身具有复杂性,同时对时间行为、可用性、健壮性和可维护性有严格要求,因此这些系统的设计是一项复杂的任务。协调模型有潜力将功能需求与系统设计的其他方面分开。我们提出了一种用于大型嵌入式系统的软件架构,其中包含一个单独的协调模型。从基于共享数据空间的相对简单模型开始,可以逐步改进该模型以满足这类系统的典型要求。最后,还指出了如何使用形式化技术支持基于 SPLICE 的系统开发。

在过去几年中,SPLICE 已应用于商业可用的指挥控制和交通管理系统的开发。这些系统通常由约 1000 个应用程序组成,运行在近 100 个通过混合通信网络互连的处理器上。开发这些系统的经验证实,所讨论的软件架构(包括所有改进)显著降低了设计过程的复杂性。由于进程之间的高度解耦,这些系统相对容易以增量方式开发和集成。此外,该架构直接支持进程和数据的分布、容错行为、优雅降级和动态重新配置。

3. 模块化系统开发的逻辑基础

为了实现基于科学理论的模块化系统开发,需要明确组件的概念以及操作和组合它们的方法。我们引入了一种具有以下特征的组件数学模型:
- 组件是交互式的。
- 通过命名和类型化的通道与环境相连。
- 在输入通道上从环境接收输入消息,并在输出通道上向环境生成输出消息。
- 组件可以是非确定性的,即对于给定的输入历史,组件可能产生多个输出历史。
- 组件与环境之间的交互发生在全局时间框架内。

在本文中,我们仅使用离散时间,因为离散时间对于大多数信息处理系统的典型应用来说是一个足够的模型。基于交互式组件的概念,可以定义组合形式,主要引入了一种带反馈的并行组合形式,这种组合形式允许对网络内组件的并发执行和交互进行建模,其他组合形式可以作为带反馈并行组合的特殊情况引入。

为了系统地逐步开发组件,我们引入了细化的概念,研究了三种细化关系:属性细化、玻璃盒细化和交互细化。我们声称这些细化概念是自上而下系统开发所需的全部内容。最后,我们指出该方法是组合式的,即组合系统的细化步骤可以通过其组件的细化步骤获得。因此,对系统的全局推理可以结构化地转化为对组件的局部推理,组合性与系统工程中的模块化相关。

4. 组件概念与流的引入

组件在系统工程和软件工程中是一个基本概念。在软件工程中,大量工作致力于软件架构和组件化的概念。组件化是一种开发方法,软件系统由给定的组件组成,系统的主要部分无需每次都重新实现,而是可以通过现有软件解决方案的新配置获得。这种方法的关键问题是设计良好的接口和软件架构,而这需要一个清晰的组件概念。

在软件工程文献中,组件被定义为根据公开规范对相关服务的物理封装。我们基于这个定义,提供了一种逻辑方式来编写组件服务的规范,并将这些概念与玻璃盒视图、派生的黑盒视图和组件规范相关联。

流是消息或动作的有限或无限序列,用于表示通道的通信历史或活动历史。设 M 是给定的消息集合,M 表示 M 上的有限序列,M∞ 表示 M 上的无限序列,Mω = M ∪ M∞ 表示流的集合。在流上定义了前缀顺序,即 x [ y 表示存在 z 使得 xˆz = y。本文中更倾向于使用定时流,定时流表示在离散时间框架内通过通道的无限通信历史或活动历史。离散时间框架将时间表示为等长的无限时间间隔链,每个时间间隔内可以通信有限数量的消息或执行有限数量的动作。因此,我们用无限的有限消息或动作序列来表示具有这种离散时间框架的系统模型的通信历史。

我们使用一些简单的流符号,如下表所示:
| 符号 | 含义 |
| ---- | ---- |
| zˆx | 序列 z 与流 x 的连接 |
| x↓i | 流 x 的前 i 个序列 |
| Sx | 从流 x 中删除所有不属于集合 S 的消息后得到的流 |
| x | 流 x 中所有序列连接后的有限或无限流 |

在后续内容中,我们将使用流来专门建模称为通道的顺序通信介质的通信历史,通道是系统中的标识符,在系统的每次执行中都与一个流相关联。

graph TD
    A[组件] --> B[输入通道]
    A --> C[输出通道]
    B --> D[接收输入消息]
    C --> E[生成输出消息]
    D --> F[组件处理]
    F --> E
5. 组件的语法和语义接口
5.1 I/O 函数

给定一组类型 S 和一组类型化的通道 C,以及通道的类型分配函数 type: C → S。通道赋值是一个元素,它将每个通道 c ∈ C 与类型为 type(c) 的元素流相关联。基于一组类型化的输入通道 I 和输出通道 O,我们引入了组件的语法接口 (I, O)。

除了语法接口,还需要一个描述组件行为的概念。组件的行为是输入历史和输出历史之间的关系,通过一个集值函数(语义接口)F: rI → ℘( rO) 来表示,其中对于输入通道赋值 x ∈ rI,F(x) 表示组件可能产生的所有输出通道赋值的集合。

5.2 I/O 函数的规范

可以使用逻辑公式来描述 I/O 函数,该公式将输入通道上的流与输出通道上的流相关联。组件规范提供了两个方面的信息:一是语法接口,描述组件如何与环境连接;二是通过指定公式 Φ 描述组件的行为,该公式关联输入和输出通道的赋值。

下面是一些简单但基础的组件规范示例:
- 合并组件 MRG

MRG
  in   x: T1, y: T2
  out  z: T3
  x = T1  z
  y = T2  z

其中 T1 和 T2 假设是不相交的集合,T3 是 T1 和 T2 元素集合的并集。
- 传输组件 TMC

TMC
  in   z: T3
  out  z: T3
  z ~ z'

这里使用约定,在指定公式中用 z’ 表示输出通道 z。该规范表示组件会将每个输入消息作为输出消息输出,反之亦然,但消息可能会有任意延迟和超车。
- 分叉组件 FRK

FRK
  in    z: T3
  out  x: T1, y: T2
  x = T1  z
  y = T2  z

需要注意的是,这里指定的合并组件和 TMC 组件都是公平的,即每个输入最终都会被处理并作为输出再现。

我们使用 In(F) 表示组件 F 的输入通道集合,Out(F) 表示输出通道集合。通过 I/O 函数规范的指定公式,可以证明该函数的相关属性。

5.3 I/O 函数的属性

I/O 函数 F: rI → ℘( rO) 具有以下基本属性:
- 正确定时 :对于所有时间 i ∈ N,如果 x↓i = z↓i,则 F(x)↓i = F(z)↓i。
- 时间保护(或因果性) :对于所有时间 i ∈ N,如果 x↓i = z↓i,则 F(x)↓i+1 = F(z)↓i+1。
- 部分性 :如果存在 x ∈ rI 使得 F(x) = ∅,则函数是部分的,否则是全的。
- 可实现性 :如果存在时间保护函数 f: rI → rO 使得对于所有 x ∈ rI,f(x) ∈ F(x),则函数是可实现的。
- 完全可实现性 :对于所有 x ∈ rI,F(x) = {f(x): f ∈ [F]},其中 [F] 表示所有满足 f(x) ∈ F(x) 的时间保护函数 f: rI → O 的集合。
- 时间独立性 :如果 x = z,则 F(x) = F(z)。

组件规范的指定公式 Φ 表示一个谓词 p: rI × rO → B,该谓词通过方程 F(x) = {y ∈ rO: p(x, y)} 定义一个 I/O 函数 F。给定一个带有指定公式的规范,我们可以证明指定的 I/O 函数是否满足上述某些属性,或者将这些属性作为示意性要求添加到规范中。例如,在谓词 p 的基础上添加时间保护要求可以得到更严格的规范。

大型嵌入式系统软件架构与模块化系统开发的逻辑基础

5. 组件的语法和语义接口(续)

在实际应用中,理解和运用 I/O 函数的这些属性至关重要。例如,时间保护属性确保了组件的输出是基于当前和过去的输入,符合因果关系,这在很多实时系统中是必需的。可实现性属性则保证了理论上可以找到一个具体的函数来实现组件的功能。

下面通过一个简单的表格来总结 I/O 函数的属性及其含义:
| 属性 | 含义 |
| ---- | ---- |
| 正确定时 | 相同输入前缀对应相同输出前缀 |
| 时间保护(因果性) | 当前输入前缀决定下一时刻输出前缀 |
| 部分性 | 存在输入无输出 |
| 可实现性 | 存在时间保护函数实现组件功能 |
| 完全可实现性 | 所有可能输出由时间保护函数生成 |
| 时间独立性 | 相同输入产生相同输出 |

graph LR
    A[输入通道赋值 x] --> B{I/O 函数 F}
    B --> C[输出通道赋值集合 F(x)]
    B --> D{属性判断}
    D --> E[正确定时]
    D --> F[时间保护]
    D --> G[部分性]
    D --> H[可实现性]
    D --> I[完全可实现性]
    D --> J[时间独立性]
6. 组件开发与系统设计的实际应用

在大型嵌入式系统的开发中,上述组件和 I/O 函数的概念可以用于设计和优化系统。以下是一个简单的操作步骤示例,展示如何利用这些概念进行系统开发:
1. 需求分析 :明确系统的功能需求和性能要求,确定所需的组件及其输入输出关系。
2. 组件设计 :根据需求,设计每个组件的语法接口和行为规范,使用 I/O 函数和指定公式进行描述。
3. 属性验证 :对设计好的组件进行属性验证,确保其满足系统的要求,如时间保护、可实现性等。
4. 组件组合 :使用带反馈的并行组合等方式将各个组件组合成一个完整的系统。
5. 系统测试 :对组合后的系统进行测试,检查其是否满足最初的需求和性能要求。

在这个过程中,细化概念(属性细化、玻璃盒细化和交互细化)可以用于逐步优化组件和系统的设计。例如,属性细化可以用于提高组件的性能属性,玻璃盒细化可以深入组件内部进行优化,交互细化可以改善组件之间的交互方式。

7. 总结与展望

通过对组件、流、I/O 函数等概念的介绍,我们为模块化系统开发提供了一个逻辑基础。这些概念可以帮助我们更好地理解和设计大型嵌入式系统,降低系统设计的复杂性,提高系统的可维护性和可扩展性。

在未来的系统开发中,随着技术的不断发展,我们可以进一步探索如何将这些概念应用于更复杂的系统,如分布式系统、物联网系统等。同时,也可以研究如何结合人工智能和机器学习技术,进一步优化系统的性能和智能水平。

总之,基于组件和 I/O 函数的模块化系统开发方法为我们提供了一种科学、有效的系统设计途径,有望在未来的系统开发中发挥重要作用。

以下是一个简单的总结表格,回顾本文的关键内容:
| 关键概念 | 描述 |
| ---- | ---- |
| 组件 | 交互式、通过通道与环境交互、可非确定性 |
| 流 | 消息或动作序列,用于表示通信历史 |
| I/O 函数 | 描述组件输入输出关系,有多种属性 |
| 细化概念 | 属性细化、玻璃盒细化、交互细化 |
| 系统开发步骤 | 需求分析、组件设计、属性验证、组件组合、系统测试 |

graph LR
    A[组件概念] --> B[系统开发]
    C[流概念] --> B
    D[I/O 函数] --> B
    E[细化概念] --> B
    B --> F[优化系统设计]
    F --> G[应用于复杂系统]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值