一种多进程系统中共享内存的管理方法及装置与流程

文档序号:11917978阅读:338来源:国知局
一种多进程系统中共享内存的管理方法及装置与流程

本发明涉及计算机领域,尤其涉及一种多进程系统中共享内存的管理方法及装置。



背景技术:

多进程的系统一般是基于虚拟内存的系统,比如像Linux和较新的Windows系统,进程的地址空间是相互独立的。进程之间要交互各自的私有数据有多种通信机制,比如消息队列、管道、套接字以及文件等,这些进程间通信机制基本都要经过多次的数据拷贝才能达到共享数据的目的,开销过大。

为了避免进程间在交互各自的私有数据时,会出现开销过大的问题,现有技术中提出了基于内存池来进行数据共享的方法,该方法的基本原理为:首先需要创建共享内存池,然后将该创建的共享内存池分配给各个进程,其共享内存池的管理思想是先将各种大小的内存块链接在一起,当需要为进程分配内存时,依次遍历查看各个空闲的内存块,找到满足要求的内存块后,再进行拆分分配,释放后又要将相邻内存块进行合并的动作。上述的方案中由于在为进程分配共享内存块时,需要遍历该内存池中的每个内存块,再找到符合要求的内存块,这样使得最终为进程分配到共享内存块所花费的时间较长。



技术实现要素:

本发明的实施例提供一种多进程系统中共享内存的管理方法及装置,用以解决现有技术中为进程分配内存块时所花费的时间较长的问题。

为达到上述目的,本发明的实施例采用如下技术方案:

本发明实施例的第一方面,提供一种多进程系统中共享内存的管理方法,所述方法包括:

进程基于预设键值创建共享内存,所述共享内存包括M个大小相同的共享内存大块,每个共享内存大块中包括N个共享内存小块;所述M和N均大于或等于2;

所述进程在共享内存中创建共享内存控制块,所述共享内存控制块包括由第一共享内存大块的索引链接构成的第一链表,由第二共享内存大块的索引链接构成的第二链表,由第三共享内存大块的索引链接构成的第三链表,其中,第一共享内存大块中的全部共享内存小块都被占用,第二共享内存大块中的部分共享内存小块被占用,第三共享内存大块中的全部共享内存小块均空闲。

所述进程在其私有内存中创建映射关系表;所述映射关系表用于指示共享内存大块的索引与共享内存大块的起始地址间的映射关系;

所述进程从所述第二链表和/或所述第三链表查找用于分配给所述进程的目标共享内存大块的索引,并在所述映射关系表查找所述目标共享内存大块的起始地址,以便向所述目标共享内存大块中连续空闲的共享内存小块写数据。

本发明实施例的第二方面,提供一种多进程系统中共享内存的管理装置,所述装置包括:

第一创建模块,用于基于预设键值创建共享内存,所述共享内存包括M个大小相同的共享内存大块,每个共享内存大块中包括N个共享内存小块;所述M和N均大于或等于2;

所述第一创建模块,还用于在共享内存中创建共享内存控制块,所述共享内存控制块包括由第一共享内存大块的索引链接构成的第一链表,由第二共享内存大块的索引链接构成的第二链表,由第三共享内存大块的索引链接构成的第三链表,其中,第一共享内存大块中的全部共享内存小块都被占用,第二共享内存大块中的部分共享内存小块被占用,第三共享内存大块中的全部共享内存小块均空闲。

第二创建模块,用于在进程的私有内存中创建映射关系表;所述映射关系表用于指示共享内存大块的索引与共享内存大块的起始地址间的映射关系;

分配模块,用于从所述第二链表和/或所述第三链表中查找用于分配给所述进程的目标共享内存大块的索引,并在所述映射关系表中查找所述目标共享内存大块的起始地址,以便向所述目标共享内存大块中连续空闲的共享内存小块写数据。

本发明实施例提供的多进程系统中共享内存的管理方法及装置,相比于现有技术,本方案进程首先在共享内存中创建共享内存控制块,该共享内存控制块中包括三种不同状态的链表,其中:第一链表中的共享内存大块中的全部共享内存小块都被占用,第二链表中的共享内存大块中的部分共享内存小块被占用,第三链表中的共享内存大块中的全部共享内存小块均空闲;其次,该进程创建映射关系表,该映射关系表中存储的是共享内存大块的索引与共享内存大块的起始地址间的映射关系;进程在为自身分配共享内存小块时,直接从第二链表和/或第三链表查找用于分配给进程的目标共享内存大块的索引,并在上述的映射关系表中查找目标共享内存大块的起始地址,以便于向目标共享内存大块中连续空闲的共享内存小块写数据。这样就避免了现有技术中依次遍历查看各个空闲的内存块,从而节省了进程分配内存块时所花费的时间,进而提高系统的运行速率。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的一种多进程系统中共享内存的管理方法的方法流程图;

图2为本发明实施例提供的一种共享内存的管理示意图;

图3为本发明实施例提供的一种管理进程与业务进程间访问共享内存的示意图;

图4为本发明实施例提供的一种多进程系统中共享内存的管理装置的结构示意图;

图5为本发明实施例提供的另一种多进程系统中共享内存的管理装置的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

为了便于清楚描述本发明实施例的技术方案,在本发明的实施例中,采用了“第一”、“第二”等字样对功能或作用基本相同的相同项或相似项进行区分,本领域技术人员可以理解“第一”、“第二”等字样并不对数量和执行次序进行限定。

本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。

术语定义:

进程:本发明上下文中,进程是在计算机中运行的应用程序实体,其被分配给计算机设备的处理器,并由处理器执行。

业务进程:本发明上下文中,业务进程指运行特定协议业务的进程应用程序实体,比如网络时间协议(英文:Network Time Protocol,简称:NTP)业务进程。

管理进程:本发明上下文中,管理进程指统一管理并显示业务进程的内部私有数据等,比如在管理进程中有对用户提供的命令行界面(英文:Command-line Interface,简称:CLI),可以针对某个具体的业务进程进行信息获取并显示。

共享内存:是一种进程间通信的方式,也是最快的进程间通信(英文:Inter-Process Communication,简称:IPC)形式。两个不同进程A、B共享内存的意思是同一块物理内存被映射到进程A、B各自的进程虚拟地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。

共享内存大块:通过系统调用接口分配出来的大块的共享内存,比如在linux系统下面,通过mmap系统调用接口映射一块4096字节的共享内存大块。

共享内存小块:将共享内存大块拆分成固定大小的共享内存小块,比如在mmap分配4096内存出来后,将4096拆分为64块大小为64字节的共享内存小块,具体共享内存大块和共享内存小块的大小可以根据具体业务情况进行设置。

本发明实施例提供一种多进程系统中共享内存的管理方法,如图1所示,该方法包括:

101、进程基于预设键值创建共享内存,该共享内存包括M个大小相同的共享内存大块,每个共享内存大块中包括N个共享内存小块;M和N均大于或等于2。

可选的,上述的预设键值可以是每个进程预先进行统一所设定好的,也可以是基于指定的文件所生成的一个预设键值。例如,每个进程基于指定的文件(如/shm/shm_cache,linux系统下可基于这个文件来生成键值,每个进程基于相同的文件来创建同一个共享内存)来创建这个共享内存,且使用进程内部变量shmCacheAddr来保存这个映射出来的地址。

示例性的,上述的内存大块的个数可以一次性创建好,比如创建2048个,也可以是动态进行增长的,而对于动态增长在这里不进行说明,具体参照现有技术。

102、进程在共享内存中创建共享内存控制块,该共享内存控制块包括由第一共享内存大块的索引链接构成的第一链表,由第二共享内存大块的索引链接构成的第二链表,由第三共享内存大块的索引链接构成的第三链表。

其中,上述的第一共享内存大块中的全部共享内存小块都被占用,第二共享内存大块中的部分共享内存小块被占用,第三共享内存大块中的全部共享内存小块均空闲。

需要说明的是,上述的第一链表、第二链表以及第三链表均可以为双向循环链表或者单向循环链表。

示例性的,参照图2所示的示意图,上述的三个链表分别为Full(0)、Partial(1)和free(2),以Free链为例,具体参照图2中的标号2,该free链头preNode值为6,表示其前一个结点为数组索引6,nxtNode值为5,表示其后一个结点为数组索引5;数组索引5中shm_cache_node的preNode值为2,表示其前一个结点为数组索引2,nxtNode值为6,表示其后一个结点为数组索引6;依此类推,即以数组下标的值为索引来链接这些同类的块,形成一个双向的循环链表。由各个进程中映射的共享内存指针值shmCacheAddr加上这些索引即可得到指定shm_cache_node块的地址,从而访问其成员值。

103、进程在其私有内存中创建映射关系表。

本发明实施例中的映射关系表用于指示共享内存大块的索引与共享内存大块的起始地址间的映射关系。

示例性的,上述的私有内存为进程的虚拟地址空间,通常情况下,在进程启动时,Linux系统会为每个进程分配4GB的虚拟地址空间来供进程的运行使用。

104、进程从第二链表和/或第三链表查找用于分配给进程的目标共享内存大块的索引,并在映射关系表查找目标共享内存大块的起始地址,以便向目标共享内存大块中连续空闲的共享内存小块写数据。

优选的,为了减少共享内存中出现的内存碎片的数量,上述的步骤104中的进程从第二链表和/或第三链表查找用于分配给进程的目标共享内存大块的索引具体包括以下内容:

104a、进程从第二链表中按照第二链表中索引链接的顺序,依次查找用于分配给进程的目标共享内存大块的索引,直至查找到为止。

104b、若第二链表中不存在用于分配给进程的目标共享内存大块的索引,或第二链表中不存在共享内存大块的索引,则按照第三链表中索引链接的顺序确定第三链表中的至少一个索引,作为分配给进程的目标共享内存大块的索引。

示例性的,上述的第二链表中不存在共享内存大块的索引包括两方面的内容,一方面,当进程第一次运行的时候,由于共享内存大块中的共享内存小块均空闲,因此这里的第二链表中为空,即未存储任何索引;另一方面,在第二链表中所存储的仅仅是一些其他的标识,例如为标识0,而该标识0不代表任何共享内存大块的索引。

示例性的,上述按照第三链表中索引链接的顺序确定第三链表中的至少一个索引具体为:由于进程自身的需求,可能一个共享内存大块不能满足进程写数据的需求,可能会需要两个甚至多个共享内存大块,因此这里需要在第三链表中确定至少一个索引。

示例性的,上述的步骤104中的进程从第二链表和/或第三链表查找用于分配给进程的目标共享内存大块的索引具体包括以下内容:

104c、进程直接从第三链表中按照第三链表中索引链接的顺序,依次查找用于分配给进程的目标共享内存大块的索引。

本发明实施例提供的多进程系统中共享内存的管理方法,相比于现有技术,本方案进程首先在共享内存中创建共享内存控制块,该共享内存控制块中包括三种不同状态的链表,其中:第一链表中的共享内存大块中的全部共享内存小块都被占用,第二链表中的共享内存大块中的部分共享内存小块被占用,第三链表中的共享内存大块中的全部共享内存小块均空闲;其次,该进程创建映射关系表,该映射关系表中存储的是共享内存大块的索引与共享内存大块的起始地址间的映射关系;进程在为自身分配共享内存小块时,直接从第二链表和/或第三链表查找用于分配给进程的目标共享内存大块的索引,并在上述的映射关系表中查找目标共享内存大块的起始地址,以便于向目标共享内存大块中连续空闲的共享内存小块写数据。这样就避免了现有技术中依次遍历查看各个空闲的内存块,从而节省了进程分配内存块时所花费的时间,进而提高系统的运行速率。

可选的,若进程从第二链表中查找到用于分配给进程的目标共享内存大块的索引,此时需要给该第二链表中的目标共享内存大块中的共享内存小块中写数据,具体的,该方法还包括以下内容:

A1、进程根据在映射关系表查找到的目标共享内存大块的起始地址、目标共享内存大块中的空闲管理区的大小以及目标共享内存大块中的共享内存小块被占用的个数确定出空闲的共享内存小块的起始地址。

A2、进程从空闲的共享内存小块的起始地址处开始写数据,将共享内存大块中的计数器的数值增加x。

其中,上述的x为被占用的空闲共享内存小块的个数。例如,若进程写从空闲的共享内存小块的起始地址处写数据,将数据写完需要占用3个空闲的共享内存小块,则此时需要将共享内存大块中的计数器的数值加3。

在上述的进程分配共享内存小块后,使得该共享内存小块所在的共享内存大块的状态发生变化,进而需要更新三个链表中所链接的共享内存大块索引。可选的,该方法还包括:

B1、若第二链表中的第二共享内存大块中的所有共享内存小块被占用,则进程将第二共享内存大块的索引链接到第一链表中;或

B2、若第三链表中的第三共享内存大块中的所有共享内存小块被占用,则进程将第三共享内存大块的索引链接到第一链表中;或

B3、若第三链表中的第三共享内存大块中的部分共享内存小块被占用,则进程将第三共享内存大块的索引链接到第二链表中。

为了使得其他进程对内存空间的需求得到满足,还需要将分配到的共享内存大块回归至系统。可选的,该方法还包括以下内容:

C1、进程释放为进程分配的目标共享内存大块中的共享内存小块,将共享内存大块中的计数器的数值减少y。

C2、若共享内存大块中的计数器中的数值减为0,则进程将共享内存大块在本进程内删除。

其中,上述的y为被释放的共享内存小块的个数。例如,若进程释放了目标共享内存大块中的2个共享内存小块的,则此时需要将共享内存大块中的计数器的数值减2。

优选的,为了保证设备的正常运转,需要快速的释放上述的目标共享内存大块中的共享内存小块,上述的步骤C1中进程释放为进程分配的目标共享内存大块中的共享内存小块具体包括以下内容:

D1、根据共享内存小块中记录的共享内存大块索引定位得到目标共享内存大块的起始地址。

D2、从目标共享内存大块的起始地址处开始,将为进程分配的目标共享内存大块中的共享内存小块设置为空闲。

示例性的,上述的将目标共享内存大块中的共享内存小块释放可以是直接将共享内存小块的索引添加到目标共享内存大块中的空闲块管理区中。由于空闲块管理区中存储的就是空闲的共享内存小块的索引,因此释放的时候只需要修改空闲管理区内的控制信息,指示此共享内存小块释放后是空闲可用状态。

在上述的进程释放目标共享内存大块中的共享内存小块后,使得该共享内存小块所在的目标共享内存大块的状态发生变化,进而需要更新三个链表中所链接的共享内存大块索引。可选的,该方法还包括:

E1、若目标共享内存大块中的所有共享内存小块被释放,则进程将目标共享内存大块的索引链接到第三链表中。

E2、若目标共享内存大块中的部分共享内存小块被释放,则进程将目标共享内存大块的索引链接到第二链表中。

下面基于图1所示的多进程系统中的共享内存管理方法,参照图2所示的共享内存的管理流程示意图,进行描述本方案中的具体管理过程。

该共享内存统一管理的基本思想包括以下内容:首先是共享内存缓存shm_cache的管理,其维护进程中所有的共享内存大块shm_node的状态,包括full(表头位置为数组索引0,此表上的shm_node管理的所有共享内存小块都已被分配)、partial(表头位置为数组索引1,此表上的shm_node管理的部分共享内存小块未被分配)、free(表头位置为数组索引2,此表上的shm_node管理的所有共享内存小块都未被分配)这三个状态,业务进程有需要分配共享内存小块时优先从partial表中分配。

其次,就是分配给业务进程使用的共享内存小块,具体细节如下(共享内存创建接口使用系统原生的接口即可,比如linux系统中的mmap或shmget均可,任何多进程环境并支持共享内存机制的系统均在此发明保护范围,这里以linux系统进行示例说明):

(1)共享内存控制块(以下简称:shm_cache)创建:业务进程启动后都会默认创建shm_cache,且每个进程基于指定的文件(如/shm/shm_cache,linux系统下可基于这个文件来生成键值,每个业务进程基于相同的文件来创建同一个共享内存)来创建这个共享内存,且使用业务进程内部变量shmCacheAddr(图2中标号1所示)来保存这个映射出来的地址。shm_cache管理的共享内存大块(以下简称:shm_node)个数(对应图示的共享内存大块结点(以下简称:shm_cache_node),每个shm_cache_node对应一个shm_node)一次性创建好,比如创建2048个(当然这里管理的shm_node个数也可以动态增长,便于说明方案,这里动态增长就不说明了,但属于此方案范围)。

(2)shm_cache如何管理shm_node:如图2中标号2所示,这里以free链为例,free链头preNode值为6,表示相邻两个结点中的前一个结点为数组索引6,nxtNode值为5,表示相邻两个结点中的后一个结点为数组索引5;数组索引5中shm_cache_node的preNode值为2,表示相邻两个结点中的前一个结点为数组索引2,nxtNode值为6,表示相邻两个结点中的后一个结点为数组索引6;依此类推,即以数组下标的值为索引来链接这些同类的块,形成一个双向的循环链表。由各个业务进程中映射的共享内存指针值shmCacheAddr加上这些索引即可得到指定shm_cache_node的地址,从而访问其成员值。

(3)映射关系表(以下简称shm_map:)创建:shm_map是存储在各个业务进程独自分配的内存中(即不是共享内存),其存在主要用于将shm_cache_node和shm_node关联起来,shm_cache_node中的shmKey(示例值为0到2047)有两层作用,一是用于shm_map哈希表的键值,二是用于生成文件(如/shm/shm_node_shmKey,此文件用于共享内存创建的键值,各个进程可以基于此文件创建同一个共享内存),业务进程以这个文件来创建共享内存,此共享内存用于存储shm_node的空闲块管理区和数据区。业务进程映射出来的共享内存地址存储在shm_map中的shmNodeAddr,如图2中标号6所示。

(4)空闲块管理区:用于管理所有未分配的共享内存小块,shm_node中的nxtFree指向下一个可用块索引,下一个可用块的对应控制区同样指向下下个可用块索引,如图2中标号7所示,即类似shm_cache管理shm_node的方式,只是这里是单向的数组链表。

(5)共享内存小块区:按业务进程需求将共享内存大块划分成固定大小,比如各业务进程的内存分配信息(进程标识、使用内存的用户信息、分配内存次数、分配内存总大小,此记录有多条。每种业务进程的私有信息都可以对应一个shm_cache),这样管理进程可以通过遍历这张表来显示指定业务进程的内存使用信息,从而便于内存泄露问题的定位。

这里仅是以示例进行说明一个显示的方法,还可以有其它方法来显示这些信息,其它方法也属于本发明保护范围。比如将shm_map中的索引信息和各个业务进程进行绑定关联,同时规定一个shm_node只能让一个业务进程使用,这样管理进程要显示具体的某个业务进程私有数据时,可以直接一步到位通过索引获取shm_node,再显示shm_node上所有已经分配的共享内存小块的存储的数据信息。

(6)共享内存小块分配流程:①通过shm_cache找到可分配共享内存小块的shm_cache_node,获得shmKey值,由shmKey哈希获得shm_node起始地址,在shm_node中找到一个空闲共享内存小块的索引,结合shm_node的起始地址最终计算出要返回的地址(shmNodeAddr+空闲管理区大小+索引*内存块大小),shm_node中inUseCnt加1;②在①的过程中如果由shmKey查找失败,则说明这是其它业务进程所创建的shm_node,或者说当前还没有任何业务进程来创建这个shm_node,本业务进程这时候需要进行映射动作获取地址(键值为/shm/shm_node_shmKey),之后将此地址记录到映射表shm_map中,后面流程同①;③当通过shm_cache无法获取可分配共享内存小块的共享内存大块结点时,需要新创建一个共享shm_node和数据区,并加入shm_cache管理,同时在本业务进程内映射获取共享内存地址,后面流程同①;当分配共享内存小块成功后对shm_node中的内存使用计数器的数值增加,具体增加的数值为分配的共享内存小块的个数。

(7)共享内存小块释放流程:这里有两种方式①根据用户所传递进来的共享内存小块地址,遍历shm_map,通过shmNodeAddr和共享内存大块大小(大小可以是预先设置好的)范围找到指定映射表中的共享内存大块结点,从映射表中的共享内存大块结点中获取该共享内存小块地址所在的共享内存大块的shmNodeAddr值,将shm_node中相应共享内存小块的控制区设置为空闲;②为了快速查找,在共享内存小块中记录shmKey值,由shmKey定位得到shmNodeAddr,以空间换时间;释放成功后对shm_node中内存使用计数器的数值减少,具体减少的数值为释放的共享内存小块的个数。如果计数减少为0,则将shm_node和数据区在本业务进程内删除。如果此shm_node管理的所有共享内存小块无进程使用,即shm_node中inUseCnt为0,则通知管理进程将指定的shm_node和数据区进行删除。

(8)操作保护原则:其中对shm_cache和shm_node相关操作都需要各个业务进程进行互斥,而对共享内存小块的操作可以不需要保护,保护可以考虑使用linux系统原生的semget机制。对shm_map的操作需要考虑进程内部的线程之间的互斥访问,可以考虑使用原生的线程互斥量pthread_mutex_t机制。

参照图3给出的管理进程与业务进程间访问共享内存的示意图,在每个业务进程以及管理进程中都存在一个共享内存管理的过程,当业务进程需要向共享内存中写数据时,都需要先调用该共享内存管理过程(即执行上述的图2中的过程),然后向该共享内存写数据。而管理进程在读取该共享内存中的数据时,仍然需要先调用该共享内存管理过程,然后在读取该共享内存中的数据。从而实现了多个业务进程通过共享内存的方式将私有数据共享给管理进程。

下面将基于图1所示的多进程系统中的共享内存管理方法的实施例中的相关描述对本发明实施例提供的一种多进程系统中的共享内存管理装置进行介绍。以下实施例中与上述实施例相关的技术术语、概念等的说明可以参照上述的实施例,这里不再赘述。

本发明实施例提供的一种多进程系统中共享内存的管理装置,如图4所示,该装置2包括:第一创建模块21、第二创建模块22以及分配模块23,其中:

第一创建模块21,用于基于预设键值创建共享内存,共享内存包括M个大小相同的共享内存大块,每个共享内存大块中包括N个共享内存小块;M和N均大于或等于2。

第一创建模块21,还用于在共享内存中创建共享内存控制块,共享内存控制块包括由第一共享内存大块的索引链接构成的第一链表,由第二共享内存大块的索引链接构成的第二链表,由第三共享内存大块的索引链接构成的第三链表,其中,第一共享内存大块中的全部共享内存小块都被占用,第二共享内存大块中的部分共享内存小块被占用,第三共享内存大块中的全部共享内存小块均空闲。

第二创建模块22,用于在进程的私有内存中创建映射关系表;映射关系表用于指示共享内存大块的索引与共享内存大块的起始地址间的映射关系。

分配模块23,用于从第二链表和/或第三链表中查找用于分配给进程的目标共享内存大块的索引,并在映射关系表中查找目标共享内存大块的起始地址,以便向目标共享内存大块中连续空闲的共享内存小块写数据。

优选的,为了减少共享内存中出现的内存碎片的数量,上述的分配模块23在从共享内存控制块中的第二链表和/或第三链表查找用于分配给进程的目标共享内存大块的索引时具体用于:

从第二链表中按照第二链表中索引链接的顺序,依次查找用于分配给进程的目标共享内存大块的索引,直至查找到为止;

若第二链表中不存在用于分配给进程的目标共享内存大块的索引,或第二链表中不存在共享内存大块的索引,则按照第三链表中索引链接的顺序确定第三链表中的至少一个索引,作为分配给进程的目标共享内存大块的索引。

可选的,若进程从第二链表中查找到用于分配给进程的目标共享内存大块的索引,此时需要给该第二链表中的目标共享内存大块中的共享内存小块中写数据。如图5所示,该装置2还包括:确定模块24和存储模块25,其中:

确定模块24,用于根据在映射关系表查找到的目标共享内存大块的起始地址、目标共享内存大块中的空闲管理区的大小以及目标共享内存大块中的共享内存小块被占用的个数确定出空闲的共享内存小块的起始地址.

存储模块25,用于从空闲的共享内存小块的起始地址处开始写数据,将共享内存大块中的计数器的数值增加x,x为被占用的空闲共享内存小块的个数。

在上述的进程分配共享内存小块后,使得该共享内存小块所在的共享内存大块的状态发生变化,进而需要更新三个链表中所链接的共享内存大块索引。可选的,如图5所示,该装置2还包括:更新模块26,其中:

更新模块26用于:

若第二链表中的第二共享内存大块中的所有共享内存小块被占用,则进程将第二共享内存大块的索引链接到第一链表中;或

若第三链表中的第三共享内存大块中的所有共享内存小块被占用,则进程将第三共享内存大块的索引链接到第一链表中;或

若第三链表中的第三共享内存大块中的部分共享内存小块被占用,则进程将第三共享内存大块的索引链接到第二链表中。

为了使得其他进程对内存空间的需求得到满足,还需要将分配到的共享内存大块回归至系统。可选的,如图5所示,该装置2还包括:释放模块27,其中:

释放模块27,用于释放为进程分配的目标共享内存大块中的共享内存小块,将共享内存大块中的计数器的数值减少y,y为被释放的共享内存小块的个数;还用于若共享内存大块中的计数器中的数值减为0,则进程将共享内存大块在本进程内删除。

示例性的,上述的释放模块27在释放为进程分配的目标共享内存大块中的共享内存小块时具体用于:

根据共享内存小块中记录的共享内存大块索引定位得到目标共享内存大块的起始地址.

从目标共享内存大块的起始地址处开始,将为进程分配的目标共享内存大块中的共享内存小块设置为空闲。

在上述的进程释放目标共享内存大块中的共享内存小块后,使得该共享内存小块所在的目标共享内存大块的状态发生变化,进而需要更新三个链表中所链接的共享内存大块索引。示例性的,上述的更新模块26还用于:

若目标共享内存大块中的所有共享内存小块被释放,则进程将目标共享内存大块的索引链接到第三链表中。

若目标共享内存大块中的部分共享内存小块被释放,则进程将目标共享内存大块的索引链接到第二链表中。

本发明实施例提供的多进程系统中共享内存的管理装置,相比于现有技术,本方案进程首先在共享内存中创建共享内存控制块,该共享内存控制块中包括三种不同状态的链表,其中:第一链表中的共享内存大块中的全部共享内存小块都被占用,第二链表中的共享内存大块中的部分共享内存小块被占用,第三链表中的共享内存大块中的全部共享内存小块均空闲;其次,该进程创建映射关系表,该映射关系表中存储的是共享内存大块的索引与共享内存大块的起始地址间的映射关系;进程在为自身分配共享内存小块时,直接从第二链表和/或第三链表查找用于分配给进程的目标共享内存大块的索引,并在上述的映射关系表中查找目标共享内存大块的起始地址,以便于向目标共享内存大块中连续空闲的共享内存小块写数据。这样就避免了现有技术中依次遍历查看各个空闲的内存块,从而节省了进程分配内存块时所花费的时间,进而提高系统的运行速率。

通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的多进程系统中的共享内存管理装置,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

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