【VC++开源代码栏目提醒】:网学会员为广大网友收集整理了,基于Windows的跨进程共享变量池设计 - 期刊论文,希望对大家有所帮助!
doi:10.3969/j.issn.1671-1041.2011.01.007 基于Windows的跨进程共享变量池设计 白 曦刘 强 电子科技大学 空天科学技术研究院成都 611731 摘要文章提出了一种基于Windows内存映射的跨进程共享变量池实施方案。
通过将共享变量池封装为动态库实现在运行时动态加载设计出了可复用、可扩展和跨平台的共享变量池。
同时文章针对共享变量池中的多种数据类型通过定义变量数据块联合体对共享变量池进行单元划分实现通过变量名称或ID获取共享变量池内变量并且针对跨进程的特点采用事件队列的方法记录同一变量的访问状态。
采用以上方法设计出的共享变量池不但操作简单而且效率极高现在以其在航电仿真系统中的应用为例来证明此设计
方案的高效可行性。
关键词内存映射进程事件队列共享变量池 中图分类号TP311.1 文献标志码A Design of shared variable pool with multi-process based on Windows BAI XiLIU Qiang Institute of Astronautics Aeronautics University of Electronic Science and Technology of China Chengdu 610054China Abstract: This paper presents an applicable solution for Design of Shared Variable Pool with Multi-process Based on Windows. Packaging the shared variable pool for dynamic library achieved dynamically loaded at run time design of the reusable and extensible shared memory pool. At the same time this paper aimed at various data type in shared variable pool by defining the variable data union divided shared variable pool into different unit Achieved by variable name or ID to access the shared variable pool variable And aimed at the characteristics of the multi-process using the event queue to record the state of the same variable. By using the above method to design the shared variable pool not only simple but also highly efficient Now it’s in the avionics simulation system as an example prove feasibility of this design efficiently Key
words: memory mappingprocess event queueshared variable pool 0 引言 随着电子信息技术在航空电子系统中的广泛应用使飞行器任务系统的机动性能得到加强和完善的同时也更加强调了飞行器航空电子仿真系统的作用和地位。
而作为航空电子仿真系统的重要组件——航电仿真模型的设计就显得尤为重要。
本
论文针对在模型设计中出现的问题提出了相应的解决办法。
首先各载荷模型中的变量需要可动态地修改能够在不修改程序的基础上对各模型中DOICNKI:12-1334/TH.20110106.1651.006 网络出版时间2011-01-06 16:51:35
网络出版地址http://www.cnki.net/kcms/detail/12.1334.TH.20110106.1651.006.html 的变量进行添加或删除。
针对这种情况鉴于XML文件几乎可以描述所有的数据类型的特性文章将各个模型所需的变量设计成XML文件通过设计相关程序在软件启动时动态读取XML文件进行变量创建实现了变量创建和在模型中对变量操作的分离在变量池内对共享变量存储空间进行动态分配。
当需要在变量池内添加或删除变量的时候只需要修改共享变量XML文件就可以实现对变量池的更新从而实现了共享变量的动态创建。
其次由于不同系统的仿真模型之间存在着大量的数据交联使得大部分情况下不同模型之间的数据传递无法通过简单的参数传递和变量共享的方式实现导致了个系统仿真模型
设计的复杂度和开发的难度大幅度提升。
由于内存映射文件提供了管理大型数据流通常来自文件以及在单个计算机上运行的多个进程或应用程序的多个线程之间共享数据的方法因此内存映射文件是解决本地多个进程间数据共享的最有效方法1。
文章采用内存映射技术和多进程同步机制有效地解决了各系统仿真模型之间数据的交互以及多进程中变量共享的
问题。
采用共享变量池创建共享变量的方法不但具有极大的可扩展性和可移植性同时也方便了开发人员对多进程共享变量的访问、管理降低了相关函数的编写难度。
采用了Windows内存映射机制来申请共享变量池的内存空间根据XML文件设置的变量标识系统名变量名和变量类型标识在申请的内存空间里创建系统共享变量创建事件队列将共享变量的创建、修改、删除等操作入队采用事件队列和时间片轮询的方式对共享变量的访问事件进行轮询实现了变量的一次性创建和变量的统一访问管理从而可以在多进程中通过变量标识和变量ID实现对变量的处理进一步减轻了开发人员编写功能实现函数的负担提高了开发效率。
采用这种基于Windows内存映射的跨进程共享变量设计方案可以快速地创建出大量进程安全的共享变量对于
系统软件开发效率的提升及软件结构复杂度的简化是极其明显的。
1共享变量的XML文档设计 1.1共享变量的XML文档实现 XML文档中描述的共享变量包括系统名、变量名、变量类型、变量初始值四部分基本信息而XML文档的元素只允许有一个内容但可以有多个属性所以为了便于解析和实现将共享变量的信息都以XML文档元素属性的形式表示在XML文档元素的属性项中将基本信息表示为相对应的属性值2。
下面是描述共享变量信息的XML文档的部分内容 整个文档包括两部分其中节点所描述的是仿真模型的系统信息节点所描述的是仿真模型与其他仿真模型或主
程序共享的变量信息。
name属性是仿真模型的系统名称objectNum属性是仿真模拟实例的存在数量varName属性是共享变量的变量名varType属性是共享变量的数据类型Value是变量的初始值。
采用XML文档存储变量信息有效地实现了共享变量信息和共享变量DLL的分离。
如果要添加新的仿真模型或新的模型变量只需要按照以上格式修改XML文档即可不用重新编写编译程序。
在共享变量DLL加载的时候就可以通过解析XML
文档得到仿真系统和模型变量的所有信息在共享变量池内申请存储空间从而实现共享变量的动态创建和调用。
1.2共享变量的XML
文档解析 建立好共享变量的XML文档后还需要编写解析程序在运行时加载并在内存里建立共享变量信息的存储空间。
XML解析器现在使用非常广泛用C/CJAVA等各种语言编写的
开源版本已广为使用本例中采用了
VC语言编写的解析器。
其解析思想是对XML文档的节点采用向下递归的方法遍历整个XML文档。
首先获取XML文档的一个根节点由根节点查找其一个子节点如果该子节点非空就设置一些变量用以保存解析该子节点的信息然后查找该子节点的下级子节点如果下级子节点非空就设置一些变量用以保存解析下级子节点的信息然后再查找子节点的同级兄弟节点重复以上操作依次递归下去就可以实现XML文档的解析。
2共享变量池设计 2.1共享变量池的构建 共享变量池主要包括两种功能一种是共享变量的随机访问完成进程间共享变量存储数据的交互其中进程对共享变量的访问是非实时的另外一种是共享变量的数据记录访问时间记录和状态记录整个是个实时过程。
针对以上两项要求本文为共享变量池设计了符合要求的结构体和内存管理模式。
变量的结构体主要包括变量数据块、事件数据结构体和事件队列结构体三个变量结构体相互关联层层嵌套组成了共享变量池交互和记录数据的最基本结构单元。
其中变量数据块结构体包括块使用标志、变量所属系统名称、变量名称、变量类型和包含多个数据类型变量的联合体事件数据结构体主要包括事件类型、事件发生时间和事件关联的数据事件队列结构体主要包括写入位置和事件存储区。
三个变量结构体的逻辑关系如图1所示。
图1 变量结构体关系 变量的内存管理模式采用的是双内存映射文件的方式。
本文在内存申请了两份内存映射文件一份是变量区的内存映射文件一份是事件队列的映射文件。
首先把变量区的内存映射文件划分成以变量数据块结构体为元素的数据单元用以存储共享变量信息并且把事件队列的映射文件映射成一个完整的事件队列结构体用以记录对变量区内存映射文件存储变量的操作。
当在变量区内存映射文件创建、修改和删除变量时会将对变量的操作和变量值记录到事件数据结构体并将事件数据结构体添加到事件队列映射文件供外界函数访问以便把共享变量的状态写入外部文件。
内存的管理模式如图2所示。
文件lpData????structVarBlock????lpEventQueue??structEventQueue??structEventData变量区内存映射文件中间数据变量事件队列映射文件lpData????offSet变量创建??修给和删除事件数据入队事件数据出队写入位置.??.??.事件数据事件数据变量数据变量数据.??.??..??.??..??.??. 图2 内存的管理模式 2.2共享变量池的同步 针对共享变量池中存在的多个进程同时访问同一资源的情况本文采用互斥体实现对共享变量池数据块的互斥访问。
本文出于对访问效率和程序设计方面的考虑没有对共享变量池的每个数据块进行互斥访问而是对实现共享变量池数据块访问的
代码段设置了互斥保护。
具体的实施过程为在DLL加载时调用CreateMutex创建互斥对象在访问共享内存数据块的
代码段开始的地方添加WaitForSingleObject等待互斥对象当进程获得互斥对象时进程被唤醒调用访问共享内存数据块的
代码代码执行完后调用ReleaseMutex释放互斥对象完成访问。
图3展示了共享变量池的同步过程。
图3共享变量池同步过程 2.3共享变量池的实现 在经过XML文档的设计和共享变量池的构建后共享变量池的实现过程变得简单了许多。
首先对创建内存映射文件进行数据单元格的划分和变量事件队列的映射创建变量同步事件和事件队列同步事件及临界区变量用于共享变量池DLL调用进程的同步并且启动多媒体定时器以实现对进程内数据回调函数的周期调用完成共享变量访问状态的记录。
然后读取XML文档的数据初始化内存映射文件的数据单元并且将记录内存映射文件操作的事件数据结构体变量添加到变量事件队列的映射同时设置数据事件记录回调函数到回调函数向量表。
图4显示了共享变量池的初始化过程。
开始初始化共享内存池initVarPool读取XML文档readXML文档是否结束??结束创建共享变量CreateVar变量操作事件入队EventQueueBPush???? 图4共享变量池初始化 完成共享变量池初始化后就可以调用DLL的接口函数来操作共享变量池的变量。
首先调用FindVarID函数通过系统名和变量名获得变量在内存池内的ID再调用GetValueByID和SetValueByID完成对共享变量池内变量值的提取和设置或者调用EraseVarByID删除变量。
同时在每次设置和删除变量时还会调用EventQueue_Push函数将对变量的操作记录到变量事件队列。
当变量事件队列修改后周期性记录回调函数会调用EventQueue_Pop函数将变量事件取出存入记录文件。
图5显示了共享变量池的访问过程。
图5共享变量池的访问 3 结束语 使用XML封装数据再通过解析实现动态可配置的软件是现在流行的一种软件技术。
使用这种技术构建的共享变量池具有高度的可扩展性和通用性并且简化了
软件结构和降低了软件开发的难度。
采用上述技术设计共享变量池已用于航空电子仿真系统仿真试验软件通过加载共享变量池完成系统内共享变量的设置各个仿真模型读取共享变量池内的变量初值对模型内部变量初始化并且将仿真得到的数据回写到共享变量池以供仿真实验软件和其他仿真模型调用整个系统已开发完成并且在实际应用中表现出良好的性能。
□ 参考文献 1 Jeffrey Richter.Windows核心编程M.机械工业出版社2003. 2 Elliotte Rusty Harold.XML实用大全M.中国水利水电出版社200049-156. 3 吴洁.XML应用教程M 200711-50. 4 陆其名.脚本驱动的应用软件开发方法与实践M.清华大学出版社20062:27-30. 5 Sartaj Sahni.数据结构算法与应用-C语言描述M.机械工业出版社20047:229-237. 6 David j.Kruglinski.Visual C技术内幕M.清华大学出版社19987:209-224. 7 罗斌.Visual C编程技巧精选M.北京:中国水利水电出版社2005. 作者简介白曦1985-女硕士研究生研究方向航空电子系统测控技术及任务
计算机机载软件设计刘强男教授研究方向
导航与制导技术和测试技术与仪器。
收稿日期2010-09-09