队列构建方法及装置
技术领域
本发明涉及通信领域,具体而言,涉及一种队列构建方法及装置。
背景技术
简单网络管理协议(Simple Network Management Protocol,简称为SNMP)是目前TCP/IP网络中应用最为广泛的网络管理协议。在嵌入式系统中,实时内存数据库是数据管理的一种通常形式,承担着数据的一切维护工作,包括对SNMP队列的实现支持。在对表量进行SNMP的Get-Next-Request操作时,被管对象需要按照SNMP协议的规范要求,以字典序排序的形式返回给管理者。实时内存数据库中的记录表以及索引表等都不能为这种字典序排序返回提供有效查询,这时就需要提供一种方法来满足这个操作需求,SNMP队列的实现就是为这个操作提供了高效的查询接口。SNMP队列维护了记录表中记录的字典序排序关系信息,从而可以满足对SNMP的Get-Next-Request操作的快速查询支持。
相关技术中,经常遇到管理表索引是{套餐ID,组播IP地址}的数据记录,对其的处理可以如图1所示。
图1是根据相关技术的队列构建方法的示意图。
假设存在记录号为1、2、4、6、8、9的6条记录,记录索引对应的SNMP字典序为Rec[2]<Rec[8]<Rec[1]<Rec[9]<Rec[6]<Rec[4],若记录索引为二维索引且第一个索引为数值型,并假设记录8、1、9的第一个索引数值相等。则由该6个节点构建的双向单环结构组织可以如图1所示。
但是,当记录数量非常庞大(通常超过几万)时,对其新增记录、删除记录等操作将异常耗时。
发明内容
针对随着记录数量增大,对其新增记录、删除记录等操作的耗时将显著增加的问题而提出本发明,为此,本发明的主要目的在于提供一种队列构建方法及装置,以解决上述问题。
为了实现上述目的,根据本发明的一个方面,提供了一种队列构建方法。
根据本发明的队列构建方法包括:确定多个节点值中的第一节点值和第二节点值在相同的维度的索引值相同,其中多个节点值中的每一个节点值均包括多个维度的索引值;设置第一节点值和第二节点值处于队列中的多个双向环中的级别相同的双向环,其中双向环的级别与相同的维度相对应。
进一步地,在确定多个节点值中的第一节点值和第二节点值在相同的维度的索引值相同之前,上述方法还包括:按照如下规则,设置多个维度的索引值;{index_1,index_2,...index_m,...index_n},其中n>1并且1≤m≤n。
进一步地,设置第一节点值和第二节点值处于队列中的多个双向环中的级别相同的双向环包括:当第一节点值和第二节点值在多个维度{index_1,index_2,...index_m}的索引值均相同时,设置第一节点值和第二节点值处于队列中的m+1级别的双向环。
进一步地,在设置第一节点值和第二节点值处于队列中的多个双向环中的级别相同的双向环之前,上述方法还包括:设置级联节点的结构信息,其中级联节点为同时处于级别不同的双向环的节点,结构信息包括以下至少之一:quePrev,用于指示级别不同的双向环中高级的双向环中的前一个节点;queNext,用于指示高级的双向环中的后一个节点;subQueEnd,用于指示级别不同的双向环中低级的双向环中的最后一个节点;subQueNext,用于指示低级的双向环中的后一个节点。
进一步地,设置第一节点值和第二节点值处于队列中的多个双向环中的级别相同的双向环包括:当第一节点值对应的简单网络管理协议SNMP字典序号小于第二节点值对应的SNMP字典序号,并且第一节点值对应的第一节点为级联节点时,设置第一节点的subQueNext的值为第二节点值对应的第二节点。
进一步地,多个维度的索引值为数值型。
为了实现上述目的,根据本发明的另一个方面,提供了一种队列构建装置。
根据本发明的队列构建装置包括:确定模块,用于确定多个节点值中的第一节点值和第二节点值在相同的维度的索引值相同,其中多个节点值中的每一个节点值均包括多个维度的索引值;第一设置模块,用于设置第一节点值和第二节点值处于队列中的多个双向环中的级别相同的双向环,其中双向环的级别与相同的维度相对应。
进一步地,上述队列构建装置还包括:第二设置模块,用于按照如下规则,设置多个维度的索引值;{index_1,index_2,...index_m,...index_n},其中n>1并且1≤m≤n。
进一步地,第一设置模块包括:第一设置子模块,用于当第一节点值和第二节点值在多个维度{index_1,index_2,...index_m}的索引值均相同时,设置第一节点值和第二节点值处于队列中的m+1级别的双向环。
进一步地,上述队列构建装置还包括:第三设置模块,用于设置级联节点的结构信息,其中级联节点为同时处于级别不同的双向环的节点,结构信息包括以下至少之一:quePrev,用于指示级别不同的双向环中高级的双向环中的前一个节点;queNext,用于指示高级的双向环中的后一个节点;subQueEnd,用于指示级别不同的双向环中低级的双向环中的最后一个节点;subQueNext,用于指示低级的双向环中的后一个节点。
进一步地,第一设置模块包括:第二设置子模块,用于当第一节点值对应的简单网络管理协议SNMP字典序号小于第二节点值对应的SNMP字典序号,并且第一节点值对应的第一节点为级联节点时,设置第一节点的subQueNext的值为第二节点值对应的第二节点。
本发明依据相同的维度的索引值确定节点所处的双向环的级别,从而可以实现双向环的分级构建,即可以实现将大量节点双向单环结构向多级的多个小量节点双向环级联结构的转变,进而在新增记录、删除记录等操作减小耗时。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据相关技术的队列构建方法的示意图;
图2是根据本发明实施例的队列构建方法的流程图;
图3是根据本发明优选实施例的队列构建方法的示意图一;
图4是根据本发明优选实施例的队列构建方法的示意图二;
图5是根据本发明实施例的SNMP队列节点结构的示意图;
图6是根据本发明实施例的SNMP队列创建的流程图;
图7是根据本发明实施例的新增记录时SNMP队列处理的流程图;
图8是根据本发明实施例的删除记录时SNMP队列处理的流程图;
图9是根据本发明实施例的Get-Next-Request操作请求时SNMP队列处理的流程图;
图10是根据本发明实施例的队列构建装置的结构框图。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
本发明实施例提供了一种队列构建方法。图2是根据本发明实施例的队列构建方法的流程图,包括如下的步骤S202至步骤S204。
步骤S202,确定多个节点值中的第一节点值和第二节点值在相同的维度的索引值相同,其中多个节点值中的每一个节点值均包括多个维度的索引值。
步骤S204,设置第一节点值和第二节点值处于队列中的多个双向环中的级别相同的双向环,其中双向环的级别与相同的维度相对应。
相关技术中,随着记录数量增大,对其新增记录、删除记录等操作的耗时将显著增加。本发明实施例中,依据相同的维度的索引值确定节点所处的双向环的级别,从而可以实现双向环的分级构建,即可以实现将大量节点双向单环结构向多级的多个小量节点双向环级联结构的转变,进而在新增记录、删除记录等操作减小耗时。
下面结合图3对本发明的级联结构减小新增记录、删除记录等操作的耗时进行详细分析。
图3是根据本发明实施例的队列构建方法的示意图,基于与图1相同的假设,则由该6个节点构建的双向环级联结构可以如图3所示,从而形成两个双向环级联结构。具体地,在转变为两个双向环级联结构之后,可以使用已有技术类似二分算法定位技术,在更小节点数量的双向环进行后一个字典序节点的快速定位,从而解决了大数量节点存在情况下新插入节点过程耗时的问题,也一并解决了在系统启动配置恢复这一过程中涉及大量的新插入节点操作非常耗时的问题。
优选地,在确定多个节点值中的第一节点值和第二节点值在相同的维度的索引值相同之前,上述方法还包括:按照如下规则,设置多个维度的索引值;{index_1,index_2,...index_m,...index_n},其中n>1并且1≤m≤n。
优选地,设置第一节点值和第二节点值处于队列中的多个双向环中的级别相同的双向环包括:当第一节点值和第二节点值在多个维度{index_1,index_2,...index_m}的索引值均相同时,设置第一节点值和第二节点值处于队列中的m+1级别的双向环。
本优选实施例中,按照多个维度{index_1,index_2,...index_m}的顺序,分多级构建双向环,从而可以最大限度的实现将大量节点双向单环结构向多级的多个小量节点双向环级联结构的转变,进而在新增记录、删除记录等操作减小耗时。
下面结合图4对本发明的多级级联结构减小新增记录、删除记录等操作的耗时进行详细分析。
图4是根据本发明优选实施例的队列构建方法的示意图二,如图4所示,把索引中具有相同index_1数值的记录在第2级双向环进行节点组织,把索引中具有相同index_1、index_2数值的记录在第3级双向环进行节点组织,依次类推,把索引中具有相同index_1、index_2、。。。index_m数值的记录在第m+1级双向环进行节点组织,这样可以有效地将大量节点进行分割归类。这样在小范围内利用已有技术类似二分算法定位技术,进行节点的快速定位,能有效地解决此类表新增记录或启动时构建SNMP队列耗时的问题。
需要说明的是,转变SNMP队列结构,对Get-Next-Request操作请求的响应高效率维持不变。同时,对大容量特定多维索引表在新增SNMP队列节点的时候,利用这种分级级联的小量节点双向环结构,可以快速定位新加SNMP队列节点加入的双向环,再利用现有的类似二分算法定位技术在这个小量节点双向环中快速定位到新加SNMP队列节点的插入点并完成插入。在删除记录时触发删除SNMP队列中的对应节点,可以通过记录号一次快速定位删除SNMP队列节点并进行SNMP队列结构的重新调整,这个结构调整是一次操作快速的过程。
优选地,在设置第一节点值和第二节点值处于队列中的多个双向环中的级别相同的双向环之前,上述方法还包括:设置级联节点的结构信息,其中级联节点为同时处于级别不同的双向环的节点,结构信息包括以下至少之一:quePrev,用于指示级别不同的双向环中高级的双向环中的前一个节点;queNext,用于指示高级的双向环中的后一个节点;subQueEnd,用于指示级别不同的双向环中低级的双向环中的最后一个节点;subQueNext,用于指示低级的双向环中的后一个节点。
图5是根据本发明实施例的SNMP队列节点结构的示意图,如图5所示,本优选实施例中,通过扩展SNMP队列节点结构的定义(subQueEnd和subQueNext),使得节点具备级联下一级双向环结构的能力,从而可以形成一种分级构建的简单网络管理协议队列。
优选地,设置第一节点值和第二节点值处于队列中的多个双向环中的级别相同的双向环包括:当第一节点值对应的简单网络管理协议SNMP字典序号小于第二节点值对应的SNMP字典序号,并且第一节点值对应的第一节点为级联节点时,设置第一节点的subQueNext的值为第二节点值对应的第二节点。
优选地,多个维度的索引值为数值型。
采用本发明的队列构建方法,其适用范围优选的为:1)数据表是多维索引的(索引个数大于等于2);2)多维索引的前n个或全部索引是数值型的。
下面将结合实例对本发明实施例的实现过程进行详细描述。
优选实施例一
本优选实施例描述的过程与已有技术是基本一致的,不同的地方仅在SNMP队列节点结构扩展定义后增加的相关处理。
图6是根据本发明实施例的SNMP队列创建的流程图,如图6所示,包括如下的步骤S602至步骤S618。
步骤S602,提供SNMP队列关联的数据表句柄。
步骤S604,判断数据表句柄是否有效,如果是,则进行步骤S606,否则进行步骤S618。
步骤S606,从全局分配的SNMP队列信息结构数组中,获取本表的SNMP队列信息结构(一个空闲的下标)。
步骤S608,判断本表的SNMP队列信息结构是否获取成功,如果是,则进行步骤S610,否则进行步骤S618。
步骤S610,对本表的SNMP队列信息结构的所有成员赋初始值。
步骤S612,根据本表的容量与SNMP队列中节点的大小得到所有节点需要的动态内存量,并申请。
步骤S614,判断申请是否成功,如果是,则进行步骤S616,否则进行步骤S618。
步骤S616,对本数据表的信息结构部分中SNMP队列节点数组指针成员与SNMP队列节点数组容量大小成员进行赋值,对SNMP队列信息结构中的SNMP队列节点数组指针进行赋值,并结束。
步骤S618,出错返回,并结束。
在具体实施过程中,SNMP队列信息结构与队列节点结构起到核心的设计作用,下面做一下说明:
队列信息结构
每个队列的结构信息如下:
队列节点结构
节点分为两类:级联节点与非级联节点,级联节点指同时存在于两个双向环中的节点,非级联节点只存在于一个双向环中。所有非级联节点只使用quePrev与queNext两个成员,只有级联节点才使用quePrev、queNext、subQueEnd与subQueNext四个成员。
队列节点QUEITEM的结构信息如下:
需要说明的是,系统初始化中,在数据表、索引表创建完成之后,将创建SNMP队列。SNMP队列可以包括设置一个哨兵节点,作为第一级双向环中的第一个固定节点,根据数据表最大记录数(MAX_RECORD_NUM)申请可以存放MAX_RECORD_NUM+1(包括0下标哑元节点)个SNMP队列节点所需的内存块,内存块以节点结构数组的形成来组织(具体可以参见图3)。节点数组的下标为记录号,下标0存放哨兵节点除外,节点结构中包含了四个成员其值是某个记录号或0表示不存在相应记录。
图7是根据本发明实施例的新增记录时SNMP队列处理的流程图,如图7所示,包括如下的步骤S702至步骤S724。
步骤S702,提供SNMP队列关联的数据表句柄与新增记录的记录号。
步骤S704,判断数据表句柄、数据表信息结构中的队列句柄与队列节点数组指针是否合法,如果是,则进行步骤S706,否则进行步骤S724。
步骤S706,获取队列信息结构指针,初始化前控制数为1,初始化后控制数为第一级双向环中的节点个数(哑元节点除外),获取新加记录第一个索引值。
步骤S708,利用前、后控制数确定当前双向环中待比较记录。
步骤S710,判断待比较记录对应维索引值是否与新加记录对应维索引值相等,如果是,则进行步骤S712,否则进行步骤S714。
步骤S712,进入到下一级双向环,初始化前控制数为1、后控制数为当前双向环的节点个数,取新加记录下一级索引值,然后返回步骤S708。
步骤S714,判断待比较记录对应索引值是否大于新加记录的对应索引值,如果是,则进行步骤S716,否则进行步骤S718。
步骤S716,根据类似二分算法调整后控制数。
步骤S718,根据类似二分算法调整前控制数。
步骤S720,前、后控制数比较,判断类似二分算法查找待比较记录的过程是否结束,如果是,则进行步骤S722,否则进行步骤S708。
步骤S722,待比较记录已经是新加记录的后一个字典序记录,因此在待比较记录对应的节点之前插入新加记录所对应的节点,更新队列结构与相关信息,并结束。
步骤S724,出错返回。
需要说明的是,本发明在新增一条记录时,对SNMP队列利用已有技术——类似二分算法定位技术在分级构建的各级双向环中查找后一个字典序的记录号,不存在就取值哨兵节点下标0,在其之前插入新的节点。
图8是根据本发明实施例的删除记录时SNMP队列处理的流程图,如图8所示,包括如下的步骤S802至步骤S814。
步骤S802,提供SNMP队列关联的数据表句柄与要删除的记录号。
步骤S804,判断数据表句柄、数据表信息结构中的队列句柄与队列节点数组指针是否合法。如果是,则进行步骤S806,否则进行步骤S814。
步骤S806,通过数据表句柄获取队列句柄。
步骤S808,提供队列句柄与要删除的记录号。
步骤S810,通过队列句柄判断队列是否合法,如果是,则进行步骤S812,否则进行步骤S814。
步骤S812,通过队列句柄获取队列结构指针,根据删除记录号确定分级构建的级联双向环结构中的对应节点,进行节点的删除并根据节点所处的位置对队列结构进行调整并更新队列的相关信息。
步骤S814,出错返回。
需要说明的是,本发明在删除一条记录时,可以利用删除记录的记录号直接定位到SNMP队列节点,进行节点的删除,节点的删除会引起SNMP队列结构的局部调整,这个结构调整是一次操作快速的过程。
图9是根据本发明实施例的Get-Next-Request操作请求时SNMP队列处理的流程图,如图9所示,包括如下的步骤S902至步骤S906。
步骤S902,提供SNMP队列句柄与Get-Next基于的记录号。
步骤S904,判断SNMP队列句柄是否合法。
步骤S906,通过SNMP队列句柄确定队列结构指针,再根据Get-Next基于的记录号,直接确定分级构建的级联双向环结构中的对应节点。如果节点结构中的成员subQueNext不等于0,那么成员subQueNext就是下一个SNMP字典序记录的记录号,返回此记录号。如果节点结构中的成员subQueNext等于0,那么成员queNext就是下一个SNMP字典序记录的记录号,返回此记录号。
步骤S908,出错返回。
需要说明的是,本发明在数据库收到Get-Next-Request操作请求时,SNMP队列会根据提供的Get-Next基于记录号,直接定位出基于记录号的后一个字典序的记录号,或返回已到最后一条记录,这个过程与已有技术一致。
需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
本发明实施例提供了一种队列构建装置,该队列构建装置可以用于实现上述队列构建方法。图10是根据本发明实施例的队列构建装置的结构框图,如图10所示,包括确定模块1002和第一设置模块1004。
确定模块1002,用于确定多个节点值中的第一节点值和第二节点值在相同的维度的索引值相同,其中多个节点值中的每一个节点值均包括多个维度的索引值;第一设置模块1004,连接至确定模块1002,用于在确定模块1002确定之后,设置第一节点值和第二节点值处于队列中的多个双向环中的级别相同的双向环,其中双向环的级别与相同的维度相对应。
优选地,上述队列构建装置还包括:第二设置模块1006,用于按照如下规则,设置多个维度的索引值;{index_1,index_2,...index_m,...index_n},其中n>1并且1≤m≤n。
优选地,第一设置模块1004包括:第一设置子模块10042,用于当第一节点值和第二节点值在多个维度{index_1,index_2,...index_m}的索引值均相同时,设置第一节点值和第二节点值处于队列中的m+1级别的双向环。
优选地,上述队列构建装置还包括:第三设置模块1008,用于设置级联节点的结构信息,其中级联节点为同时处于级别不同的双向环的节点,结构信息包括以下至少之一:quePrev,用于指示级别不同的双向环中高级的双向环中的前一个节点;queNext,用于指示高级的双向环中的后一个节点;subQueEnd,用于指示级别不同的双向环中低级的双向环中的最后一个节点;subQueNext,用于指示低级的双向环中的后一个节点。
优选地,第一设置模块1004包括:第二设置子模块10044,用于当第一节点值对应的简单网络管理协议SNMP字典序号小于第二节点值对应的SNMP字典序号,并且第一节点值对应的第一节点为级联节点时,设置第一节点的subQueNext的值为第二节点值对应的第二节点。
需要说明的是,装置实施例中描述的队列构建装置对应于上述的方法实施例,其具体的实现过程在方法实施例中已经进行过详细说明,在此不再赘述。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。