20、时间Petri网结构的转换与实现

时间Petri网结构的转换与实现

1. 引言

在实时系统(RTS)的建模和实现中,时间Petri网(Time Petri Nets,TPN)和Ada 95语言的结合是一种有效的方法。虽然已有许多作者处理过相关主题,但本文旨在展示如何将基于时间Petri网的RTS模型在Ada 95中实现,并证明生成的代码与模型具有相同的语义。

2. 时间Petri网的基本概念

时间Petri网是一个元组$(P; T; F; B; M_0; SIM)$,其中$(P; T; F; B; M_0)$定义了一个标记的经典Petri网,$SIM$是一个称为静态区间的映射,它将每个转换$T$与一个正有理数区间相关联。TPN可以看作是带有标签的Petri网,每个转换都有两个时间值$(\sigma_i; \pi_i)$,分别表示转换从启用开始到可以触发的最小时间和最大时间。

在我们的模型中,根据转换的不同功能,将其分为以下三种类型:
- CODE转换 :与输入位置一起表示与活动相关的代码。当转换启用(即输入位置被标记)时,代码开始执行,时间值$(\sigma; \pi)$表示活动的执行时间。
- TIME转换 :与时间事件(如超时)相关,其时间信息用区间$(\sigma; \sigma)$表示,触发表示事件的发生。
- SYCO转换 :用于执行同步和控制任务,没有时间意义,触发会导致简单的状态变化。

以下是一个TPN建模周期性过程的示例:

loop
  CODE;              -- B
  select
    Proc_B.entry_A;
  or
    -- c
    delay 1.0;
  end select;
  delay until Next;  -- A
  Next := Next + 10.0;
end loop;

该代码展示了一个周期性执行的过程,包括代码执行、同步和延迟操作。

3. 将Petri网分解为进程

时间Petri网可以描述RTS的行为,通常可以识别出多个并发活动或进程。实现基于TPN的RTS的第一步是隔离这些进程及其相互连接。基本方法是将相互排斥的转换集合并为一个进程,通过计算单标记p - 不变量来确定转换之间的相互排斥关系。

最终,一些不属于任何进程的位置用于建模进程之间的异步通信,而共享转换表示同步通信。

4. 示例

考虑一个由周期性活动和另一个活动组成的RTS模型,通过计算单标记p - 不变量,可以识别出三个进程:
- Proc 1 :表示活动1的周期性激活器。
- Proc 2 :是活动1的主体。
- Proc 3 :对应活动2。

以下是为这些进程和共享位置提出的Ada 95代码:

task body S1 is
begin
  accept Mark;
  Proc_A1.Demark_S1;
end S1;

-- The same structure for
-- the place PA
task body Proc_A1 is
  LLE: Time;  -- Last_Event
begin
  LLE := CLOCK;
  loop
    select
      accept Demark_S1;
      LLE := CLOCK;
      exit;
    or
      delay until LLE + PERIOD_ACT;
      LLE := LLE + PERIOD_ACT;
      PA.Mark;
    end select;
  end loop;
end Proc_A1;

task body Proc_A3 is
begin
  loop
    select
      S3.Demark;
      exit;
      then abort
        CODE_3;
    end select;
    Proc_A2.Rendezvous;
    CODE_4;
  end loop;
end Proc_A3;

task body Proc_A2 is
  LLE: Time;  -- Last_Event
begin
  LLE := CLOCK;
  loop
    accept Demark_PA;
    LLE := CLOCK;
    select
      delay until LLE + TIME_OUT_1;
      LLE := LLE + TIME_OUT_1;
      S1.Mark; S3.Mark; exit;
      then abort
        CODE_1;
      LLE := CLOCK;
    end select;
    select
      accept Rendezvous do
        CODE_2;
      end Rendezvous;
      LLE := CLOCK;
    or
      delay until LLE + TIME_OUT_2;
      LLE := LLE + TIME_OUT_2;
    end select;
  end loop;
end Proc_A2;

protected body S3 is
  entry Demark when Marks > 1 is
  begin
    Marks := Marks - 1;
  end Demark;
  procedure Mark is
  begin
    Marks := Marks + 1;
  end Mark;
end S3;
5. 软件实现

每个进程可以在具有循环结构的Ada任务中实现,通过标记在p - 不变量中的流动揭示转换的执行顺序。

  • SYCO转换 :表示进程内部的决策或进程之间的同步通信。
  • CODE转换 :涉及执行其关联的代码。
  • TIME转换 :表示进程执行中的延迟,通常用延迟语句实现。为避免累积漂移,每个包含TIME转换的进程关联一个时间变量 Last Event ,记录最后一次标记更新的时间。

当出现冲突(即一个位置有多个输出转换)时,需要使用更复杂的Ada语句。通过对每个Ada语句的语义进行建模,并使用约简规则将模型约简为原始网的结构,可以证明提出的代码与模型具有相同的语义。

6. 建模带延迟分支的select语句

提出一个网来建模具有多个 accept 和一个延迟分支的 select 语句。服务器在等待客户端调用其入口时,直到一个输出SYCO转换被启用,然后触发该转换,开始执行相应的代码。如果在指定时间内没有客户端调用,TIME转换触发,放弃进行任何同步的可能性。

以下是相关的网模型和代码示例:

select
  accept entry_1 do
    CODE1;
  end;
  Code_Branch_1;
or
  accept entry_i do
    ...
or
  delay D;
  Code_Branch_delay;
end select;

通过以上内容,我们展示了如何将时间Petri网结构转换为Ada 95代码,并确保代码的语义与模型一致。

时间Petri网结构的转换与实现

7. 代码实现的详细分析

在将时间Petri网转换为Ada 95代码的过程中,我们需要对不同类型的转换进行详细的实现分析。下面通过表格的形式,对三种转换类型的实现进行总结:
| 转换类型 | 实现方式 | 注意事项 |
| ---- | ---- | ---- |
| CODE转换 | 当输入位置被标记时,执行与之关联的代码,时间值$(\sigma; \pi)$决定代码执行的时间范围 | 确保代码的执行时间在规定的范围内,避免出现超时或提前完成的情况 |
| TIME转换 | 使用延迟语句实现,为避免累积漂移,关联时间变量 Last Event 记录最后标记更新时间 | 准确计算延迟时间,根据 Last Event 和预设的时间间隔进行延迟操作 |
| SYCO转换 | 用于同步和控制任务,触发时进行简单的状态变化 | 保证同步和控制的准确性,避免出现状态不一致的问题 |

下面是一个mermaid格式的流程图,展示了一个简单的TPN转换为Ada代码的流程:

graph TD;
    A[时间Petri网] --> B[识别转换类型];
    B --> C{转换类型};
    C -->|CODE转换| D[执行关联代码];
    C -->|TIME转换| E[使用延迟语句并更新时间变量];
    C -->|SYCO转换| F[进行同步和控制操作];
    D --> G[完成代码执行];
    E --> G;
    F --> G;
    G --> H[检查是否有冲突];
    H -->|有冲突| I[使用复杂Ada语句];
    H -->|无冲突| J[继续执行];
    I --> J;
    J --> K[结束流程];
8. 冲突处理与代码正确性证明

当一个位置有多个输出转换时,就会出现冲突。在这种情况下,我们需要使用更复杂的Ada语句来处理。为了证明提出的代码与模型具有相同的语义,我们采用以下步骤:
1. 建模语义 :对实现代码中使用的每个Ada语句的语义进行建模。
2. 约简模型 :使用约简规则将模型约简为原始网的结构。在约简过程中,需要保留所有的CODE和TIME转换,并将一系列SYCO转换的触发合并为一个具有相同行为的转换,确保原始模型和约简后的模型等价。

以下是一个处理冲突的示例代码:

select
  -- 分支1
  accept entry_1 do
    CODE1;
  end;
  Code_Branch_1;
or
  -- 分支2
  accept entry_2 do
    CODE2;
  end;
  Code_Branch_2;
or
  -- 延迟分支
  delay D;
  Code_Branch_delay;
end select;

在这个示例中,当出现冲突时,程序会根据不同的条件选择不同的分支执行。

9. 实际应用中的考虑因素

在实际应用中,将时间Petri网转换为Ada 95代码还需要考虑以下因素:
- 性能优化 :合理安排转换的执行顺序,减少不必要的延迟和同步操作,提高系统的性能。
- 错误处理 :在代码中添加适当的错误处理机制,以应对可能出现的异常情况,如超时、同步失败等。
- 可维护性 :编写清晰、易读的代码,添加必要的注释,方便后续的维护和扩展。

10. 总结

通过将时间Petri网转换为Ada 95代码,我们可以有效地实现实时系统的建模和分析。在转换过程中,我们需要对不同类型的转换进行准确的实现,处理好冲突情况,并证明代码的语义与模型一致。同时,在实际应用中,还需要考虑性能优化、错误处理和可维护性等因素。

通过本文的介绍,我们希望读者能够掌握将时间Petri网结构转换为Ada 95代码的方法,为实时系统的开发提供有力的支持。在未来的研究中,我们可以进一步探索如何更好地将时间信息融入到Petri网的建模和分析中,提高系统的准确性和可靠性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值