宋 羽,王 琨,张 宝
(中国兵器工业第203研究所,西安 710065)
武器系统大多是并发实时系统。武器系统开发中,仿真是一种重要验证手段。文中分析了并发实时系统的一般特性,归纳了仿真的两种硬件架构,并提出一种基于串行非实时计算机的并发实时系统仿真通用框架。
并发实时系统具有并发性和实时性。并发指的是可以在同一个芯片上多核、同一个处理器上的多个进程或在物理分离的多处理器上执行。实时性具有相对意义,通常来说,当不能满足定时约束或时限就被认为是致命错误时,就说这个定时约束是强的[1],武器系统的时间约束通常是致命的,因此武器系统一般为强实时系统。
一种典型的具有两个模块的并发实时系统如图1所示。该图描述了并发实时系统一种复杂形式,A与B既是数据的生产者,也是数据的消耗者。在图中,A或B可以是运行在不同处理器上的不同进程,也可以是运行于同一个处理器上的不同进程。虚线代表控制流,例如时钟或是外部事件中断;实线代表数据流。程序的运行由控制流激活。中间的小方框代表数据存储缓冲。由于A或B有各自独立的启动时刻,数据计算后不会立刻消失,而是放在存储缓冲区中。程序与数据的存在时间是不同的。
当A和B运行时间发生交叉时,如果允许在运行过程中间交换数据,A所使用的数据dBA将在tB2时刻发生变化(如图2),当A在tB2前后两次用到dBA,则在一次运算过程中将使用两个不同数据,这有可能导致运行错误,因此设计者要采用必要的措施消除这种不确定性,使数据仅在进程的开始时刻进入程序,一旦进入,在一次运算过程中不再改变,直至当次运算结束,文献[3]阐述了并发控制的几种方法。这些并发控制方法的数据传输时序可以表达为图2形式,B在 A的运行期间产生新的数据,而A直到B运行结束后下一个运行周期才会使用dBA。
图1 典型的并发实时系统模块图
图2 并发程序间的数据传输时序
按仿真实验中所取时间标尺t1(模型时间)与自然时间标尺t2(原型)之间比例关系可将仿真分为实时仿真和非实时仿真两大类,t1/t2=1为实时仿真,否则为非实时仿真[2]。一般仿真验证硬件架构见图3,实时仿真中仿真程序与被验证对象同时运行,通过数据采集装置采集实际对象的输入,产生标准输出与实际输出对比;非实时仿真一般采用数据记录装置记录实际对象的输入输出,实际对象运行结束后仿真程序从输入记录中读取输入数据,并生成标准输出与实际输出对比。
图3 仿真验证硬件架构
实时仿真对于仿真程序所运行的硬件要求较高,必须满足实时性要求;而非实时仿真可以运行于通用计算机上,具有较低的成本。文中的框架主要用于非实时仿真软件,通过统一调度模拟并发实时计算。
当采用通用计算机仿真并发实时系统时,有两个主要的约束,第一,通用计算机的运行方式是串行的,一次只能处理一件事;第二,在实时系统中,有硬时钟保证时间约束,而通用计算机一般没有这种资源。需要一种有效的规范化设计方法,将并发实时系统转换为串行非实时结构。
对以上问题的一个解决方案是在仿真中使用单个调度程序统一调度进程,所有的进程运行时刻放在一个时间轴上排列,主控程序按时间顺序依次循环统一时间轴上的每个时间点,根据每个时间点上的程序标识选择进程,将并发的运行转化为串行的逻辑分支。该方法类似于数据库系统设计中所采用的时标排序并发控制方法[4],虽然数据库系统与仿真是两个完全不同的领域,但在它们所面临的并发问题具有相似性。
在实现该框架前,需先收集以下信息:
1)每个处理器上运行的进程,其中数据记录应作为运行于记录装置上的一个并发进程;
2)每个进程之间交换的数据;
3)每个进程的运行时间,确认是否可忽略,对于不可忽略时间的进程确定运行时间;
4)每个进程的启动条件。
该框架流程见图4,图中流程的详细说明如下:
1)生成进程和数据对应的时间列。
一般有以下几种方式:
a)采用数据记录中已有的时间列:该时间列通常来自于仿真对象或记录装置的内部时钟;
b)根据输入计算时间:适用于由外部输入触发的进程,例如在某个脉冲到来时才运行的程序;
c)固定的时间:适用于按照固定规律运行的进程,例如以固定周期运行的某个运算程序。
对于运行时间可以忽略不计的进程,仅仅为进程的运行建立时间列,对于运行时间不可忽略的进程,需要分解为“运行”和“数据更新”两个进程,每个进程的时间确定方法可以是以下两种方法之一:
①所有进程运行时刻使用实际进程开始时刻,接口数据的更新时刻使用发送方进程的结束时刻;
②所有进程运行时刻使用实际进程结束时刻,接口数据的更新时刻使用接收方进程的开始时刻。
2)由于不同硬件时钟可能存在误差,因此时间列需要同步。
3)按照时间排列运行次序。
有可能出现两个进程运行时间相同的情况,处理方法如下:
图4 仿真流程框架
b)位于不同处理器并且时间相同:这可能是巧合,也可能是因为记录设备的时间分辨率不够导致不能区分具有细微时差的两个进程。此时无法确定进程的先后顺序,只有以任意顺序排列进程。这种不确定性可能导致仿真结果与实际的偏离,因此仿真者应确保记录设备有足够的时间分辨率或者允许仿真结果和实际输出的偏离。
4)初始化状态变量时要包括所有数据接口缓冲和模块自身状态。
5)仿真循环,循环中判断当前步骤对应的进程标识,选择运行不同的进程。
以下是使用Matlab实现该框架一个样例:
%%================%%
%生成时间列,并分配标识
发展战略是发展行动的先导,是发展思路、发展方向、发展着力点的集中体现,要深入推进“乡村振兴战略”就必须全面贯彻习近平新时代中国特色社会主义思想和切实落实“五大发展理念”,不断拓宽发展新境界,落实发展新举措。通过这次研讨会全面深入的研讨,必将为我国乡村振兴和“三农”工作提供更多实践经验和理论镜鉴。
tIn=aTu;ProcIn=0*ones(size(tIn));
tA=aT0;ProcA=1*ones(size(tA));
tB=aT1;ProcB=2*ones(size(tB));
tRc=0∶0.01∶10;ProcRc=3*ones(size(tRc));
tA=tB-t0AB;%同步A和B
tsSim=sortrows([tA,ProcA;tB,ProcB;tRc;ProcRc],1);% 按时间排列运行次序
%初始化状态变量
.....
kIn=1;kOut=1;nCompute=length(tsSim);
%仿真循环
for k=1:nCompute;
procId=tsSim(k,2);t=tsSim(k,1);
switch procId
case 0;u=inputRec(kIn),kIn=kIn+1;
case 1;ya=fa(u,t);
case 2;yb=fb(ya,t);
case 3;y(kOut)=yb,kOut=kOut+1;
otherwise
end
end
%%================%%
文中的框架结构简单、易于扩展、适用范围广,可以有效加快仿真程序开发,提高代码质量;同时由于人的大脑类似低速串行处理器,通过转化模型,可以提高开发人员对于软件行为的清晰理解。
[1]Jane W S Liu.实时系统[M].北京:高等教育出版社,2002.
[2]何江华.计算机仿真导论[M].北京:科学出版社,2001.
[3]慕春隶.嵌入式系统的构建[M].北京:清华大学出版社,2004.
[4]George Coulouris,Jean Dollimore,Tim Kindberg.分布式系统概念与设计[M].金蓓弘,曹冬磊,译.北京:机械工业出版社,2008.