本发明涉及分布式仿真技术领域。更具体地,涉及一种分布式仿真实时网络的内存规划方法。
背景技术:
随着复杂武器装备研制的日趋复杂,竞争越发激烈,为规避风险,提高效率和降低费用,设计武器系统的时候,通常都要利用计算机建模与仿真技术、通信技术和计算机网络技术,对武器装备性能、技术指标、综合效能等进行虚拟仿真试验。目前的虚拟试验主要是以以太网为平台,以HLA/RTI为基础,但由于用以太网传输的TCP或UDP协议本身开销的不确定性,使得以太网很难满足对实时性要求很高的仿真系统。为了达到某些仿真试验中的性能和时间要求,必须要提高网络吞吐量和实时性,一种好的方法是选用共享内存实时网络。
共享内存是被多个进程共享的一部分物理内存,共享内存是进程间共享数据的一种最快的方法。目前共享内存实时仿真网络一般通过内存映射实现同节点内多个进程之间的内存共享,并采用系统信号量同步各进程对共享内存资源的互斥读写操作,实现进程间的数据交互。现有的实时网络在对内存的使用上是通常是混乱的,没有明确的方法,很大程度上降低了内存的利用率。
因此,需要提供一种有效提高分布式仿真实时网络的共享内存利用率的分布式仿真实时网络的内存规划方法。
技术实现要素:
本发明的目的在于提供一种分布式仿真实时网络的内存规划方法,解决现有分布式仿真实时网络的共享内存使用上的混乱和不足的问题。
为达到上述目的,本发明采用下述技术方案:
一种分布式仿真实时网络的内存规划方法,包括如下步骤:
S1、在共享内存空间中分配分布式仿真系统中各联邦成员的空间;
S2、在联邦成员的空间中分配该联邦成员的元素的空间;
S3、在分布式仿真系统运行过程中,根据联邦成员的运行状态,进行联邦成员的读写操作。
优选地,步骤S1进一步包括:
在共享内存的空闲空间中查找符合该联邦成员大小的空闲块,将该空闲块作为分配给该联邦成员的空间;
在该联邦成员的空间中分配该联邦成员的数据区域和控制区域。
优选地,步骤S2进一步包括:
在元素所属的联邦成员的空闲数据区域中查找符合该元素大小的空闲区域,将该空闲区域作为分配给该元素的空间;
在该元素的空间中存储该元素;
在各联邦成员的控制区域存储所有联邦成员的读写标志位和所有联邦成员的元素的元素描述信息,其中,元素描述信息包括元素的起始地址、类型和大小。
优选地,步骤S3进一步包括:
如果联邦成员处于读操作的状态,将该联邦成员的读标志位置0,识别待读取的数据,根据元素描述信息获取待读取的数据的地址,取出待读取的数据;
如果联邦成员处于写操作的状态,将该联邦成员的写标志位置0,识别待写入的数据,根据元素描述信息获取待写入的数据的地址,将待写入的数据更新到共享内存中。
优选地,该方法进一步包括如下步骤:
S4、在联邦成员发生变化时,动态变更联邦成员的空间。
优选地,步骤S4进一步包括:
在联邦成员发生变化时,
如果是联邦成员中的元素发生变化:
在联邦成员中查找该元素描述信息,将该元素从该联邦成员的数据区域中删除,以释放该元素的空间;查找释放的空间是否和左右的空闲空间相邻,如果相邻,合并释放的空间和空闲空间;删除各联邦成员的控制区域中该元素的元素描述信息;
如果是联邦成员发生变化:
将该联邦成员从共享内存中删除,释放该联邦成员的空间;查找释放的空间是否和左右的空闲空间相邻,如果相邻,合并释放的空间和空闲空间;删除各联邦成员的控制区域中该联邦成员的读写标志位。
本发明的有益效果如下:
本发明有效地填补了现有分布是仿真实时网络的共享内存使用上的混乱和不足。分布式仿真实时网络由多个节点组成,本发明使得实时网络的共享内存得到更有效地利用,避免了以往使用上的混乱和浪费。本发明在保证仿真系统正常运行的前提下,合理高效的共享内存使用,能够减少在共享内存空闲空间搜索和使用上耗费的时间,可以提高分布式仿真实时网络的共享内存利用率,进而在一定程度上可以提高仿真系统的运行效率。分布式仿真系统在各个领域都有很大的需求,本发明可以应用到各个领域中去,同时也可以将本发明扩展到其他实时网络的应用中,具有很好的前景。
附图说明
下面结合附图对本发明的具体实施方式作进一步详细的说明。
图1示出分布式仿真实时网络的内存规划方法的流程图。
图2示出分布式仿真实时网络的内存规划方法规划的共享内存空间的示意图。
具体实施方式
为了更清楚地说明本发明,下面结合优选实施例和附图对本发明做进一步的说明。附图中相似的部件以相同的附图标记进行表示。本领域技术人员应当理解,下面所具体描述的内容是说明性的而非限制性的,不应以此限制本发明的保护范围。
如图1所示,本发明公开的一种分布式仿真实时网络的内存规划方法,包括如下步骤:
S1、在共享内存空间中分配分布式仿真系统中各联邦成员的空间;
S2、在联邦成员的空间中分配该联邦成员的元素的空间;
S3、在分布式仿真系统运行过程中,根据联邦成员的运行状态,进行联邦成员的读写操作。
本方案中,步骤S1中:
分布式仿真系统具有多个联邦成员,在共享内存中动态分配每个联邦成员的空间,联邦成员的空间包括该联邦成员的数据区域和控制区域。联邦成员的数据区域用于存储该联邦成员的数据信息,该联邦成员的数据信息包括属于该联邦成员的元素;联邦成员的控制区域用于存储联邦成员的控制信息,联邦成员的控制信息包括所有联邦成员的读写标志位和所有联邦成员的元素的元素描述信息。联邦成员的读写标志位用于通过控制其变化在步骤S3中进行该联邦成员在共享内存中的读写操作,并根据读写操作中的读写数据的大小动态分配空间和地址。
步骤S1的具体过程为:
在共享内存中查找是否有联邦成员的数据信息:如果已经存在该联邦成员的数据信息,则不执行动作;如果共享内存中不存在该联邦成员的数据信息,则在共享内存的空闲空间中查找符合该联邦成员大小的空闲块,将该空闲块作为分配给该联邦成员的空间,之后返回该空闲块地址,进而返回该联邦成员的起始地址。之后,在该联邦成员的空间中分配该联邦成员的数据区域和控制区域,返回数据区域和控制区域的起始地址。示例如下:
(1)使用函数map<int,int>fedData_busyArea分配联邦成员数据区域,其中fedData_busyArea中的第一个参数表示联邦成员编号,第二个参数表示该联邦成员数据区域在共享内存中的起始位置;
(2)使用函数map<int,int>fedControl_busyArea分配联邦成员控制区域,其中fedControl_busyArea中的第一个参数表示联邦成员编号,第二个参数表示该联邦成员控制区域在共享内存中的起始位置。
本方案中,步骤S2中:联邦成员可能由一个或者多个元素组成,在联邦成员的数据区域分配该联邦成员的元素的空间并在元素的空间中存储元素,返回元素的起始地址和元素所占用的长度(所占的长度即大小);在各联邦成员的控制区域存储所有联邦成员的读写标志位和所有联邦成员的元素的元素描述信息,其中,元素描述信息包括元素的起始地址、类型、大小等。
步骤S2的具体过程为:
在共享内存中查找是否存在元素所属的联邦成员,如果元素所属的联邦成员已经存在,在元素所属的联邦成员的空闲数据区域中查找符合该元素大小的空闲区域,将该空闲区域作为分配给该元素的空间,在该元素的空间中存储该元素,返回元素的起始地址和元素所占用的长度(所占的长度即大小);在各联邦成员的控制区域存储所有联邦成员的读写标志位和所有联邦成员的元素的元素描述信息,其中,元素描述信息包括元素的起始地址、类型、大小等。示例如下:
(1)使用函数multimap<int,map<int,unsigned long>>fedData_busyArea分配元素的空间,其中fedData_busyAre中第一个参数表示联邦成员编号,第二个参数表示元素的编号,第三个参数表示该元素在共享内存中的起始位置;
(2)使用函数multimap<int,int,string,map<int,unsigned long>>fedControl_busyArea分配元素所属的联邦成员的控制区域,其中函数中第一个参数表示联邦成员的读取标志位,第二个参数表示联邦成员的写入标志位,第三个参数表示元素描述信息,fedControl_busyArea中第一个参数表示联邦成员编号,第二个参数表示该联邦成员控制区域在共享内存中的起始位置。
本方案中,步骤S3的具体过程为:
在分布式仿真系统运行过程中,根据联邦成员的运行状态,变更联邦成员的读写标志位,进行联邦成员的读写操作,具体为:
如果联邦成员处于读操作的状态,将该联邦成员的读标志位置0,识别待读取的数据,根据元素描述信息获取待读取的数据的地址,取出待读取的数据;
如果联邦成员处于写操作的状态,将该联邦成员的写标志位置0,识别待写入的数据,根据元素描述信息获取待写入的数据的地址,将待写入的数据更新到共享内存中。示例如下:
(1)使用函数updateCtrlArea<int,int,unsigned long<int,unsigned long>>fedControl_busyArea更新联邦成员控制区域中的读写标志位的值,获取待读写操作数据的起始地址。其中函数中第一个参数表示联邦成员的读取标志位,第二个参数表示联邦成员的写入标志位,第三个参数表示该元素的起始地址,fedControl_busyArea中第一个参数表示联邦成员编号,第二个参数表示该联邦成员控制区域在共享内存中的起始位置;
(2)使用函数updateDataArea<int,unsigned long,map<int,unsigned long>>fedData_busyArea完成对联邦成员内元素数据区域的读写操作,其中第一个参数表示元素的编号,第二个参数表示元素数据区域的在共享内存中的起始位置,fedData_busyArea中的第一个参数表示联邦成员的编号,第二个参数表示联邦成员数据区域在共享内存中的起始地址。
本方案中,该方法进一步包括如下步骤:
S4、在联邦成员发生变化时,动态变更联邦成员的空间。
本方案中,步骤S4的具体过程为:
在联邦成员发生变化时,动态变更联邦成员已分配的空间,释放不需要的空间。如果是联邦成员中的元素发生变化,在联邦成员中查找该元素描述信息,将该元素从该联邦成员的数据区域中删除,以释放该元素的空间;之后,查找释放的空间是否和左右的空闲空间相邻,如果相邻,合并释放的空间和空闲空间;之后,删除各联邦成员的控制区域中该元素的元素描述信息。同理,如果是联邦成员发生变化,将该联邦成员从共享内存中删除,释放该联邦成员的空间,之后,查找释放的空间是否和左右的空闲空间相邻,如果相邻,合并释放的空间和空闲空间;之后,删除各联邦成员的控制区域中该联邦成员的读写标志位。示例如下:
(1)使用函数bool fedDataFree(int elemNum,int fedNum,int elemSize)释放元素的空间,其中fedNum表示联邦成员编号,elemNum表示元素编号,elemSize表示元素大小,返回值true/fasle表示成功或者失败;
(2)使用函数bool fedCtrlFree(int elemNum,int fedNum,int elemCtrlSize)释放元素的元素描述信息所占据的空间,其中fedNum表示联邦成员编号,elemNum表示元素编号,elemCtrlSize表示元素描述信息大小,返回值true/fasle表示成功或者失败;
(3)使用函数bool fedDataFree(int fedNum,int fedSize)释放联邦成员的空间,其中fedNum表示联邦成员编号,fedSize表示联邦成员大小,返回值true/fasle表示成功或者失败;
(4)使用函数bool fedCtrlFree(int fedNum,int fedCtrlSize)释放联邦成员的控制区域,其中fedNum表示联邦成员编号,fedCtrlSize表示联邦成员的控制区域大小,返回值true/fasle表示成功或者失败。
显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定,对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动,这里无法对所有的实施方式予以穷举,凡是属于本发明的技术方案所引伸出的显而易见的变化或变动仍处于本发明的保护范围之列。