一种电能质量管理系统共享内存更新方法与流程

文档序号:16330830发布日期:2018-12-19 06:11阅读:183来源:国知局
一种电能质量管理系统共享内存更新方法与流程

本发明属于通信设备技术领域,尤其是涉及一种电能质量管理系统共享内存更新方法。

背景技术

电能质量管理系统共享内存是在其多进程进行数据交互的一个核心,各个进程可以实时高效对其进行访问和读写操作。当数据成功由系统数据库中导入到共享内存后,它相当于用一个字符串指针来指向一块内存,各个进程通过字符串指针对共享内存表数据记录进行访问和读写操作。

共享内存是系统中多个进程共享的一部分物理内存,是多个进程之间需要共享的一些数据的集合,方便多个进程之间进行数据交互。一个简洁高效的共享内存存储结构,影响整个系统的数据准确性和稳定性。共享内存存储结构在多进程获取共享内存数据和写入更新共享内存数据中起着重要的作用。共享内存数据结构需要方便进程实时高效准确获取共享内存表数据的地址,需要能够准确存储所需要保存的各种类型的数据表,需要具有一定的容错机制。现有电能质量管理系统的的共享内存中存在共享内存表结构混杂,读写共享内存机制繁杂,影响到系统进程对共享内存数据的读写的效率和稳定性。



技术实现要素:

有鉴于此,本发明旨在提出一种电能质量管理系统共享内存更新方法,以解决电能质量管理系统中共享内存中存在共享内存表结构混杂,读写共享内存机制繁杂的问题。

为达到上述目的,本发明的技术方案是这样实现的:

一种电能质量管理系统共享内存更新方法,包括:

s1、通过电能质量管理系统数据库中不同功能的共享内存表配置信息,创建对应的共享内存表对象;共享内存表对象用于加载电能质量管理系统共享内存中各种类型共享内存表的类型和数据;

s2、创建共享内存表对象数组,将s1步创建的共享内存表对象保存到该数组中;

s3、电能质量管理系统共享内存管理服务进程获取更新内存命令,从共享内存表对象数组的共享内存表对象中查找需要更新的共享内存表数据信息,进行更新。

进一步的,所述步骤s1中,共享内存表包括终端通道信息表、厂站智能表计信息表、厂站终端信息表、系统进程信息表、系统服务器节点信息表、系统服务配置信息表、抄表任务模板信息表、抄表任务设置信息表。;

所述共享内存表事先配置在电能质量管理系统数据库中,每次电能质量管理系统启动后,共享内存管理服务进程从数据库中通过加载这些共享内存表配置信息,创建和初始化对应的共享内存表对象;

每种共享内存表对象直接保存对应类型共享内存表的表主键id和表记录项数据。

进一步的,所述共享内存表对象包括表主键id和hash数组;

表主键id:用于识别每个共享内存表;

所述hash数组包括多个元素,每一个元素直接绑定电能质量管理系统共享内存表每一条记录项数据存储空间;对共享内存表对象中的hash数组元素进行更新相当于直接对电能质量管理系统共享内存中表记录项数据进行操作;当共享内存表对象hash数组数据发生改变,其他进程可以立即获取到更新的数据。

进一步的,每个共享内存表包括多条表记录项数据,所述表记录项数据是由对应的共享内存表对象中hash数组存储;

所述hash数组的每个元素结构包括hash地址、表记录主键id、表记录数据、表记录属性、表记录存储下一跳hash地址组成;

hash地址:为每一条共享内存表记录项数据存储在共享内存表对象hash数组中元素的索引,该地址通过采用hash函数进行寻址;

表记录主键id:用于识别每个表记录;

表记录数据:为对应的表记录项数据;

表记录属性:为表记录的标志位;

表记录存储下一跳hash地址:用于存储下一条表记录的hash地址,当寻址到表记录属性标志位为碰撞状态时,表示该处存储记录中出现冲突,根据表记录存储的下一跳地址,指向下一个存储的hash地址;

共享内存表对象hash数组通过该hash地址来索引下一个hash数组元素。

进一步的,所述表记录属性的标志位包括初始状态、碰撞状态、有值状态;当处于异常情况时会设置无效值。

所述初始状态为表记录初始状态位;

碰撞状态为表记录有冲突地方,需要进入下一跳hash地址寻址;通过hash函数对hash数组进行索引操作,有不同的表记录主键id可能对应相同的存储hash地址,此时需要进入碰撞状态进一步寻址,存储或更新所关联的下一个hash数组元素。

有值状态为表记录已经写入内存表记录数据后更新的状态。

进一步的,所述步骤s3中,共享内存数据更新的具体方法如下:

s301、通过更新内存命令中获取表主键id和表记录主键id;在共享内存表对象数组通过表主键id查找共享内存表对象,然后在该共享内存表对象的hash数组中根据表记录主键id查找所有表记录项数据的主键id,如果查找到与需要更新的共享内存表的表记录主键id匹配,则返回该表记录hash地址a,如果该hash地址a所在元素表记录属性不是无效值,则更新更新内存命令中表记录数据;

s302、如果步骤s301中没有找到对应的表记录主键id存储的hash数组元素,则通过hash函数计算该共享内存表的表记录主键id应该存储的hash地址b,如果该hash地址b所在元素表记录属性处于初始状态,则进行表记录数据更新,并将初始状态改为有值状态,设置表记录存储下一跳hash地址为-1,表示该处存储数据没有下一跳hash地址;

s303、如果步骤s302中的hash地址b所在元素表记录属性不处于初始状态,表示已经被别的元素所占用,需要进入碰撞寻址的碰撞状态,通过碰撞寻址进行共享内存表的表记录数据更新。

进一步的,所述步骤s301中,如果hash地址a所在元素表记录属性不是无效值,更新共享内存表的方法为:先获取表记录属性的标志位,如果是有值状态则只更新表记录数据的共享内存数据;如果是初始状态,则需要更新表记录数据的同时,还需要将初始状态更新为有值状态,设置表记录存储下一跳hash地址为-1。

进一步的,所述步骤s303,碰撞寻址的具体方法如下:

s3031、首先在共享内存表空间依次查找首次出现的处于初始状态的共享内存表记录hash地址,设为hash地址e;

s3032、找到后,先将hash地址e所在元素的表记录存储下一跳hash地址设为hash地址b所在元素表记录存储下一跳hash地址;

s3033、在hash地址e所在元素中更新内存命令中表记录数据,将该元素的表记录属性由初始状态改为有值状态;

s3034、在hash地址b所在元素表记录存储下一跳hash地址设为hash地址e所在元素hash地址。并将在hash地址b所在元素表记录属性改为碰撞状态。相当于在hash地址b所在hash数组元素后追加了一个hash数组元素。

进一步的,所述步骤s303中碰撞寻址的具体方法如下:

s3021、循环找到下一跳hash地址和hash地址b一致的hash地址c所在元素,该元素表记录属性必须为碰撞状态,否则返回错误值;

s3022、在共享内存表中查找第一个表记录属性为初始状态的hash数组元素,其索引为hash地址d;

s3023、在hash地址c所在元素表记录存储下一跳hash地址设为hash地址d,并且将hash地址b所在元素替换hash地址d所在元素;然后设置hash地址b所在元素表记录属性为初始值;

s3024、将更新内存命令中需要更新的数值更新hash地址b所在元素中,设置hash地址b所在元素表计属性为有值状态,并且设置其表记录存储下一跳hash地址为-1;相当于将原先被其他非法值占用的共享内存表记录hash地址b所在元素数据移到其他未被占用的存储空间中,然后再重新在hash地址b所在元素中保存更新内存命令中的数据。

相对于现有技术,本发明所述的电能质量管理系统共享内存更新方法具有以下优势:

本发明所述的电能质量管理系统共享内存更新方法使整个电能质量管理系统共享内存表数据结构采用统一寻址方式,统一的表数据结构类型,并且采用单一的共享内存管理服务进程负责多进程读写任务。

附图说明

构成本发明的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1为本发明实施例所述的共享内存更新流程图;

图2为本发明实施例所述的共享内存表对象hash数组的存储结构图。

具体实施方式

需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。

在本发明的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”等的特征可以明示或者隐含地包括一个或者更多个该特征。在本发明的描述中,除非另有说明,“多个”的含义是两个或两个以上。

在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以通过具体情况理解上述术语在本发明中的具体含义。

下面将参考附图并结合实施例来详细说明本发明。

下所获得的所有其他实施例,都属于本发明保护的范围。

如图1所示,本发明实施例启动前需要进行的共享内存更新步骤:

1.启动共享内存进程。

2.从数据库导入共享内存表信息。

3.根据每种共享内存表创建每种表对象。共享内存表包括终端通道信息表,厂站智能表计信息表,厂站终端信息表,系统进程信息表,系统服务器节点信息表,系统服务配置信息表、抄表任务模板信息表,抄表任务设置信息表。共享内存表对象包含表主键id和表数据。表主键id主要是用于共享内存服务进程检索数据。

4.创建共享内存表对象数组,将共享内存表对象保存到该数组。将步骤3中共享内存表对象全部集中保存到共享内存表对象数组中。

5.电能质量管理系统共享内存管理服务进程获取更新本地共享内存命令synch。

6.电能质量管理系统共享内存管理服务进程通过更新本地共享内存命令,从共享内存表对象数组中获取需要更新的共享内存表数据信息。

7.通过步骤6的共享内存表对象获取hash数组元素。

8.通过内存更新机制更新hash数组元素。

当需要更新贡献内存表记录数据时,具体方法如下:

a.通过更新内存命令中获取表主键id和表记录主键id。在共享内存表对象数组通过表主键id查找共享内存表对象,然后在该共享内存表对象的hash数组中根据表记录主键id查找所有表记录项数据的主键id,如果查找到与需要更新的共享内存表的表记录主键id匹配,则返回该表记录hash地址a,如果该hash地址a所在元素表记录属性不是无效值,则更新更新内存命令中表记录数据。

b.如果“步骤a”中没有找到对应的表记录主键id存储的hash数组元素,则通过hash函数计算该共享内存表的表记录主键id应该存储的hash地址b,如果该hash地址b所在元素表记录属性处于初始状态,则进行表记录数据更新,并将初始状态改为有值状态,设置表记录存储下一跳hash地址为-1,表示该处存储数据没有下一跳hash地址。

c.如果“步骤b”中的hash地址b所在元素表记录属性不处于初始状态,表示已经被别的元素所占用,需要进入碰撞寻址的碰撞状态,通过碰撞寻址进行共享内存表的表记录数据更新碰撞寻址更新数据的具体方法为首先在共享内存表空间依次查找首次出现的处于初始状态的共享内存表记录hash地址,设为hash地址e。然后找到后,先将hash地址e所在元素的表记录存储下一跳hash地址设为hash地址b所在元素表记录存储下一跳hash地址。之后在hash地址e所在元素中更新内存命令中表记录数据,将该元素的表记录属性由初始状态改为有值状态。最后在hash地址b所在元素表记录存储下一跳hash地址设为hash地址e所在元素hash地址。并将在hash地址b所在元素表记录属性改为碰撞状态。如果没有找到hash地址e有效位置,则在共享内存表记录hash地址e的记录中设置共享内存表记录属性为碰撞状态且设置下一跳hash地址为错误值。

d.如果“步骤c”中情况外,即在共享内存表记录hash地址b的表记录中存储了其他无效值。此时循环找到下一跳hash地址和hash地址b一致的hash地址c所在元素,该元素表记录属性必须为碰撞状态,否则返回错误值然后在共享内存表中查找第一个表记录属性为初始状态的hash数组元素,其索引为hash地址d。之后在hash地址c所在元素表记录存储下一跳hash地址设为hash地址d,并且将hash地址b所在元素替换hash地址d所在元素;然后设置hash地址b所在元素表记录属性为初始值。最后将更新内存命令中需要更新的数值更新hash地址b所在元素中,设置hash地址b所在元素表计属性为有值状态,并且设置其表记录存储下一跳hash地址为-1。相当于将原先被其他非法值占用的共享内存表记录hash地址b所在元素数据移到其他未被占用的存储空间中,然后再重新在hash地址b所在元素中保存更新内存命令中的数据。

9.完成共享内存更新。

如图2所示,本发明实施例中共享内存表对象hash数组的存储结构图:

1.一个共享内存文件包含多个共享内存表,每个共享内存表存储在这个文件的不同区域,主要是通过共享内存表号(id)定位到需要查找的共享内存表存储区域。查找到共享内存表存储区域后,进一步的就需要查找共享内存表里面的每一条记录,这些记录的主键id就是区分同一个共享内存表里面不同记录项。所以系统有两个id,一个大范围的,一个小范围的。共享内存表中是存储的同类型的数据库表记录组成。每个共享内存表包括多个表记录,每一条存储记录结构包括存储的hash地址、表记录主键id、表记录数据、表记录属性以及表记录存储下一跳地址。

2.“hash地址”是每一条表记录存储在共享内存表对象的hash数组元素索引,该地址是采用hash函数进行寻址。“表记录主键id”是用于表记录的主键,用于区别同一个共享内存表其他记录。“表记录数据”就是共享内存表记录核心部分,是共享内存数据存储地方,是更新共享内存操作的主要地方。电能质量管理系统共享内存中分为多种共享内存表,每一种共享内存表的共享内存表记录的“表记录数据”结构相同,不同共享内存表的共享内存表记录的“表记录数据”是不相同的,可以灵活设置“表记录数据”存储的数据项和内容,根据不同共享内存表的内容而设定。“表记录属性”是该记录的标志位,标志位分为“初始状态”、“碰撞状态”,“有值状态”。其中“初始状态”为共享内存表记录初始状态位,“碰撞状态”为共享内存表记录有冲突地方,需要进入下一跳hash地址寻址。“有值状态”为共享内存表记录已经写入内存表记录数据后更新的状态。“表记录存储下一跳hash地址”存储下一条共享内存表记录的hash地址,该处是当寻址到“表记录属性”标志位为“碰撞状态”时候的表记录项数据时候,表示该处存储记录中出现冲突,需访问此处共享内存表记录的“表记录存储下一跳hash地址”所指向hash地址数组元素。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1