一种共享内存分配方法转让专利

申请号 : CN201310376038.4

文献号 : CN103440203B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李小庆

申请人 : 上海斐讯数据通信技术有限公司

摘要 :

一种共享内存分配方法,包括:步骤1:将分配的共享内存等分成小的内存块,所有内存块的使用情况用一个比特表记录;步骤2:根据申请使用的内存大小计算出连续内存块的块数S;步骤3:遍历所述比特表,选择块数大于等于S且是其中最小的一个连续块。采用本发明的方法后,采用本发明的方法后,通过查看比特表方便了解共享内存的内存块占用情况,随时为进程需要分配共享内存。内存块数据部分的指针使用指针所指地址与共享内存起始地址的偏移量代替,使各个进程的读写彼此看得见,实现共享内存的动态分配。

权利要求 :

1.一种共享内存分配方法,其特征在于,包括:

步骤1:将分配的共享内存等分成小的内存块,所有内存块的使用情况用一个比特表记录;

步骤2:根据申请使用的内存大小计算出连续内存块的块数S;所述连续块的起始块分为用于存放连续块的块数S的头部与用于存放数据的数据部,连续块的其他块全部用于存放数据;

步骤3:遍历所述比特表,选择块数大于等于S且是其中最小的一个连续块;

当要存放的数据为指针时,全部改为指针所指地址与共享内存起始地址的偏移量。

2.根据权利要求1所述的共享内存分配方法,其特征在于,所述所有内存块的使用情况用一个比特表记录具体为:比特表中的每一个比特代表一个块,0表示对应内存块没有被占用,1表示对应内存块已经被占用。

3.根据权利要求1所述的共享内存分配方法,其特征在于,所述内存块为16字节。

4.根据权利要求1所述的共享内存分配方法,其特征在于,还包括内存释放步骤,根据连续块的起始块的头部中的块数S从连续块起始位置释放连续S块内存块。

5.根据权利要求4所述的共享内存分配方法,其特征在于,在比特表中把已经释放的内存块标记。

说明书 :

一种共享内存分配方法

技术领域

[0001] 本发明涉及共享内存技术领域,特别是涉及一种共享内存的分配方法。

背景技术

[0002] 当前的共享内存分配器主要用于有亲属关系的进程之间。具体操作为,父进程创建共享内存,在共享内存中进行动态分配,所有的数据达到完整状态后,通过fork创建子进程。
[0003] 由于子进程复制了父进程的地址空间,所以在父进程中设置好的数据结构对其是可见的,从而达到共享数据结构的目的。当前方案有弊端,首先,只能在有亲属关系的进程之间使用,其次,共享内存的数据结构设置好后就无法修改,因为进程的地址空间是独立的,在任何进程中做的修改都不可能被其他进程看见。严格来说,这个方案只是节约了内存,并非真正的动态内存分配。
[0004] 本发明对进程间的关系没有要求,内存的分配在任何时候都可以进行,共享内存的所有进程都可以看到别的进程的修改。

发明内容

[0005] 基于此,有必要提供任何时候都可以进行内存分配的共享内存分配方法。
[0006] 一种共享内存分配方法,包括:
[0007] 步骤1:将分配的共享内存等分成小的内存块,所有内存块的使用情况用一个比特表记录;
[0008] 步骤2:根据申请使用的内存大小计算出连续内存块的块数S;
[0009] 步骤3:遍历所述比特表,选择块数大于等于S且是其中最小的一个连续块。
[0010] 进一步的,所述所有内存块的使用情况用一个比特表记录具体为:
[0011] 比特表中的每一个比特代表一个块,0表示对应内存块没有被占用,1表示对应内存块已经被占用。
[0012] 进一步的,所述内存块为16字节。
[0013] 进一步的,所述连续块的起始块分为用于存放连续块的块数S的头部与用于存放数据的数据部,连续块的其他块全部用于存放数据。
[0014] 进一步的,当要存放的数据为指针时,当要存放的数据为指针时,全部改为指针所指地址与共享内存起始地址的偏移量。
[0015] 进一步的,还包括内存释放步骤,根据连续块的起始块的头部中的块数S从连续块起始位置释放连续S块内存块。
[0016] 进一步的,在比特表中把已经释放的内存块标记。
[0017] 采用本发明的方法后,采用本发明的方法后,通过查看比特表方便了解共享内存的内存块占用情况,随时为进程需要分配共享内存。内存块数据部分的指针使用指针所指地址与共享内存起始地址的偏移量代替,使各个进程的读写彼此看得见,实现共享内存的动态分配。

附图说明

[0018] 图1为本发明提供的共享内存分配方法的的流程图;
[0019] 图2为本发明所述的比特表的示意图;
[0020] 图3为本发明所述的连续块的示意图;
[0021] 图4为本发明所述的共享内存在进程间的地址空间映射图。

具体实施方式

[0022] 为了使本发明的目的、技术方案及优点更清楚明白,以下结合附图及实施例,对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
[0023] 参阅图1,本发明提供的一个实施例的共享内存分配方法,包括:
[0024] 步骤S100,将分配的共享内存等分成小的内存块,所有内存块的使用情况用一个比特表记录;
[0025] 将分配的共享内存等分成小的内存块,例如分为16字节的内存块。所有内存块的使用情况用一个比特表记录。
[0026] 在优选实施方式中,如图2所示,比特表中的每一个比特代表一个块,0表示对应内存块没有被占用,1表示对应内存块已经被占用。
[0027] 步骤S200,根据申请使用的内存大小计算出连续内存块的块数S;
[0028] 如图3所示,连续内存块的起始块分为用于存放连续块的块数S的头部head与用于存放数据的数据部data,连续块的其他块全部用于存放数据data。在计算连续块的块数S时,需把连续块的起始块的头部head计算在内,即:如果现在需要分配一个大小为M的共享内存,则用“(M+所述头部head所占大小)/内存块的大小”去计算实际需要申请的连续块的块数S。
[0029] 步骤S300,遍历所述比特表,选择块数大于等于S且是其中最小的一个连续块;
[0030] 结合图2,假如需要一个块数为2的连续块,共享内存如图2中的比特表所示。首先,遍历整个比特表,把块数大于等于2的联系找出来,图2中符合这个条件的连续块有3个,块数分别为2、4、3,选择其中最小的一个连续块,即块数为2的连续块,提高共享内存的利用率。当然,如果遍历整个比特表,假如出现块数为2的连续块有两个,则选择在比特表中靠前的连续块,当然也可以选择靠后的。其他情况在此就不再赘述,以此类推。
[0031] 步骤S400,根据连续块的起始块的头部中的块数S从连续块起始位置释放连续S块内存块。
[0032] 分配的共享内存在进程使用完之后,需要进行释放,以使内存重复使用,提高内存使用率。在释放完内存后,在比特表中把已经释放的内存块标记,示出内存块为未被占用,可以被重新分配,本实施例中,标记为“0”。
[0033] 参阅图4,当存放的数据data为指针时,全部改为指针所指地址与共享内存起始地址的偏移量。共享内存在各个进程中的地址空间不一样,所以相同的指针指向的共享内存不一致,导致无法实现共享的目的,即各个进程对共享内存的读写彼此看不见。如图,一段1G的共享内存在进程1和进程2中的地址是不一样的,分别为0-1G和0.5G-1.5G。假如共享内存中某一个内存块中的数据data为指针,指向地址0.75G,在进程1中指向0.75G,在进程2中也指向0.75G,但两个地址空间指向不同的共享内存,即指针对于进程1和进程2不是相同的数据。当把指针改为指针所指地址与共享内存起始地址的偏移量时,利用函数,把共享内存在进程中的地址的起始地址加上偏移量,即不管共享内存在各个进程中的空间地址如何,指向的共享内存是相同的,即偏移量对于各个进程是相同的数据,是可以共享,对它的读写也可以彼此看见。
[0034] 采用本发明的方法后,通过查看比特表方便了解共享内存的内存块占用情况,随时为进程需要分配共享内存。内存块数据部分的指针使用指针所指地址与共享内存起始地址的偏移量代替,使各个进程的读写彼此看得见,实现共享内存的动态分配。
[0035] 以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。