具体实施方式
术语定义:
“计算机设备”:本上下文中,计算机设备为能够按照事先存储的程序,自动地进行数值计算和信息处理的电子设备,包括但不限于个人电脑、智能手机、服务器、小型机等,其通过操作***或内存控制芯片等来进行内存管理;
“进程”:本上下文中,进程是在计算机中正在运行的应用程序实体,其被分配给计算机设备的处理器并由处理器执行;
“对象”:本上下文中,对象是指在基于面向对象的程序语言所设计的应用程序中的对象。
下面结合附图对本发明作进一步详细描述。
图1示意出了本发明一个方面的在计算机设备基于内存池来进行数据共享的方法的流程图。其中,所述根据本发明的方法可通过计算机设备中的处理器执行操作***或内存控制程序来实现,所述操作***包括但不限于Windows、Linux、Unix、Netware或嵌入式***等,也可由内存控制芯片等硬件来实现
具体地,计算机设备首先创建和管理内存池,并根据来自使用所述内存池的进程的内存分配请求,在内存池中为所述进程分配一个或多个内存块,当所述进程需要创建对象时,计算机设备根据获得的所述进程创建所述对象的请求,在所述一个或多个内存块中为所述对象分配空间,以存储所述对象。计算机设备可根据上述操作在一个或多个内存池内为多个进程创建对象。并且,所述计算机设备还能够在内存池中将一个进程创建的对象提供给另一个进程共享。
以下以第二进程访问第一进程所创建的第一对象为例,说明所述计算机设备如何实现在内存池内进行对象共享。其中,所述第二进程包括但不限于以下类别:1)未创建对象的进程;2)创建了非共享对象的进程;3)创建了共享对象的进程。
在步骤S1中,计算机设备根据来自第二进程的对象访问请求,来获取所述第二进程需要访问的第一对象的标识信息。其中,所述第二进程的对象访问请求可基于OpenFileMapping函数、GetProcAddress函数、消息函数、中断、或控件等发送。计算机设备如果捕获到所述对象访问请求,则从该对象访问请求中提取所述第二进程需要访问的第一对象的标识信息。其中,所述标识信息包括但不限于:1)所述第一对象的名称;2)所述第一对象的ID;3)创建所述第一对象的第一进程的名称;4)所述第一对象的创建时间等。需要说明的是,由于一个对象可具有多种标识信息,而在所述对象访问请求中可能仅包含一种标识信息,因此,计算机设备在提取该一种标识信息后,还可结合所述内存池的相关信息,获取该对象的其他标识信息。
接着,在步骤S2中,计算机设备根据所确定的第一对象的标识信息来获取所述第一对象的位置信息。具体地,计算机设备获取所述第一对象的位置信息的方式包括但不限于:
1)根据所述第一对象的标识信息,直接获取第一进程创建所述第一对象时,内存池所保存的所述第一对象的位置信息;
其中,所述内存池所保存的所述第一对象的位置信息包括但不限于:
a)所述第一对象在创建所述第一对象的第一进程中的原始地址及所述第一对象在可能访问所述第一对象的其他进程中的映射地址;
例如,请参照如下表1,表1示出所存储的所述第一对象的位置信息及与所述第一对象的位置信息相关的信息,其中第一进程创建对象时,所述计算机设备即根据第一进程提供的第二进程可能访问所述第一对象的信息,保存了所述第一对象的标识信息以及所述第一对象在第二进程地址空间的映射地址信息,当计算机设备根据第二进程提供的信息判断得到第二进程需要访问的对象的ID为456时,所述计算机设备查找所记录的ID为456的对象的信息,得到所述第一对象在第二进程地址空间的映射地址为0x12345678。本领域技术人员应理解,上下文中所例举的具体的映射地址以及内存块大小等数值仅为说明目的所例举,不应视为对本发明的任何限制。
表1:第一对象的位置信息及位置信息相关的信息
b)所述第一对象所在的内存块的ID及所述第一对象在该内存块中的位置;
例如,第一进程创建所述第一对象时,所述计算机设备即记录了所述第一对象的ID、为所述第一对象分配的内存块的ID及该第一对象在内存块中的位置,例如,在该内存块中的偏移量等。当计算机设备根据第二进程提供的信息得到第二进程需要访问的第一对象的ID时,所述计算机设备查找得到所述第一对象所在的内存块及第一对象在该内存块中的位置,以便向所述第二进程提供所述第一对象的映射地址信息。
2)如果第一进程创建所述第一对象时,内存池保存了所述第一进程与所述第一对象的对应关系及所述第一对象的标识信息,但没有保存所述第一对象在其他进程的映射地址信息或所述第一对象所在的内存块的信息,则计算机设备需要根据所确定的第一对象的标识信息,在内存池相关信息中进行查找,获取创建所述第一对象的第一进程的相关信息,进而获知所述第一对象在所述第一进程地址空间的地址以及其他进程地址空间的映射地址信息。
该等获取所述第一对象的位置信息的例子仅为用于更好地阐释本发明的方案,本领域技术人员应理解,本发明应不限于上述获取所述第一对象的位置信息的方式,任何可使用于本发明的获取所述第一对象的位置信息的方式均应在本发明的保护范围以内,并以引用方式包含于此。
最后,在步骤S3中,计算机设备将得到的所述第一对象的位置信息提供给所述第二进程。所述第二进程根据该位置信息,访问所述第一对象,与第一进程进行数据共享。第二进程根据计算机设备返回的所述第一对象在所述第二进程地址空间的映射地址,将数据从内存块复制到本地缓存中,再进行后续处理。
优选的,所述内存池的相关信息包括但不限于:
-所述内存池的版本号;
-用于存储所述内存池相关信息的内存块的分配状态,例如,所述内存块是位于所述内存池中,还是分配在内存区域中并被多个内存池共享,该内存块已被分配的空间比例和位置等;
-所述内存池的ID,例如:计算机设备按时间顺序创建的第一个内存池的ID为1,第二个内存池的ID为2等;
-使用内存池的进程的ID,例如:使用ID为1的第一个内存池的第一个进程的ID为101,使用第二个ID为2的内存池的第四个进程的ID为204等;
-使用内存池的进程所创建的内存块的相关信息,包括但不限于内存块的ID、内存块链表的头部和尾部等;例如,使用ID为1的第一个内存池的ID为101的第一个进程所创建的第一个内存块的ID为10101,使用ID为2的第二个内存池的ID为204的第四个进程所创建的第三个内存块的ID为20403;及内存块链表的前驱指针、后继指针、头指针等;
-被共享的对象的ID,例如:创建在ID为1的第一个内存池中由ID为102第二个进程所创建的ID为10203的第三个内存块上的第四个共享对象的ID为1020304;
-用于查找对象的引用关系库,根据被共享的对象之间存在的引用关系建立引用关系库,所述引用关系库包括但不限于树状、单向链表、循环链表等拓扑结构,例如:第二进程的创建的共享对象b需要引用第一进程创建的共享对象a与c,则引用关系的拓扑结构可为:
该等描述内存池相关信息的例子仅为用于更好地阐释本发明的方案,本领域技术人员应理解,本发明内存池的相关信息应不限于上述的说明,任何与内存池相关的信息均应在本发明的保护范围以内,并以引用方式包含于此。
图2示出根据本发明的一个优选实施例的基于内存池来进行数据共享的流程图。
在本实施例中,计算机设备在进程创建对象时,即记录该对象的位置信息,以便后续使用。
具体地,在步骤S4中,计算机设备获取所述进程为待创建的对象请求创建位置的请求。其中,所述请求可基于诸如CreatFileMapping函数、消息函数、中断、或控件等发送。
接着,在步骤S5中,计算机设备在所述进程所请求的内存块中为所述待创建的对象分配所述创建位置。具体地,以第一进程创建第一对象为例,当计算机设备获取到第一进程需要创建对象的请求时,计算机设备获取待创建的对象的大小,分析所述第一进程在所述内存池创建的内存块的信息,所述信息包括但不限于所述内存块的个数、各内存块的大小、各内存块的剩余空间大小等。计算机设备对所述待创建的对象的大小以及第一进程创建的各内存块的剩余空间大小进行比较,选择合适的所述内存块来存储所述待创建的对象。计算机设备获知所述待创建的对象大小为4000字节,所述计算机设备分析该第一进程创建的各内存块的信息,得到所述第一进程一共创建了三个内存块,其中第一个内存块的剩余空间大小为1024字节,第二个内存块的剩余空间大小为8192字节,第三个内存块尚未存储任何对象,其大小为24576字节,则计算机设备对所述待创建的对象的大小以及第一进程创建的各内存块的剩余空间大小进行比较后,会在所述第二个内存块中分配一块大小为4096字节的空间来存储所述大小为4000字节的待创建的对象。
该等为所述待创建的对象分配所述创建位置的例子仅为用于更好地阐释本发明的方案,本领域技术人员应理解,本发明应不限于上述为所述待创建的对象分配所述创建位置的方式,任何与为所述待创建的对象分配所述创建位置的方式均应在本发明的保护范围以内,并以引用方式包含于此。
随后,在步骤S6中,计算机设备记录所述待创建对象的所述创建位置的信息。具体地,计算机设备根据所述待创建对象的存储位置,记录相关信息到内存池相关信息库中,所述相关信息包括但不限于:1)存储所述对象的内存块的ID;2)所述对象在所述内存块的地址信息;3)所述内存块的基地址;4)所述对象在其他进程中的映射地址等。
本实施例中,当收到一个进程的对象访问请求时,所述计算机设备查找记录的该对象的位置信息,提供给该进程。以第二进程请求访问所述第一对象为例。
在步骤S1中,计算机设备根据来自第二进程的对象访问请求,来获取所述第二进程需要访问的第一对象的标识信息;或者计算机设备根据来自第二进程的对象访问请求,并结合所述内存池的相关信息,来获取所述第二进程需要访问的第一对象的标识信息。所述步骤S1已在前面参照图1所述的实施例中予以详述,为简明起见,在此不做赘述,而以引用的方式包含。
随后,在步骤S2’中,计算机设备根据所确定的第一对象的标识信息来查找所述第一对象的所述创建位置,将所述创建位置作为所述第一对象的位置信息。具体地,计算机设备根据所确定的标识信息,在内存池相关信息库中直接搜索以获取所述第一对象的位置信息。其中,所述内存池所保存的所述第一对象的创建位置的信息包括但不限于:
1)所述第一对象在创建所述第一对象的第一进程中的原始地址及所述第一对象在可能访问所述第一对象的其他进程中的映射地址;
例如,请参照所述表1,表1示出所存储的所述第一对象的位置信息及与所述第一对象的位置信息相关的信息,其中第一进程创建对象时,所述计算机设备即根据第一进程提供的第二进程可能访问所述第一对象的信息,保存了所述第一对象的标识信息以及所述第一对象在第二进程地址空间的映射地址信息,当计算机设备根据第二进程提供的信息判断得到第二进程需要访问的第一对象的ID为456时,所述计算机设备查找所记录的ID为456的第一对象的信息,得到所述第一对象在第二进程地址空间的映射地址为0x12345678;
2)所述第一对象所在的内存块的ID及所述第一进程在该内存块中的位置;
例如,第一进程创建所述第一对象时,所述计算机设备即记录了所述第一对象的ID、为所述第一对象分配的内存块的ID及该第一对象在内存块中的位置,例如,在该内存块中的偏移量等,当计算机设备根据第二进程提供的信息得到第二进程需要访问的第一对象的ID时,所述计算机设备查找得到所述第一对象所在的内存块及第一对象在该内存块中的位置,以便向所述第二进程提供所述第一对象的映射地址信息。
接着,步骤S3中,计算机设备将得到的所述第一对象的位置信息提供给所述第二进程。所述第二进程根据该位置信息,访问所述第一对象,与第一进程进行数据共享。所述步骤S3已在前面参照图1所述的实施例中予以详述,为简明起见,在此不做赘述,而以引用的方式包含。
图3示出本发明的另一个优选实施例的基于内存池来进行数据共享的流程图。本实施例中,计算机设备并未在创建对象时记录对象的位置信息,因此,需根据提出对象访问请求的进程提供的信息,推算得到被访问对象的位置。以下以第二进程请求访问第一进程所创建的第一对象为例,进行说明。
具体地,步骤S1’中,计算机设备根据来自所述第二进程的对象访问请求,来获取所述第二进程需要访问的第一对象及创建该第一对象的第一进程的标识信息。其中,所述第二进程的对象访问请求可基于诸如OpenFileMapping函数、GetProcAddress函数、消息函数、中断、或控件等发送。计算机设备可直接获取所述第二进程的对象访问请求中提供的第一对象及及创建该第一对象的第一进程的标识信息;或者,当计算机设备捕获到所述对象访问请求,则结合内存池的相关信息,从所述对象访问请求中获取所述第二进程需要访问的第一对象的标识信息,并基于所述第一对象的标识信息在所述内存池相关信息中进行查询,以确定创建所述第一对象的所述第一进程的标识信息,其中,所述标识信息包括但不限于:1)所述第一对象的名称;2)所述第一对象的ID;3)创建所述第一对象的第一进程的名称;4)所述第一进程的ID等。
接着,在步骤S21中,计算机设备根据所确定的所述第一对象及所述第一进程的标识信息来获取所述第一对象在所述第一进程中的对象原始地址、为所述第一进程分配的各个内存块在所述第一进程中的各个内存原始地址及各个内存块的大小。具体地,计算机设备根据所述标识信息获取所述第一对象在所述第一进程中的对象原始地址,计算机设备根据所述第一进程的ID,在内存池相关信息库中查找所述第一进程创建的内存块的信息,所述信息包括但不限于内存块的个数、各内存块在所述第一进程的各内存原始地址、各内存块的大小等。
随后,在步骤S22中,计算机设备根据所述第一对象在所述第一进程中的对象原始地址、为所述第一进程分配的各个内存块在所述第一进程中的各个内存原始地址及各个内存块的大小,来确定所述第一对象所在的内存块及其在该内存块中的位置信息。
具体地,计算机设备将所述第一对象在所述第一进程中的对象原始地址与为所述第一进程分配的各个内存块在所述第一进程中的各个内存原始地址进行比较,所述比较方式包括但不限于用所述第一对象的对象原始地址逐一减去各个内存块的内存原始地址,然后逐一分析所得差值,从而确定存储所述第一对象的内存块,其中:
-如果所述差值小于零,则该内存块不是存储所述第一对象的内存块,需要继续比较以获得其他差值;
-如果所述差值等于零,则该内存块是存储所述第一对象的内存块,并且所述第一对象存储在该内存块的起始位置;
-如果所述差值大于零,则继续比较所述差值与该内存块总空间大小的关系,如果所述差值大于该内存块总空间大小,则该内存块不是存储所述第一对象的内存块,需要继续比较以获得其他差值;如果所述差值小于该内存块总空间大小,则该内存块是存储所述第一对象的内存块;如果所述差值等于该内存块总空间大小,则该内存块是存储所述第一对象的内存块,并且所述第一对象存储在该内存块的末尾位置。
该等确定所述第一对象所在的内存块及其在该内存块中的位置信息的例子仅为用于更好地阐释本发明的方案,本领域技术人员应理解,本发明应不限于上述确定所述第一对象所在的内存块及其在该内存块中的位置信息的方式,任何与确定所述第一对象所在的内存块及其在该内存块中的位置信息的方式均应在本发明的保护范围以内,并以引用方式包含于此。
计算机设备通过所述比较,可以确定所述第一对象所在的内存块及其在该内存块中的位置信息,所述第一对象在所述内存块中的位置信息包括但不限于所述第一对象相对于所述内存块的基地址的偏移量、所述第一对象相对于所述内存块的尾地址的偏移量等。
随后,在步骤S3中,计算机设备将得到的所述第一对象的位置信息提供给所述第二进程。所述第二进程根据该位置信息,访问所述第一对象,与第一进程进行数据共享。所述步骤S3已在前面参照图1所述的实施例中予以详述,为简明起见,在此不做赘述,而以引用的方式包含。
优选地,计算机设备根据所确定的所述第一对象及所述第一进程的标识信息来获取所述对象原始地址、为所述第一进程分配的各个内存块在所述第一进程中的各个内存原始地址及每个内存原始地址所指内存块的最大偏移量。具体地,计算机设备根据所述标识信息获取所述第一对象在所述第一进程中的对象原始地址,计算机设备根据所述第一进程的ID,在内存池相关信息库中查找所述第一进程创建的内存块的信息,所述信息包括但不限于内存块的个数、各内存块在所述第一进程的各内存原始地址、每个内存原始地址所指内存块的最大偏移量等。
接着,计算机设备将所述对象原始地址逐一与所述内存原始地址及该内存原始地址所对应的尾地址进行范围匹配,以确定所述第一对象所在的内存块,其中,所述尾地址为所述内存原始地址与该内存原始地址所对应的最大偏移量之和。具体地,计算机设备对所述对象原始地址和所述内存块的内存原始地址及所述内存块的尾地址进行比较,判断所述对象原始地址是否介于所述内存块的内存原始地址及所述内存块的尾地址之间,以确定所述第一对象所在的内存块。例如,计算机设备获知所述第一对象的原始地址为0x699D1234,计算机设备分析创建所述第一对象的第一进程在所述内存池创建的各内存块的信息,得到所述第一进程一共创建了三个内存块,其中第一个内存块的内存原始地址为0x00030000、尾地址为0x0010D000,第二个内存块的内存原始地址为0x00470000、尾地址为0x004B3000,第三个内存块的内存原始地址为0x699D 1000、尾地址为0x699D5000,则计算机设备确定所述第一对象所在的内存块为所述第三个内存块。
该等确定所述第一对象所在内存块的例子仅为用于更好地阐释本发明的方案,本领域技术人员应理解,本发明应不限于上述确定所述第一对象所在内存块的方式,任何与确定所述第一对象所在内存块的方式均应在本发明的保护范围以内,并以引用方式包含于此。
随后,计算机设备将所述对象原始地址减去该对象所在内存块的内存原始地址,以得到该对象在该内存块中的偏移量,并将所述第一对象所在的内存块及在该内存块中的偏移量作为位置信息。具体地,计算机设备根据所获取的对象原始地址以及该对象所在内存块的内存原始地址,得到该对象在该内存块中的偏移量,所述偏移量为所述对象原始地址与所述内存原始地址之差。例如,计算机设备获知所述第一对象的原始地址为0x699D1234,该对象所在内存块的内存原始地址为0x699D1000,则所述偏移量为0x00000234,则计算机设备将所述偏移量作为所述位置信息。
优选地,存储所述内存池相关信息的设备包括但不限于:1)计算机设备在内存区域为其分配的一块内存,所述内存用来存储所述内存池的相关信息,并且所述内存可以被一个或多个内存池访问以及管理;2)计算机设备在所述某个内存池实例中创建的内存,当计算机设备创建所述某个内存池实例时,即在所述内存池中创建一块内存用来存储所述内存池相关信息。优选地,所述内存池相关信息变化时,例如创建了新的被共享的对象、所述进程申请创建了新的内存块、进程间数据共享结束释放了一些对象以及内存块的存储空间等,计算机设备会更新所述变化。
优选地,计算机设备还可以根据所述一个或多个进程中对象之间存在的引用关系,建立或更新对象引用关系库。具体地,所述引用关系库建立或更新的方法包括但不限于:1)所述计算机设备根据预设的内容来建立引用关系库,例如,根据预设的对象引用链接,来建立引用关系库;2)所述计算机设备根据预设的规则,来建立或更新引用关系库,例如,计算机设备根据预设的对象命名规则,结合待创建的对象的名称,来判断该对象是否与其他对象存在引用关系,若是,则在所述引用关系库中进行更新;3)当所述计算机设备检测得到访问第一对象时,需要引用第二对象,且未能在引用关系库中检索到第一对象与第二对象之间存在关联,则在所述引用关系库中更新记录所述第一对象与所述第二对象的关系。
本领域技术人员应该理解,上述建立或更新引用关系库的举例仅为更好地阐释本发明的技术方案,而非对本发明所做的限定,事实上,任何根据所述一个或多个进程中对象之间存在的引用关系,建立或更新对象引用关系库的方案,均应包含在本发明的范围内,并以引用的方式包含于此。
图4为本发明一个方面的在计算机设备中基于内存池来进行数据共享的内存控制装置的示意图。其中,所述根据本发明的方法可通过计算机设备中的处理器执行操作***或内存控制程序来实现,所述操作***包括但不限于Windows、Linux、Unix、Netware或嵌入式***等,也可由内存控制芯片等硬件来实现。为简明起见,在本上下文中,我们将可执行本发明的所有操作***或内存控制程序或内存控制芯片统称为“内存控制装置”。
在本发明中,计算机设备中内存控制装置首先创建和管理所述内存池,所述内存控制装置根据来自使用所述内存池的进程的内存分配请求,在内存池中为所述进程分配一个或多个内存块,当所述进程需要创建对象时,该内存控制装置根据获得的所述进程创建所述对象的请求,在所述一个或多个内存块中为所述对象分配空间,以存储所述对象。所述内存控制装置可根据上述操作在一个或多个内存池内为多个进程创建对象。并且,所述内存控制装置还能够在内存池中将一个进程创建的对象提供给另一个进程共享。
下面以第二进程访问第一进程所创建的第一对象为例,说明所述内存控制装置如何实现在内存池内进行对象共享。其中,所述第二进程包括但不限于以下类别:1)未创建对象的进程;2)创建了非共享对象的进程;3)创建了共享对象的进程。
具体地,该内存控制装置包括第一获取装置11、第二获取装置12、提供装置13。
第一获取装置11根据来自第二进程的对象访问请求,来获取所述第二进程需要访问的第一对象的标识信息。其中,所述第二进程的对象访问请求可基于OpenFileMapping函数、GetProcAddress函数、消息函数、中断、或控件等发送。第一获取装置11如果捕获到所述对象访问请求,则从该对象访问请求中提取所述第二进程需要访问的第一对象的标识信息。其中,所述标识信息包括但不限于:1)所述第一对象的名称;2)所述第一对象的ID;3)创建所述第一对象的第一进程的名称;4)所述第一对象的创建时间等。需要说明的是,由于一个对象可具有多种标识信息,而在所述对象访问请求中可能仅包含一种标识信息,因此,第一获取装置11还可包括提取装置(图未示),该提取装置在提取该一种标识信息后,还可结合所述内存池的相关信息,获取该对象的其他标识信息。
接着,第二获取装置12根据所确定的第一对象的标识信息来获取所述第一对象的位置信息。具体地,第二获取装置12获取所述第一对象的位置信息的方式包括但不限于:
1)根据所述第一对象的标识信息,直接获取第一进程创建所述第一对象时,内存池所保存的所述第一对象的位置信息;
其中,所述内存池所保存的所述第一对象的位置信息包括但不限于:
a)所述第一对象在创建所述第一对象的第一进程中的原始地址及所述第一对象在可能访问所述第一对象的其他进程中的映射地址;
例如,请参照所述表1,表1示出所存储的所述第一对象的位置信息及与所述第一对象的位置信息相关的信息,其中第一进程创建对象时,所述内存控制装置即根据第一进程提供的第二进程可能访问所述第一对象的信息,保存了所述第一对象的标识信息以及所述第一对象在第二进程地址空间的映射地址信息,当第一获取装置11根据第二进程提供的信息判断得到第二进程需要访问的对象的ID为456时,第二获取装置12查找所记录的ID为456的对象的信息,得到所述第一对象在第二进程地址空间的映射地址为0x12345678。
表1:第一对象的位置信息及位置信息相关的信息
b)所述第一对象所在的内存块的ID及所述第一对象在该内存块中的位置;
例如,第一进程创建所述第一对象时,所述内存控制装置即记录了所述第一对象的ID、为所述第一对象分配的内存块的ID及该第一对象在内存块中的位置,例如,在该内存块中的偏移量等。当第一获取装置11根据第二进程提供的信息得到第二进程需要访问的第一对象的ID时,第二获取装置12查找得到所述第一对象所在的内存块及第一对象在该内存块中的位置,以便向所述第二进程提供所述第一对象的映射地址信息。
2)如果第一进程创建所述第一对象时,内存池保存了所述第一进程与所述第一对象的对应关系及所述第一对象的标识信息,但没有保存所述第一对象在其他进程的映射地址信息或所述第一对象所在的内存块的信息,则第二获取装置12需要根据所确定的第一对象的标识信息,在内存池相关信息中进行查找,获取创建所述第一对象的第一进程的相关信息,进而获知所述第一对象在所述第一进程地址空间的地址以及其他进程地址空间的映射地址信息。
该等获取所述第一对象的位置信息的例子仅为用于更好地阐释本发明的方案,本领域技术人员应理解,本发明应不限于上述获取所述第一对象的位置信息的方式,任何可使用于本发明的获取所述第一对象的位置信息的方式均应在本发明的保护范围以内,并以引用方式包含于此。
最后,提供装置13将得到的所述第一对象的位置信息提供给所述第二进程。所述第二进程根据该位置信息,访问所述第一对象,与第一进程进行数据共享。例如,第二进程根据提供装置13返回的所述第一对象在所述第二进程地址空间的映射地址,将数据从内存块复制到本地缓存中,再进行后续处理。
优选的,所述内存池的相关信息包括但不限于:
-所述内存池的版本号;
-用于存储所述内存池相关信息的内存块的分配状态,例如,所述内存块是位于所述内存池中,还是分配在内存区域中并被多个内存池共享,该内存块已被分配的空间比例和位置等;
-所述内存池的ID,例如:所述内存控制装置中按时间顺序创建的第一个内存池的ID为1,第二个内存池的ID为2等;
-使用内存池的进程的ID,例如:使用ID为1的第一个内存池的第一个进程的ID为101,使用第二个ID为2的内存池的第四个进程的ID为204等;
-使用内存池的进程所创建的内存块的相关信息,包括但不限于内存块的ID、内存块链表的头部和尾部等;例如,使用ID为1的第一个内存池的ID为101的第一个进程所创建的第一个内存块的ID为10101,使用ID为2的第二个内存池的ID为204的第四个进程所创建的第三个内存块的ID为20403;及内存块链表的前驱指针、后继指针、头指针等;
-被共享的对象的ID,例如:创建在ID为1的第一个内存池中由ID为102第二个进程所创建的ID为10203的第三个内存块上的第四个共享对象的ID为1020304;
-用于查找对象的引用关系库,根据被共享的对象之间存在的引用关系建立引用关系库,所述引用关系库包括但不限于树状、单向链表、循环链表等拓扑结构,例如:第二进程的创建的共享对象b需要引用第一进程创建的共享对象a与c,则引用关系的拓扑结构可为:
该等描述内存池相关信息的例子仅为用于更好地阐释本发明的方案,本领域技术人员应理解,本发明内存池的相关信息应不限于上述的说明,任何与内存池相关的信息均应在本发明的保护范围以内,并以引用方式包含于此。
图5为本发明的一个优选实施例的基于内存池来进行数据共享的内存控制装置的示意图。本实施例中,所述内存控制装置在进程创建对象时,即记录该对象的位置信息,以便后续使用。所述内存控制装置包括第一获取装置11、第二获取装置12、提供装置13、第三获取装置14、分配装置15、记录装置16,其中,第二获取装置12包括查找装置121。
具体地,第三获取装置14获取所述进程为待创建的对象请求创建位置的请求。其中,所述请求可基于CreatFileMapping函数、消息函数、中断、或控件等发送。
接着,分配装置15在所述进程所请求的内存块中为所述待创建的对象分配所述创建位置。具体地,以第一进程创建第一对象为例,当第三获取装置14获取到第一进程需要创建对象的请求时,分配装置15获取待创建的对象的大小,分析所述第一进程在所述内存池创建的内存块的信息,所述信息包括但不限于所述内存块的个数、各内存块的大小、各内存块的剩余空间大小等。分配装置15对所述待创建的对象的大小以及第一进程创建的各内存块的剩余空间大小进行比较,选择合适的所述内存块来存储所述待创建的对象。例如,分配装置15获知所述待创建的对象大小为4000字节,所述分配装置15分析该第一进程创建的各内存块的信息,得到所述第一进程一共创建了三个内存块,其中第一个内存块的剩余空间大小为1024字节,第二个内存块的剩余空间大小为8192字节,第三个内存块尚未存储任何对象,其大小为24576字节,则分配装置15对所述待创建的对象的大小以及第一进程创建的各内存块的剩余空间大小进行比较后,会在所述第二个内存块中分配一块大小为4096字节的空间来存储所述大小为4000字节的待创建的对象。
该等为所述待创建的对象分配所述创建位置的例子仅为用于更好地阐释本发明的方案,本领域技术人员应理解,本发明应不限于上述为所述待创建的对象分配所述创建位置的方式,任何与为所述待创建的对象分配所述创建位置的方式均应在本发明的保护范围以内,并以引用方式包含于此。
随后,记录装置16记录所述待创建对象的所述创建位置的信息。具体地,记录装置16根据所述待创建对象的存储位置,记录相关信息到内存池相关信息库中,所述相关信息包括但不限于:1)存储所述对象的内存块的ID;2)所述对象在所述内存块的地址信息;3)所述内存块的基地址;4)所述对象在其他进程中的映射地址等。
本实施例中,当收到一个进程的对象访问请求时,所述内存控制装置查找记录的该对象的位置信息,提供给该进程。以第二进程请求访问所述第一对象为例。
第一获取装置11根据来自第二进程的对象访问请求,来获取所述第二进程需要访问的第一对象的标识信息;或者,第一获取装置11中包含的提取装置根据来自第二进程的对象访问请求,并结合所述内存池的相关信息,来获取所述第二进程需要访问的第一对象的标识信息。第一获取装置11及提取装置已在前面参照图4所述的实施例中予以详述,为简明起见,在此不做赘述,而以引用的方式包含。
随后,查找装置121根据所确定的第一对象的标识信息来查找所述第一对象的所述创建位置,将所述创建位置作为所述第一对象的位置信息。具体地,查找装置121根据所确定的标识信息,在内存池相关信息库中直接搜索以获取所述第一对象的位置信息。其中,所述内存池所保存的所述第一对象的创建位置的信息包括但不限于:
1)所述第一对象在创建所述第一对象的第一进程中的原始地址及所述第一对象在可能访问所述第一对象的其他进程中的映射地址;
例如,请参照所述表1,表1示出所存储的所述第一对象的位置信息及与所述第一对象的位置信息相关的信息,其中第一进程创建对象时,所述内存控制装置即根据第一进程提供的第二进程可能访问所述第一对象的信息,保存了所述第一对象的标识信息以及所述第一对象在第二进程地址空间的映射地址信息,当第一获取装置11根据第二进程提供的信息判断得到第二进程需要访问的第一对象的ID为456时,查找装置121查找所记录的ID为456的第一对象的信息,得到所述第一对象在第二进程地址空间的映射地址为0x12345678;
2)所述第一对象所在的内存块的ID及所述第一进程在该内存块中的位置;
例如,第一进程创建所述第一对象时,所述内存控制装置即记录了所述第一对象的ID、为所述第一对象分配的内存块的ID及该第一对象在内存块中的位置,例如,在该内存块中的偏移量等,当第一获取装置11根据第二进程提供的信息得到第二进程需要访问的第一对象的ID时,查找装置121查找得到所述第一对象所在的内存块及第一对象在该内存块中的位置,以便向所述第二进程提供所述第一对象的映射地址信息。
接着,提供装置13将得到的所述第一对象的位置信息提供给所述第二进程。所述第二进程根据该位置信息,访问所述第一对象,与第一进程进行数据共享。所述提供装置13已在前面参照图4所述的实施例中予以详述,为简明起见,在此不做赘述,而以引用的方式包含。
图6为本发明的另一个优选实施例的基于内存池来进行数据共享的内存控制装置的示意图。本实施例中,所述内存控制装置并未在创建对象时记录对象的位置信息,因此,需根据提出对象访问请求的进程提供的信息,推算得到被访问对象的位置。以下以第二进程请求访问第一进程所创建的第一对象为例,进行说明。所述内存控制装置包括第一获取装置11、第二获取装置12、提供装置13,其中,第一获取装置11包括第一获取子装置111,第二获取装置12包括第二获取子装置122、第一位置分析装置123。
具体地,第一获取子装置111根据来自所述第二进程的对象访问请求,来获取所述第二进程需要访问的第一对象及创建该第一对象的第一进程的标识信息。其中,所述第二进程的对象访问请求可基于OpenFileMapping函数、GetProcAddress函数、消息函数、中断、或控件等发送。第一获取子装置111可直接获取所述第二进程的对象访问请求中提供的第一对象及及创建该第一对象的第一进程的标识信息;或者,其中,第一获取子装置111还包括前述提取装置(图未示)及查询装置(图未示),第一获取子装置111如果捕获到所述对象访问请求,则所述提取装置结合内存池的相关信息,从所述对象访问请求中获取所述第二进程需要访问的第一对象的标识信息,所述查询装置基于所述第一对象的标识信息在所述内存池相关信息中进行查询,以确定创建所述第一对象的所述第一进程的标识信息,其中,所述标识信息包括但不限于:1)所述第一对象的名称;2)所述第一对象的ID;3)创建所述第一对象的第一进程的名称;4)所述第一进程的ID等。
接着,第二获取子装置122根据所确定的所述第一对象及所述第一进程的标识信息来获取所述第一对象在所述第一进程中的对象原始地址、为所述第一进程分配的各个内存块在所述第一进程中的各个内存原始地址及各个内存块的大小。具体地,第二获取子装置122根据所述标识信息获取所述第一对象在所述第一进程中的对象原始地址,第二获取子装置122根据所述第一进程的ID,在内存池相关信息库中查找所述第一进程创建的内存块的信息,所述信息包括但不限于内存块的个数、各内存块在所述第一进程的各内存原始地址、各内存块的大小等。
随后,第一位置分析装置123根据所述第一对象在所述第一进程中的对象原始地址、为所述第一进程分配的各个内存块在所述第一进程中的各个内存原始地址及各个内存块的大小,来确定所述第一对象所在的内存块及其在该内存块中的位置信息。
具体地,第一位置分析装置123将所述第一对象在所述第一进程中的对象原始地址与为所述第一进程分配的各个内存块在所述第一进程中的各个内存原始地址进行比较,所述比较方式包括但不限于用所述第一对象的对象原始地址逐一减去各个内存块的内存原始地址,然后逐一分析所得差值,从而确定存储所述第一对象的内存块,其中:
-如果所述差值小于零,则该内存块不是存储所述第一对象的内存块,需要继续比较以获得其他差值;
-如果所述差值等于零,则该内存块是存储所述第一对象的内存块,并且所述第一对象存储在该内存块的起始位置;
-如果所述差值大于零,则继续比较所述差值与该内存块总空间大小的关系,如果所述差值大于该内存块总空间大小,则该内存块不是存储所述第一对象的内存块,需要继续比较以获得其他差值;如果所述差值小于该内存块总空间大小,则该内存块是存储所述第一对象的内存块;如果所述差值等于该内存块总空间大小,则该内存块是存储所述第一对象的内存块,并且所述第一对象存储在该内存块的末尾位置。
该等确定所述第一对象所在的内存块及其在该内存块中的位置信息的例子仅为用于更好地阐释本发明的方案,本领域技术人员应理解,本发明应不限于上述确定所述第一对象所在的内存块及其在该内存块中的位置信息的方式,任何与确定所述第一对象所在的内存块及其在该内存块中的位置信息的方式均应在本发明的保护范围以内,并以引用方式包含于此。
第一位置分析装置123通过所述比较,可以确定所述第一对象所在的内存块及其在该内存块中的位置信息,所述第一对象在所述内存块中的位置信息包括但不限于所述第一对象相对于所述内存块的基地址的偏移量、所述第一对象相对于所述内存块的尾地址的偏移量等。
随后,提供装置13将得到的所述第一对象的位置信息提供给所述第二进程。所述第二进程根据该位置信息,访问所述第一对象,与第一进程进行数据共享。所述提供装置13已在前面参照图4所述的实施例中予以详述,为简明起见,在此不做赘述,而以引用的方式包含。
优选地,第二获取装置12还包括第三获取子装置(图未示)、匹配装置(图未示)、第二位置分析装置(图未示)。
第三获取子装置根据所确定的所述第一对象及所述第一进程的标识信息来获取所述对象原始地址、为所述第一进程分配的各个内存块在所述第一进程中的各个内存原始地址及每个内存原始地址所指内存块的最大偏移量。具体地,第三获取子装置根据所述标识信息获取所述第一对象在所述第一进程中的对象原始地址,第三获取子装置根据所述第一进程的ID,在内存池相关信息库中查找所述第一进程创建的内存块的信息,所述信息包括但不限于内存块的个数、各内存块在所述第一进程的各内存原始地址、每个内存原始地址所指内存块的最大偏移量等。
接着,匹配装置将所述对象原始地址逐一与所述内存原始地址及该内存原始地址所对应的尾地址进行范围匹配,以确定所述第一对象所在的内存块,其中,所述尾地址为所述内存原始地址与该内存原始地址所对应的最大偏移量之和。具体地,匹配装置对所述对象原始地址和所述内存块的内存原始地址及所述内存块的尾地址进行比较,判断所述对象原始地址是否介于所述内存块的内存原始地址及所述内存块的尾地址之间,以确定所述第一对象所在的内存块。例如,匹配装置获知所述第一对象的原始地址为0x699D1234,匹配装置分析创建所述第一对象的第一进程在所述内存池创建的各内存块的信息,得到所述第一进程一共创建了三个内存块,其中第一个内存块的内存原始地址为0x00030000、尾地址为0x0010D000,第二个内存块的内存原始地址为0x00470000、尾地址为0x004B3000,第三个内存块的内存原始地址为0x699D1000、尾地址为0x699D5000,则匹配装置确定所述第一对象所在的内存块为所述第三个内存块。
该等确定所述第一对象所在内存块的例子仅为用于更好地阐释本发明的方案,本领域技术人员应理解,本发明应不限于上述确定所述第一对象所在内存块的方式,任何与确定所述第一对象所在内存块的方式均应在本发明的保护范围以内,并以引用方式包含于此。
随后,第二位置分析装置将所述对象原始地址减去该对象所在内存块的内存原始地址,以得到该对象在该内存块中的偏移量,并将所述第一对象所在的内存块及在该内存块中的偏移量作为位置信息。具体地,第二位置分析装置根据所获取的对象原始地址以及该对象所在内存块的内存原始地址,得到该对象在该内存块中的偏移量,所述偏移量为所述对象原始地址与所述内存原始地址之差。例如,第二位置分析装置获知所述第一对象的原始地址为0x699D1234,该对象所在内存块的内存原始地址为0x699D1000,则所述偏移量为0x00000234,则第二位置分析装置将所述偏移量作为所述位置信息。
优选地,存储所述内存池相关信息的存储内存控制装置包括但不限于:1)所述基于内存池来进行数据共享的内存控制装置在内存区域为该内存池相关信息分配的一块内存,保存装置(图未示)将所述相关信息保存至所述内存,并且所述内存可以被一个或多个内存池访问以及管理;2)所述基于内存池来进行数据共享的内存控制装置在所述某个内存池实例中创建的内存,当所述内存控制装置创建所述某个内存池实例时,即在所述内存池中创建一块内存,保存装置将所述内存池相关信息保存至所述内存。优选地,所述内存池相关信息变化时,例如创建了新的被共享的对象、所述进程申请创建了新的内存块、进程间数据共享结束释放了一些对象以及内存块的存储空间等,第二更新装置(图未示)会更新所述变化。
优选地,第一更新装置(图未示)还可以根据所述一个或多个进程中对象之间存在的引用关系,建立或更新对象引用关系库。具体地,所述引用关系库建立或更新的方法包括但不限于:1)所述第一更新装置根据预设的内容来建立引用关系库,例如,根据预设的对象引用链接,来建立引用关系库;2)所述第一更新装置根据预设的规则,来建立或更新引用关系库,例如,第一更新装置根据预设的对象命名规则,结合待创建的对象的名称,来判断该对象是否与其他对象存在引用关系,若是,则在所述引用关系库中进行更新;3)当所述第一更新装置检测得到访问第一对象时,需要引用第二对象,且未能在引用关系库中检索到第一对象与第二对象之间存在关联,则在所述引用关系库中更新记录所述第一对象与所述第二对象的关系。
本领域技术人员应该理解,上述建立或更新引用关系库的举例仅为更好地阐释本发明的技术方案,而非对本发明所做的限定,事实上,任何根据所述一个或多个进程中对象之间存在的引用关系,建立或更新对象引用关系库的方案,均应包含在本发明的范围内,并以引用的方式包含于此。
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。***权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。