CN102955817A - 一种基于共享内存的对象管理与恢复方法及系统 - Google Patents
一种基于共享内存的对象管理与恢复方法及系统 Download PDFInfo
- Publication number
- CN102955817A CN102955817A CN2011102524900A CN201110252490A CN102955817A CN 102955817 A CN102955817 A CN 102955817A CN 2011102524900 A CN2011102524900 A CN 2011102524900A CN 201110252490 A CN201110252490 A CN 201110252490A CN 102955817 A CN102955817 A CN 102955817A
- Authority
- CN
- China
- Prior art keywords
- type
- shared drive
- mto
- group
- type group
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Information Transfer Between Computers (AREA)
Abstract
本发明公开了一种基于共享内存的对象管理与恢复方法,包括:注册托管到MTO系统的类型和类型组,并建立类型与类型组之间的关联关系;根据所有注册类型组信息分配/找回一块连续的共享内存区域;初始化/恢复所分配的共享内存区域,并为每个类型组在共享内存区域映射内存池;由内存池完成托管类型的管理与恢复。本发明还同时公开了一种基于共享内存的对象管理与恢复系统,采用本发明,能够实现共享内存上对象的高效管理与自动恢复。
Description
技术领域
本发明涉及对象管理技术,尤其涉及一种基于共享内存的对象管理与恢复方法及系统。
背景技术
随着网络游戏应用越来越广泛,用于管理游戏数据的游戏服务器逐渐要承载数以千计甚至更多的用户游戏数据。以一个采用面向对象程序设计的游戏服务进程为例,一个游戏服务进程需要支持最大3000个在线游戏用户、2000个游戏房间、以及2000个游戏逻辑对象等。由于游戏服务器需要长时间、连续地提供游戏服务,因此,当游戏服务进程因为简单逻辑改动、或运行出错(Crash)时,游戏服务进程的内存数据会全部丢失,此时就需要重启进程,才能继续提供服务。
目前,在较短时间间隔内游戏服务进程再次启动时,有两种恢复内存数据的方法:
一种是,需要所有游戏用户离线并重新登录,通过数据库(DB)或数据文件(File)重建游戏用户对象,并继续提供游戏服务。但是,这种方式由于所有游戏用户均会被踢下线并需要重新登录,且游戏服务进程会停机或Crash时刻的所有游戏内容上下文会丢失,因此会严重影响用户的使用体验。
另一种是,通过操作系统内核提供的共享内存机制,游戏用户不需要离线并重新登录,而直接恢复游戏用户的游戏数据和对象,并继续游戏服务。这种方式能应对游戏服务程序对高可用、高可靠的要求以及7(天)*24(小时)的运营需求,因此,业界普遍采用共享内存的方式支持游戏数据的迅速恢复。但是,如何基于共享内存实现对象的管理与自动恢复,目前还没有完整、安全和高效的解决方案。
发明内容
有鉴于此,本发明的主要目的在于提供一种基于共享内存的对象管理与恢复方法及系统,能够实现共享内存上对象的高效管理与自动恢复。
为达到上述目的,本发明的技术方案是这样实现的:
本发明提供了一种基于共享内存的对象管理与恢复方法,包括:
注册托管到MTO系统的类型和类型组,并建立类型与类型组之间的关联关系;根据所有注册类型组信息分配/找回一块连续的共享内存区域;初始化/恢复所分配的共享内存区域,并为每个类型组在共享内存区域映射内存池;由内存池完成托管类型的管理与恢复。
上述方案中,所述建立类型组与其对应的共享内存区域的映射关系包括:
a1、计算支持所有托管到MTO系统的类型和类型组所需要的共享内存总大小(TotalSize);
a2、根据当前应用进程传入的共享内存关键值ShmKey和计算的TotalSize大小,创建或重新获得共享内存对象,并调用shmat()将获得的共享内存段连接到应用进程;
a3、在共享内存首部创建CSharedMem对象,并记录共享内存元数据;
a4、遍历每个类型组,逐一为每个类型组在共享内存区域映射固定大小内存池,保存映射关系并完成内存池上对象的初始化或恢复。
上述方案中,所述对共享内存的管理为:通过对象创建接口完成的对象创建;所述对象创建包括:查找类型组映射的内存池的头部CObjMng;从空闲列表FreeList找到空闲索引块CIdx[i],根据类型Type在对应空闲数据块CObj[i]的首地址执行placement new创建对象,对应的索引块CIdx[i]从FreeList删除,并加入使用列表UsedList中。
上述方案中,所述对共享内存的管理为:通过对象获取接口完成的对象获取;所述对象获取包括:查找类型组映射的内存池的头部CObjMng;根据请求下标i直接查找对应索引块CIdx[i];检查CIdx[i]使用状态并返回对应的数据块CObj[i]。
上述方案中,所述对共享内存的管理为:通过对象释放接口完成的对象释放;所述对象释放包括:查找类型组映射的内存池的头部CObjMng;根据请求下标i直接查找对应索引块CIdx[i];检查CIdx[i]使用状态,并将CIdx[i]从UsedList删除,重新加入FreeList。
该方法进一步包括:引入MTO系统抽象基类CObj,所有托管到MTO系统的类型均必须直接或间接派生自CObj,支持单继承或多继承方式。
上述方案中,为每个注册类型组分配的共享内存区域包括管理头、索引域和数据域。
本发明还提供了一种基于共享内存的对象管理与恢复系统,包括:MTO托管类型/类型组注册模块、MTO接口层、以及MTO共享内存管理模块;其中,
所述MTO托管类型/类型组注册模块,用于记录所有托管到MTO系统的类型和类型组的元数据信息,并建立类型和类型组之间的关联关系;
所述MTO接口层,用于建立类型和类型组与其对应的共享内存区域的映射关系;
所述MTO共享内存管理模块,用于对MTO接口层确定的、对应各个类型组的共享内存区域进行管理。
上述方案中,所述MTO共享内存管理模块包括:共享内存自身元数据记录部分、以及固定大小内存池管理部分;相应的,所述共享内存包括共享内存元数据空间和内存池空间。
本发明所提供的基于共享内存的对象管理与恢复方法及系统,注册托管到MTO系统的类型和类型组,并建立类型与类型组之间的关联关系;根据所有注册类型组信息分配/找回一块连续的共享内存区域;初始化/恢复所分配的共享内存区域,并为每个类型组在共享内存区域映射内存池;由内存池完成托管类型的管理与恢复。如此,能对托管到MTO系统的类型的对象实现包括分配、获取和释放在内的统一管理、以及恢复。由于在具体实现过程中,对基于共享内存的对象创建、访问和释放这些操作均由接口层提供的操作接口代理,因此,上层应用在实现时只需调用相应的接口,无需关心底层的实现细节,如开发人员不需要关心对象的管理和恢复操作细节,操作简单、方便、易于实现,而且安全、高效。
由于托管到MTO系统的各个类型组在特定的共享内存区域都映射内存池,那么,当游戏服务器因为简单逻辑升级或Bug修复等需要停机维护、甚至在进程出错退出且共享内存数据完整的情况下,共享内存的特性可继续保持游戏数据,待到维护完成后游戏服务进程重新启动后,再由MTO系统自动找回相应对象的上下文游戏数据,并继续提供游戏服务,进而实现了对数据快速、高效地恢复,保证了数据的连续性、完整性、以及可靠性,能为用户提供更好、更满意的游戏服务。
附图说明
图1为本发明基于共享内存的对象管理与恢复系统的组成结构示意图;
图2为CSharedMem类结构示意图;
图3为类型组到内存池空间的映射示意图;
图4为CObjMng/CIdx/CObj固定大小内存池类结构示意图;
图5为共享内存区域为空闲时的布局示意图;
图6为共享内存区域首部创建CSharedMem对象后的布局示意图;
图7为按类型组划分CObjMng/CIdx/CObj固定大小内存池后共享内存区域的布局示意图;
图8为本发明基于共享内存的对象管理与恢复方法的实现流程示意图;
图9为MTO托管类型/类型组注册模块类结构示意图;
图10为类型的继承体系示意图;
图11为内存池的初始状态示意图;
图12为创建对象后内存池状态示意图;
图13为对象释放后内存池状态示意图。
具体实施方式
针对Linux系统共享内存的特性,对于基于共享内存的对象管理与恢复需要考虑三个方面的问题:
第一、共享内存的创建与重新获取。操作系统支持共享内存机制,内核以(ShmKey,Size)标识共享内存段,通过将该共享内存段连接到进程的地址空间中,能保证该地址空间内的数据可以在进程停止后得以保持;进程重启后将以相同的(ShmKey,Size)标识重新找回共享内存段,并再次将该共享内存段连接到进程的地址空间,如此,就可重新取回原先共享内存段上保存的数据。由于操作系统并不能保证相同的共享内存段,两次连接到进程地址空间时具有相同的首地址,因此,记录这两次首地址差值为偏移量offset。
第二,对象指针数据成员的恢复。共享内存保持数据的特性,使得普通数据内容方便恢复;但指针数据恢复时,需要偏移量offset修正后才能正确使用。
第三,对象虚表指针的恢复。因为逻辑Bug的修正会导致程序重新编译后再重启,此时类型的虚表地址可能会发生变化,这样恢复后的对象虚表指针就无效了;所以需要在原对象地址空间,重新执行定位new(placement new),将对象的虚表指针指向正确的虚表地址。
基于上述考虑,本发明的基本思想是:注册托管到MTO系统的类型和类型组,并建立类型与类型组之间的关联关系;根据所有注册类型组信息分配/找回一块连续的共享内存区域;初始化/恢复所分配的共享内存区域,并为每个类型组在共享内存区域映射内存池;由内存池完成托管类型的管理与恢复。
其中,所述类型组信息包括但不限于:类型列表、类型组容纳元素最大数量、类型组元素最大空间;并且,可根据所有类型组信息计算得出一块连续的共享内存区域总大小。
本发明提供的基于共享内存的对象管理与恢复系统如图1所示,该系统也可称为多类型对象(MTO,Multi-Type Object)系统,该系统包括:MTO托管类型/类型组注册模块11、MTO接口层12、以及MTO共享内存管理模块13;其中,
所述MTO托管类型/类型组注册模块11,可简称为MTORegister,用于记录所有托管到MTO系统的类型(TypeUnit)和类型组(GroupUnit)的元数据信息,并建立类型和类型组之间的关联关系。
这里,托管到MTO系统的类型可以根据功能需求和逻辑约束关系,划分为一个或多个类型组,比如:设置用户组、房间组、游戏逻辑组等。每个类型仅且只能注册到一个类型组,每个类型组中至少包含一个类型。类型组记录类型列表、类型组容纳元素最大数量、类型组元素最大空间等元数据,比如:类型组A包括类型A1、类型A2,容纳数量为CountA,每个元素空间为Max(sizeof(A1),sizeof(A2));类型组B包括类型B1、类型B2、类型B3、类型B4,容纳数量为CountB,每个元素空间为Max(sizeof(B1),sizeof(B2),sizeof(B3),sizeof(B4));类型组C包括类型C1,容纳数量为CountC,每个元素空间为Max(sizeof(C1))等。
本发明中,引入MTO系统抽象基类CObj,所有托管到MTO系统的类型均必须直接或间接派生自CObj、支持单继承或多继承方式。如此,MTO系统才可对托管的类型纳入到自身的管理体系中,实现统一的管理与恢复操作。
所述MTO接口层12,可简称为MTOAllocator,处于整个MTO系统总控的位置,用于建立类型和类型组与其对应的共享内存区域的映射关系;具体的,控制完成共享内存大小计算、共享内存的创建或找回、划分共享内存区域并初始化或恢复共享内存上的对象数据;
具体的,所述MTO接口层12,用于根据所有注册类型组信息分配/找回一块连续的共享内存区域;初始化/恢复所分配的共享内存区域,并为每个类型组在共享内存区域映射内存池,对内存池使用的对象完成初始化/恢复工作。
所述MTO共享内存管理模块13,用于对MTO接口层12确定的、对应各个类型组的共享内存区域进行管理。
由于本发明中MTO系统是以类型组为单位,在共享内存区域为每个类型组映射内存池来管理和恢复托管到MTO系统的各个类型对象。因此,需要先计算出所有类型组总共需要占用的内存大小,再加上辅助相关共享内存管理数据占用大小,即可得出所需使用的共享内存区域的总大小(TotalSize)。所述共享内存区域以(ShmKey,TotalSize)标识,其中,ShmKey为共享内存关键(key)值;在共享内存区域的首部记录共享内存元数据,后部以MTORegister中的注册类型组为单位,为每个类型组映射对应的内存池。
所述MTO共享内存管理模块13的作用就是对以(ShmKey,TotalSize)标识的共享内存区域进行管理;具体的,所述MTO共享内存管理模块13包括两部分:共享内存自身元数据记录(CSharedMem)部分、以及固定大小内存池(CObjMng/CIdx/CObj)管理部分。
相应的,所述共享内存包括共享内存元数据空间和内存池空间。对于共享内存元数据空间,本发明系统使用CSharedMem对象记录共享内存自身的元数据,具体信息包括:ShmKey、TotalSize、共享内存首地址pAddr、共享内存偏移(Offset)、以及共享内存使用模式(Mode),如图2所示。其中,Mode值可以是首次初始化模式(SHM_INIT),SHM_INIT模式表示首次创建共享内存段,也可以是重新shmat()后的恢复模式(SHM_RECOVER),SHM_RECOVER模式表示找回已经存在的共享内存段;共享内存元数据空间大小为sizeof(CSharedMem)。这里,shmat()为将共享内存连接到进程地址空间的函数,简称为连接共享内存函数,用于连接内核的共享内存段到进程的地址空间。
对于内存池空间,本发明MTO系统是以类型组为单位,为每个类型组在共享内存上映射一块内存池区域;该内存池空间包含三个部分:管理头(sizeof(CObjMng))、索引域(sizeof(CIdx)*Count)和数据域(MaxTypeSize*Count),如图3所示,其中,索引数组元素数量Count个,数据数组元素数量Count个,因此,每个类型组对应的内存池空间大小为sizeof(CObjMng)+sizeof(CIdx)*Count+MaxTypeSize*Count,遍历所有的类型组即可计算出内存池占用空间的总大小。
图3为类型组到内存池空间的映射示意图,图4为CObjMng/CIdx/CObj固定大小内存池类结构示意图,图3中点填充的部分表示内存池管理结构,白色填充的区域表示有效数据块空间。
下面结合图3和图4详细介绍CObjMng/CIdx/CObj固定大小内存池结构。
如图3、图4所示,在CObjMng/CIdx/CObj固定大小内存池结构中,每个固定大小内存池均由管理头(CObjMng)、索引域(CIdx数组)、数据域(CObj数组)三部分组成;索引域和数据域均按照数组方式组织,如此,可按数组下标方式进行索引,并且,CIdx数组与CObj数组按照数组下标存在一一对应关系,如:CIdx[0]描述CObj[0];CObjMng/CIdx采用数组实现的双向链表方式将索引域组织成使用链表(UsedList)和空闲链表(FreeList);CObjMng是MTORegister的类型组在内存池上的对应,CIdx是MTORegister托管到MTO系统的类型在内存池上的对应;初始时,所有数据块均是空闲的,所有CIdx均加入FreeList,而UsedList为空值;恢复时,遍历UsedList中每个CIdx对象,根据CIdx记录的Type类型,在CIdx对应的数据块区域重新placement new,完成数据区对象的恢复。
本发明中,共享内存区域的布局如图5、图6所示,图5为以(ShmKey,TotalSize)标识的共享内存区域为空闲时的布局,其中,pAddr表示该共享内存区域首地址。图6为在共享内存区域首部创建CSharedMem对象后的布局,MTO共享内存管理模块13从首地址pAddr开始,使用sizeof(CSharedMem)大小,创建并初始化CSharedMem对象,记录共享内存元数据信息,其中,点填充的部分为CSharedMem部分。根据MTORegister模块记录的每个类型组信息,在类型组分配的共享内存区域为每个类型组映射内存池CObjMng/CIdx/CObj,图7以GroupA、GroupB和GroupC举例,示出了按类型组划分CObjMng/CIdx/CObj固定大小内存池后共享内存区域的布局,图7中点填充的部分为共享内存元数据(CSharedMem)和内存池管理区(CObjMng/CIdx),而白色部分是承载有效数据对象部分。
基于上面所述的CObjMng/CIdx/CObj结构,CObjMng/CIdx/CObj支持对象访问的原理是:对象创建时,从FreeList找到空闲索引块CIdx[i],其中下标为i,根据类型(Type)在对应空闲数据块CObj[i]的首地址执行placement new创建对象,对应的CIdx[i]从FreeList删除,并加入到UsedList中。对象获取时,根据请求下标i直接查找对应索引块CIdx[i],检验CIdx[i]使用状态并返回对应的数据块CObj[i]。对象释放时,根据请求下标i直接查找对应索引块CIdx[i],检验CIdx[i]使用状态,并将CIdx[i]从UsedList删除,重新加入到FreeList。
基于上述系统,本发明所提出的基于共享内存的对象管理与恢复方法如图8所示,包括以下步骤:
步骤810:注册托管到MTO系统的类型和类型组,并建立类型与类型组之间的关联关系;
这里,所述注册所有托管到MTO系统的类型和类型组为:记录所有托管到MTO系统的类型和类型组的元数据信息。
本步骤中,所述注册所有托管到MTO系统的类型和类型组结合图9所示,具体包括以下步骤:
步骤1:调用MTORegister中的RegisterType(Type,Size)接口,注册托管到MTO系统的类型Type;
其中,MTORegister为每个托管到MTO系统的类型Type分配TypeUnit结构,记录托管到MTO系统的类型元数据,TypeUnit记录的元数据信息包括:类型名(Type)、类型大小(Size);
反复调用RegisterType(Type,Size)接口可以注册所有托管到MTO系统的类型,如:类型A1、类型A2、类型B1、类型B2、类型B3、类型B4、类型C1。
步骤2:调用MTORegister中的RegisterGroup(Group,Count)接口,注册类型组Group;
其中,MTORegister为每个类型组分配GroupUnit结构,记录类型组元数据,GroupUnit记录的元数据信息包括:类型组名(Group)、元素数量(Count)、类型集合(TypeUnitSet),并根据类型集合自动计算元素大小(MaxTypeSize);
反复调用RegisterGroup(Group,Count)接口可以注册所有类型组,如:(GroupA,CountA)、(GroupB,CountB)、(GroupC,CountC)。
步骤3:调用MTORegister中的BindTypeToGroup(Group,Type)接口,建立类型组Group对托管到MTO系统的类型Type的包含关系;
其中,BindTypeToGroup(Group,Type)接口根据组名Group查找到对应的GroupUnit记录项,根据类型名Type查找对应的TypeUnit记录项;将TypeUnit引用到GroupUnit的类型集合中(TypeSet),并根据TypeUnit的大小(Size)值更新GroupUnit中MaxTypeSize域的值,使其总是记录组中所有类型的最大Size数值;
反复调用BindTypeToGroup(Group,Type)接口可以完成所有类型组与托管到MTO系统的类型之间包含关系的建立,如:(GroupA,A1)、(GroupA,A2)、(GroupB,B1)、(GroupB,B2)、(GroupB,B3)、(GroupB,B4)、(GroupC,C1)。
步骤820:根据所有注册类型组信息分配/找回一块连续的共享内存区域;
这里,具体是:根据所有注册类型组信息,按照计算所得的共享内存空间总大小(TotalSize)分配/找回一整块连续的共享内存区域;
步骤830:初始化/恢复所分配的共享内存区域,并为每个类型组在共享内存区域映射内存池;
步骤840:内存池完成托管类型的管理与恢复。
其中,步骤820和步骤830由MTO接口层(MTOAllocator)提供的初始化接口Initialize(ShmKey)负责执行。具体包括以下步骤:
步骤a1:计算支持所有托管到MTO系统的类型和类型组所需要的共享内存总大小(TotalSize)。
其中,所述TotalSize由两部分组成:其一、是共享内存元数据对象大小(sizeof(CSharedMem)),其二、需要遍历所有类型组,根据类型组的记录项,计算为该类型组分配的固定大小内存池所占用的空间(sizeof(CObjMng)+sizeof(CIdx)*Count+MaxTypeSize*Count)。
步骤a2:根据当前应用进程传入的共享内存ShmKey值和计算的TotalSize大小,创建或重新获得共享内存对象,并调用shmat()将获得的共享内存段连接到应用进程。
这里,可使用Linux共享内存操作应用程序接口(API);使用函数shmget()的返回结果可以区分是新创建还是找回已存在的共享内存对象,并利用函数shmat()将获得的共享内存对象attach到应用进程;其中,shmget()为创建/找回共享内存的函数。此时,(ShmKey,TotalSize)标识的共享内存对象在进程中首地址为pAddr,共享内存总大小为TotalSize。
步骤a3:在共享内存首部创建CSharedMem对象,并记录共享内存元数据。
具体的,填充CSharedMem对象数据项,根据步骤a2的返回结果设置共享内存模式(Mode)为SHM_INIT、或SHM_RECOVER;Mode为SHM_RECOVER模式时,需设置Offset作为本次与上次attach共享内存首地址pAddr的差值。
步骤a4:遍历每个类型组,逐一为每个类型组在共享内存区域映射固定大小内存池,将映射关系保存在MTO接口层中,并完成内存池上对象的初始化或恢复工作。
这里,MTO接口层为每个类型组记录下类型组与共享内存区域管理头部CObjMng的映射关系。无论是SHM_INIT模式还是SHM_RECOVER模式,类型组到对应内存池映射关系是不变的。
所有内存池根据共享内存模式(Mode)的不同,完成相应的操作。若Mode为SHM_INIT模式,说明是首次创建新的共享内存段,则内存池(CObjMng)初始化所有的数据块(CObj)均是空闲的,所有索引节点(CIdx)均加入FreeList,且UsedList为空值;若Mode为SHM_RECOVER模式,则内存池遍历UsedList中每个CIdx对象,根据各CIdx对象上记录的Type类型,在CIdx对象对应的数据块区域重新placement new,完成数据区所有使用对象的自动恢复;并为对象中的每个指针数据加上Offset值,以恢复指针数据;如此,即可完成共享内存上对象的自动恢复工作。
基于共享内存,对象的创建、访问和释放均是通过操作接口完成的,其中,对象创建接口为CreateObject(Group,Type),用于向类型组Group申请类型为Type的对象,并返回对象指针;对象获取接口为GetObject(Group,ObjID),用于向类型组Group请求获取下标为ObjID的对象,并返回对象指针;对象释放接口为DestroyObject(Group,ObjID),用于向类型组Group请求释放下标为ObjID的对象。
具体的,通过对象创建接口完成的对象创建包括以下步骤:
步骤b1:通过MTO接口层查找类型组Group映射的内存池的头部CObjMng;
步骤b2:从FreeList找到空闲数据块,根据类型Type执行placement new创建对象,将对应的索引块CIdx从FreeList删除并加入UsedList;
步骤b3:设置CIdx的附着Obj对象指针(pAttachedObj)指向数据块上的CObj派生对象首地址;
步骤b4:返回类型为Type的Obj对象指针。
具体的,通过对象获取接口完成的对象获取包括以下步骤:
步骤c1:通过MTO接口层查找类型组Group映射的内存池的头部CObjMng;
步骤c2:根据下标ObjID直接查找对应索引块CIdx;
步骤c3:检查CIdx使用状态并返回对应的CObj对象指针。
具体的,通过对象释放接口完成的对象释放包括以下步骤:
步骤d1:通过MTO接口层查找类型组Group映射的内存池的头部CObjMng;
步骤d2:根据下标ObjID直接查找对应索引块CIdx;
步骤d3:检查CIdx使用状态,并将CIdx从UsedList删除,重新加入FreeList,标识CIdx对应的数据块空闲。
下面以一个游戏服务器应用场景为例进一步说明本发明的应用。本实施例中,游戏服务器需要支持3000个游戏用户类(CPlayer)对象、2000个房间类(CRoom)对象、以及2000个各种游戏逻辑类对象,包括多人舞蹈基类CGameLogic、传统舞蹈模式CGLTradition、四键模式CGLFourKey、传统舞蹈与四键混合模式GGLMix、情侣四键模式CGLLoversFourKey。
在实际应用中,需要先设置类型组,包括游戏用户组、房间组和游戏逻辑组的待托管类型组;其中,游戏用户组GROUP_PLAYER,用于托管单一游戏用户类CPlayer的对象的分配、获取和释放,最大可支持3000个游戏用户对象;房间组GROUP_ROOM,用于托管单一房间类CRoom的对象的分配、获取和释放,最大可支持2000个房间对象;游戏逻辑组GROUP_GAMELOGIC,用于托管多种游戏逻辑类对象的分配、获取和释放,最大可支持2000个游戏逻辑对象,可以是上述类型组中任意游戏逻辑类型。
这里,上述需要MTO系统托管的类型,都必须直接或者间接地继承自CObj基类,类型的继承体系示意如图10所示。所述CObj继承是指:在多继承时,左支是第一父类、右支是第二父类;如,Clovers不属于CObj继承体系,则情侣四键模式CGLLoversFourKey的第一父类是情侣逻辑CLovers、第二父类是多人四键模式CGLFourKey;当然,MTO系统也支持CGLLoversFourKey的第一父类是CGLLoversFourKey、第二父类是Clovers的情况。在菱形继承时,可采用虚继承方式,也可不采用虚继承方式。
本实施例中,调用MTORegister提供的托管类型和类型组注册接口包括:
步骤A:使用MTORegister中的RegisterType(Type)接口,注册需要托管的CObj派生类型;
其中,所述CObj派生类型包括CPlayer、CRoom、CGameLogic、CGLTrandition、CGLFourKey、CGLMix、CGLLoversFOurKey。这里,因为Clovers不属于本实施例需要托管到MTO系统的类型,更不属于CObj继承体系,所以不用注册进来。
步骤B:使用MTORegister中的RegisterGroup(Group)接口,注册应用需求的类型组;
其中,所述类型组包括GROUP_PLAYER、GROUP_ROOM、GROUP_GAMELOGIC。
步骤C:使用MTORegister中的BindTypeToGroup(Group,Type)接口,建立类型与对应类型组的映射关系;
这里,根据应用类型组划分,对应的类型绑定到对应的类型组中,例如BindTypeToGroup(GROUP_PLAYER,CPlayer)等。
本实施例中,MTO接口层初始化为:应用指定ShmKey数值,调用MTO接口层中的Initialize(Key)接口。
本实施例中,应用对对象访问时,应用可直接访问MTO接口层为对象访问所提供的CreateObject、GetObject和DestroyObject接口。下面以游戏逻辑组GROUP_GAMELOGIC为例,说明MTO系统对托管类型对象分配、获得和释放时内存池的状态。
内存池的初始状态如图11所示,所有对象均在FreeList中,UesdList中没有元素。对象创建过程中,按照顺序向游戏逻辑组依次申请CGLFourKey、CGLMix和CGLLoversFourKey对象后,游戏逻辑组的内存池状态如图12所示。对象获取过程中,以图12的状态为例,对对象的引用都是通过游戏逻辑组和数组下标的方式,直接索引到对象;MTO接口层为了支持类型扩展,均通过GetOject(Group,ObjID)接口返回CIdx附着的CObj*指针,需要应用dynamic_cast向下转型为正确的特定类型使用。对象释放过程中,按照顺序从游戏逻辑组依次释放下标为0(CGLFourKey)和下标为2(CGLLoversFourKey)的对象后,内存池的状态如图13所示。
当进程停止或Crash后,进程重新启动,需要完成对象恢复时,重新执行所有的托管类型和类型组的注册过程及接口初始化,MTO系统会自动完成共享内存的获取并重新attach进程,进而完成共享内存上对象状态的上下文恢复。
本发明基于Linux操作系统和gcc/g++(4.1.2)编译器平台实现,但在UNIX-Like操作系统,如UNIX、HP-UNIX、Solaris、BSD系列;以及Win32/VC8平台均可以使用类似的共享内存的对象管理与恢复方法。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种基于共享内存的对象管理与恢复方法,其特征在于,该方法包括:
注册托管到MTO系统的类型和类型组,并建立类型与类型组之间的关联关系;根据所有注册类型组信息分配/找回一块连续的共享内存区域;初始化/恢复所分配的共享内存区域,并为每个类型组在共享内存区域映射内存池;由内存池完成托管类型的管理与恢复。
2.根据权利要求1所述的方法,其特征在于,所述建立类型组与其对应的共享内存区域的映射关系包括:
a1、计算支持所有托管到MTO系统的类型和类型组所需要的共享内存总大小(TotalSize);
a2、根据当前应用进程传入的共享内存关键值ShmKey和计算的TotalSize大小,创建或重新获得共享内存对象,并调用shmat()将获得的共享内存段连接到应用进程;
a3、在共享内存首部创建CSharedMem对象,并记录共享内存元数据;
a4、遍历每个类型组,逐一为每个类型组在共享内存区域映射固定大小内存池,保存映射关系并完成内存池上对象的初始化或恢复。
3.根据权利要求1所述的方法,其特征在于,所述对共享内存的管理为:通过对象创建接口完成的对象创建;
所述对象创建包括:查找类型组映射的内存池的头部CObjMng;从空闲列表FreeList找到空闲索引块CIdx[i],根据类型Type在对应空闲数据块CObj[i]的首地址执行placement new创建对象,对应的索引块CIdx[i]从FreeList删除,并加入使用列表UsedList中。
4.根据权利要求1所述的方法,其特征在于,所述对共享内存的管理为:通过对象获取接口完成的对象获取;
所述对象获取包括:查找类型组映射的内存池的头部CObjMng;根据请求下标i直接查找对应索引块CIdx[i];检查CIdx[i]使用状态并返回对应的数据块CObj[i]。
5.根据权利要求1所述的方法,其特征在于,所述对共享内存的管理为:通过对象释放接口完成的对象释放;
所述对象释放包括:查找类型组映射的内存池的头部CObjMng;根据请求下标i直接查找对应索引块CIdx[i];检查CIdx[i]使用状态,并将CIdx[i]从UsedList删除,重新加入FreeList。
6.根据权利要求1至5任一项所述的方法,其特征在于,该方法进一步包括:引入MTO系统抽象基类CObj,所有托管到MTO系统的类型均必须直接或间接派生自CObj,支持单继承或多继承方式。
7.根据权利要求1至5任一项所述的方法,其特征在于,为每个注册类型组分配的共享内存区域包括管理头、索引域和数据域。
8.一种基于共享内存的对象管理与恢复系统,其特征在于,该系统包括:MTO托管类型/类型组注册模块、MTO接口层、以及MTO共享内存管理模块;其中,
所述MTO托管类型/类型组注册模块,用于记录所有托管到MTO系统的类型和类型组的元数据信息,并建立类型和类型组之间的关联关系;
所述MTO接口层,用于建立类型和类型组与其对应的共享内存区域的映射关系;
所述MTO共享内存管理模块,用于对MTO接口层确定的、对应各个类型组的共享内存区域进行管理。
9.根据权利要求8所述的系统,其特征在于,所述所有托管到MTO系统的类型均必须直接或间接派生自引入的MTO系统抽象基类CObj,支持单继承或多继承方式。
10.根据权利要求8或9所述的系统,其特征在于,所述MTO共享内存管理模块包括:共享内存自身元数据记录部分、以及固定大小内存池管理部分;
相应的,所述共享内存包括共享内存元数据空间和内存池空间。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011102524900A CN102955817A (zh) | 2011-08-30 | 2011-08-30 | 一种基于共享内存的对象管理与恢复方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011102524900A CN102955817A (zh) | 2011-08-30 | 2011-08-30 | 一种基于共享内存的对象管理与恢复方法及系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102955817A true CN102955817A (zh) | 2013-03-06 |
Family
ID=47764628
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2011102524900A Pending CN102955817A (zh) | 2011-08-30 | 2011-08-30 | 一种基于共享内存的对象管理与恢复方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102955817A (zh) |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103198122A (zh) * | 2013-04-02 | 2013-07-10 | 华为技术有限公司 | 重启内存数据库的方法和装置 |
WO2015149673A1 (en) * | 2014-04-02 | 2015-10-08 | Tencent Technology (Shenzhen) Company Limited | Method, server, and system for sharing resource data |
CN105302691A (zh) * | 2015-10-20 | 2016-02-03 | 浪潮(北京)电子信息产业有限公司 | 一种元数据性能监控方法及系统 |
CN106250242A (zh) * | 2016-08-10 | 2016-12-21 | 西安诺瓦电子科技有限公司 | 基于操作系统的内存复用方法及装置 |
CN107102900A (zh) * | 2016-02-22 | 2017-08-29 | 上海大唐移动通信设备有限公司 | 一种共享内存空间的管理方法 |
CN107621986A (zh) * | 2017-08-31 | 2018-01-23 | 云宏信息科技股份有限公司 | 共享内存池的分页设备管理方法、电子设备及存储介质 |
CN107729128A (zh) * | 2017-07-24 | 2018-02-23 | 上海壹账通金融科技有限公司 | 应用程序数据恢复方法、装置、计算机设备和存储介质 |
CN108021448A (zh) * | 2017-11-30 | 2018-05-11 | 北京东土科技股份有限公司 | 一种内核空间的优化方法及装置 |
CN108446150A (zh) * | 2018-03-23 | 2018-08-24 | 武汉斗鱼网络科技有限公司 | 对象的重复使用方法、装置及终端设备 |
CN108459847A (zh) * | 2018-03-23 | 2018-08-28 | 武汉斗鱼网络科技有限公司 | 对象的调用方法、装置及终端设备 |
CN110727514A (zh) * | 2019-10-12 | 2020-01-24 | 北京无线电测量研究所 | 一种基于索引队列的内存管理方法以及嵌入式设备 |
CN111782425A (zh) * | 2020-07-07 | 2020-10-16 | 北京无线电测量研究所 | 基于索引队列的任务间通信方法、装置、计算机设备 |
CN113590212A (zh) * | 2021-06-24 | 2021-11-02 | 阿里巴巴新加坡控股有限公司 | 数据库实例的启动方法、装置及设备 |
CN114327946A (zh) * | 2021-12-24 | 2022-04-12 | 北京百度网讯科技有限公司 | 共享内存访问控制方法、装置、电子设备及自动驾驶车辆 |
CN116069530A (zh) * | 2023-04-03 | 2023-05-05 | 中国人民解放军国防科技大学 | 基于内存池的仿真引擎数据共享黑板系统 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101246466A (zh) * | 2007-11-29 | 2008-08-20 | 华为技术有限公司 | 多核系统中共享内存的管理方法和装置 |
CN101799773A (zh) * | 2010-04-07 | 2010-08-11 | 福州福昕软件开发有限公司 | 并行计算的内存访问方法 |
CN101968772A (zh) * | 2010-10-22 | 2011-02-09 | 烽火通信科技股份有限公司 | 嵌入式系统高效内存池的实现方法 |
-
2011
- 2011-08-30 CN CN2011102524900A patent/CN102955817A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101246466A (zh) * | 2007-11-29 | 2008-08-20 | 华为技术有限公司 | 多核系统中共享内存的管理方法和装置 |
CN101799773A (zh) * | 2010-04-07 | 2010-08-11 | 福州福昕软件开发有限公司 | 并行计算的内存访问方法 |
CN101968772A (zh) * | 2010-10-22 | 2011-02-09 | 烽火通信科技股份有限公司 | 嵌入式系统高效内存池的实现方法 |
Cited By (25)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103198122B (zh) * | 2013-04-02 | 2017-09-29 | 华为技术有限公司 | 重启内存数据库的方法和装置 |
CN103198122A (zh) * | 2013-04-02 | 2013-07-10 | 华为技术有限公司 | 重启内存数据库的方法和装置 |
CN104980454B (zh) * | 2014-04-02 | 2019-08-06 | 腾讯科技(深圳)有限公司 | 一种资源数据共享方法、服务器及系统 |
WO2015149673A1 (en) * | 2014-04-02 | 2015-10-08 | Tencent Technology (Shenzhen) Company Limited | Method, server, and system for sharing resource data |
CN104980454A (zh) * | 2014-04-02 | 2015-10-14 | 腾讯科技(深圳)有限公司 | 一种资源数据共享方法、服务器及系统 |
US10455003B2 (en) | 2014-04-02 | 2019-10-22 | Tencent Technology (Shenzhen) Company Limited | Method, server, and system for sharing resource data |
CN105302691A (zh) * | 2015-10-20 | 2016-02-03 | 浪潮(北京)电子信息产业有限公司 | 一种元数据性能监控方法及系统 |
CN107102900A (zh) * | 2016-02-22 | 2017-08-29 | 上海大唐移动通信设备有限公司 | 一种共享内存空间的管理方法 |
CN107102900B (zh) * | 2016-02-22 | 2020-02-07 | 上海大唐移动通信设备有限公司 | 一种共享内存空间的管理方法 |
CN106250242A (zh) * | 2016-08-10 | 2016-12-21 | 西安诺瓦电子科技有限公司 | 基于操作系统的内存复用方法及装置 |
CN107729128B (zh) * | 2017-07-24 | 2019-09-24 | 深圳壹账通智能科技有限公司 | 应用程序数据恢复方法、装置、计算机设备和存储介质 |
CN107729128A (zh) * | 2017-07-24 | 2018-02-23 | 上海壹账通金融科技有限公司 | 应用程序数据恢复方法、装置、计算机设备和存储介质 |
CN107621986B (zh) * | 2017-08-31 | 2020-11-10 | 云宏信息科技股份有限公司 | 共享内存池的分页设备管理方法、电子设备及存储介质 |
CN107621986A (zh) * | 2017-08-31 | 2018-01-23 | 云宏信息科技股份有限公司 | 共享内存池的分页设备管理方法、电子设备及存储介质 |
CN108021448A (zh) * | 2017-11-30 | 2018-05-11 | 北京东土科技股份有限公司 | 一种内核空间的优化方法及装置 |
CN108021448B (zh) * | 2017-11-30 | 2021-06-15 | 北京东土科技股份有限公司 | 一种内核空间的优化方法及装置 |
CN108459847A (zh) * | 2018-03-23 | 2018-08-28 | 武汉斗鱼网络科技有限公司 | 对象的调用方法、装置及终端设备 |
CN108446150A (zh) * | 2018-03-23 | 2018-08-24 | 武汉斗鱼网络科技有限公司 | 对象的重复使用方法、装置及终端设备 |
CN108459847B (zh) * | 2018-03-23 | 2021-11-09 | 武汉斗鱼网络科技有限公司 | 对象的调用方法、装置及终端设备 |
CN108446150B (zh) * | 2018-03-23 | 2021-11-26 | 武汉斗鱼网络科技有限公司 | 对象的重复使用方法、装置及终端设备 |
CN110727514A (zh) * | 2019-10-12 | 2020-01-24 | 北京无线电测量研究所 | 一种基于索引队列的内存管理方法以及嵌入式设备 |
CN111782425A (zh) * | 2020-07-07 | 2020-10-16 | 北京无线电测量研究所 | 基于索引队列的任务间通信方法、装置、计算机设备 |
CN113590212A (zh) * | 2021-06-24 | 2021-11-02 | 阿里巴巴新加坡控股有限公司 | 数据库实例的启动方法、装置及设备 |
CN114327946A (zh) * | 2021-12-24 | 2022-04-12 | 北京百度网讯科技有限公司 | 共享内存访问控制方法、装置、电子设备及自动驾驶车辆 |
CN116069530A (zh) * | 2023-04-03 | 2023-05-05 | 中国人民解放军国防科技大学 | 基于内存池的仿真引擎数据共享黑板系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102955817A (zh) | 一种基于共享内存的对象管理与恢复方法及系统 | |
CN114341792B (zh) | 存储集群之间的数据分区切换 | |
EP3433741B1 (en) | Hybrid garbage collection in a distrubuted storage system | |
CN103250134B (zh) | 基于流技术的软件映像更新 | |
US20190146917A1 (en) | Log-structured storage for data access | |
TWI291097B (en) | File system snapshot with ditto address feature | |
US9740566B2 (en) | Snapshot creation workflow | |
CN102460400B (zh) | 基于管理程序的本地和远程虚拟内存页面管理 | |
US8918429B2 (en) | Database versioning system | |
CN109947773A (zh) | 在多租户数据库系统中部署对键模式的改变 | |
US8171176B2 (en) | Method for selective replication of physical devices on a virtual self-configuring zoning expander | |
US8260818B1 (en) | Method, apparatus, and computer-readable medium for space-efficient storage of variables in a non-volatile computer memory | |
US10185736B2 (en) | Replicable differential store data structure | |
CN103514249B (zh) | 一种数据自精简方法和系统及存储装置 | |
US11593137B2 (en) | Hypervisor hibernation | |
US20100199065A1 (en) | Methods and apparatus for performing efficient data deduplication by metadata grouping | |
CN106709704A (zh) | 一种基于许可链的智能合约升级方法 | |
CN104881371A (zh) | 持久性内存事务处理缓存管理方法与装置 | |
JP2009230577A (ja) | ソフトウェアアップデート管理プログラム、ソフトウェアアップデート管理装置、およびソフトウェアアップデート管理方法 | |
CN103699372A (zh) | 从中央存储装置引导计算机系统 | |
CN104331255A (zh) | 一种基于嵌入式文件系统的流式数据读取方法 | |
CN107102824A (zh) | 一种基于存储和加速优化的Hadoop异构方法和系统 | |
US10489356B1 (en) | Truncate and append database operation | |
CN106030540A (zh) | 磁盘数据传送系统 | |
CN102156717A (zh) | 一种将实体对象映射到数据库中的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20130306 |