HLA 时间管理中的零前瞻量简介

来源:互联网 发布:linux安装wget 编辑:程序博客网 时间:2024/06/05 11:42

1.什么是前瞻量?

前瞻量(Lookahead),是时间调节的联邦成员在设置其时间管理机制为时间调节时所指定的一个时间段。在餐馆联邦中,前瞻量必须为正值。然而,事实上前瞻量在某些情况下,可以甚至需要设置为0。我们将在之后详细介绍使用零前瞻量的情形。


2.为什么需要前瞻量?

之所以引入前瞻量,是为了避免死锁的出现。比如有一个采用保守机制的联邦,它有2个联邦成员A和B,A和B都是既时间受限又时间调节,且没有前瞻量。这样,当A和B都到达某一时刻T时,将导致A和B的仿真时间都不能超过T。比如,A的仿真时间超过了T到达T1,这时候B还处于T,因此B有可能会向A发出时间戳为T的事件,这将导致A收到过去发生的事件,这在保守的联邦机制中是不被允许的。同理,B的仿真时间也不能超过T,这样会导致A和B都不能向前推进仿真时间,相互等待,形成死锁。


解决死锁,有两种方法:

一是采用优化的联邦机制,允许联邦成员收到过去发生的事件,当这种情况发生时,该联邦成员必须回退到该过去事件的时间点,关于这种方法,我在以后的文章中会详细介绍。

二是引入前瞻量。前瞻量其实就是联邦成员对RTI提出的一种保证,其保证不发出时间点在前瞻量范围内的事件,这样其他的联邦成员可以不必担心会收到此时间范围内的事件而将其自身仿真时间推进到该范围以外。

本质上来说,前瞻量是联邦成员对自身仿真行为做出的一种预测,即当联邦成员能够预测到其从当前时间点起的某个时间范围内将不发出外部事件时,该时间范围即是前瞻量。


3.对于零前瞻量的仿真需求?

当我们进行仿真活动时,我们希望我们的仿真系统尽可能的与真实世界的实际情况相同,但是在采用保守机制的联邦中,有时候可能会出现一些我们想要避免出现的情况。举个例子,假设有一个模拟空战的仿真系统,要模拟一枚导弹击中一架飞机。在真实世界中,这其实是一个事件,但是仿真系统中实际是使用两个事件来仿真的:1.导弹击中飞机(从导弹的角度);2.飞机被导弹击中(从飞机的角度)。在采用保守的联邦机制的联邦中,一般是1或者2先发生,然后引发发出2或者1事件,但是1和2的时间戳存在着先后关系,这是不符合真实世界的情况的。而采用零前瞻量后,我们可以实现1和2在同一仿真时间被调度。


4.零前瞻量的实现机制?

零前瞻量的实现机制,是增加两个时间推进请求函数:NEXT EVENT REQUEST AVAILABLE和TIME ADVANCE REQUEST AVAILABLE。假设在某一时刻T1,某一联邦成员利用上述其中一个函数提出将时间推进T2的请求时,如果此时RTI中还有时间戳为T1的事件需要发给该联邦成员处理时,RTI将会把grant给该联邦成员的时间仍设为T1,然后该事件发给这个联邦成员,而这个联邦成员处理完这个事件以后还可以向外发出时间戳为T1的事件,然后再次调用上述其中一个函数提出将时间推进T2的请求;如此反复,该联邦成员确信已处理完所有时间戳为T1的事件后,发出NEXT EVENT REQUEST或者TIME ADVANCE REQUEST,最终推进时间。


5.flush queue request简介

时间管理服务flush queue request是专门为优化联邦成员提供的,它与NER和TAR不同之处在于,当联邦成员嗲用这个服务从而进入时间推进状态后,RTI会一次性把TSO事件队列中的所有TSO事件全部发给该联邦成员,而不考虑未来可能还有其它时间戳早于之前发送的事件的时间戳的事件到达;而在NER和TAR中,RTI只会发送TSO事件队列中的那些时间戳小于或等于该联邦成员请求时间的事件发送给该联邦成员。

在RTI确定没有其他时间戳小于该联邦成员的申请时间之前的事件到达后,RTI就把申请时间批准给该联邦成员;否则,RIT就会批准一个小一些的时间,且该时间有可能等于该联邦成员的当前时间,也即是仿真时间并没有推进。