具体实施方式
为详细说明本发明的技术内容、所实现目的及效果,以下结合实施方式并配合附图予以说明。
如图2所示,本发明实施例提供了一种内存管理的方法,包括步骤:
根据预设值为所述内存建立多个索引,不同索引的维度不同,所述维度为所述预设值的倍数;
接收内存分配请求,根据所述内存分配请求中的内存空间大小匹配对应维度的目标索引,根据所述内存空间大小对所述目标索引进行赋值,根据赋值结果对所有其它维度的索引进行对应赋值;
接收内存释放请求,根据所述内存释放请求中的内存地址以及释放空间的大小按照所述维度从小到大的顺序依次更新所有能够释放所述释放空间的的索引。
由上述描述可知,本发明的有益效果在于:在对内存空间进行管理时,根据预设值为所述内存建立多个索引,在进行内存分配时,根据待分配的内存空间大小匹配对应维度的目标索引,对目标索引进行赋值,并对所有其它索引进行对应赋值,在进行内存释放时,根据所述内存释放请求中的内存地址以及释放空间的大小按照所述维度从小到大的顺序依次更新所有能够释放所述释放空间的的索引;通过为内存建立不同维度的多个索引,在内存分配和释放时均对每个索引进行对应的索引操作,将伙伴算法的拆分和合并操作简化为对不同维度的索引的操作,简化了内存分配和释放过程的操作,并且也不需要对内存进行链表管理,减少了内存管理结构的开销,提升了用户不同业务场景下的性能。
进一步的,所述根据所述内存分配请求中的内存空间大小匹配对应维度的目标索引包括:
将所述内存分配请求中的内存空间大小进行向上取整,得到第一内存空间,所述第一内存空间为所述预设值的倍数;
选取维度与所述第一内存空间相差最小并且大于或者等于所述第一内存空间的索引作为所述目标索引。
由上述描述可知,通过对请求分配的内存空间大小按照预设值的整数倍向上取整,然后选取维度与取整后的空间相差最小并且又能够容纳所述空间的索引作为目标索引,能够最合理的为请求分配的空间配置对应的索引。
进一步的,所述索引为比特数组;
所述多个索引均指向所述内存;
所述比特数组的每一位指向与其索引的维度对应大小的内存空间。
由上述描述可知,通过比特数组组成索引,将对各个维度的索引的操作转换为方便简单的索引位操作,不仅操作方便,而且占用空间小,同时可以集成到硬件中进行实现,不需要像现有技术需要通过固件实现,提高了便捷性。
进一步的,所述根据所述内存空间大小对所述目标索引进行赋值,根据赋值结果对所有其它维度的索引进行对应赋值包括:
根据所述内存空间大小及所述目标索引每一位指向的内存空间大小在所述目标索引中按照预设顺序搜索与所述内存空间大小适配的并且值为第一预设值的第一目标比特位集合;
将所述第一目标比特位集合中的每一个第一目标比特位设置为第二预设值;
根据所述第一目标比特位集合以及其它索引的维度与所述目标索引的维度的关系在每一个其它索引中确定对应的第二目标比特位集合并将所述第二目标比特位集合中的每一个第二目标比特位设置为第三预设值。
由上述描述可知,在对比特位进行赋值的时候,不同索引之间依据比特位的对应关系一一进行赋值,减少了赋值的误差并提高了赋值的效率。
进一步的,所述内存空间大小对所述目标索引进行赋值后,根据所述赋值结果返回对应分配的内存地址。
由上述描述可知,根据赋值结果返回对应分配的内存地址,确定了最后分配到的地址,便于后续的释放内存等操作。
进一步的,所述根据所述内存释放请求中的内存地址以及释放空间的大小按照所述维度从小到大的顺序依次更新所有能够释放所述释放空间的索引包括:
根据所述内存释放请求中的内存地址以及释放空间的大小从最小维度的索引中确定与所述释放空间大小匹配并且值为所述第二预设值的第三目标比特位集合,将所述第三目标比特位集合中的每一个第三目标比特位设置为所述第一预设值;
根据所述第三目标比特位集合按照维度从小到大的顺序依次判断其它维度的索引是否存在能够释放所述释放空间大小的第四目标比特位集合,若是,则将所述第四目标比特位集合中的每一个第四目标比特位设置为所述第一预设值。
由上述描述可知,在释放内存空间时,先对最小维度的索引所需的比特位空间进行选定,再根据不同维度的索引之间的比特位的对应关系对应到其他维度的比特位上,依次更新所有维度的比特位信息,使得内存释放时的操作更加便捷、高效。
进一步的,所述判断其它维度的索引是否存在能够释放所述释放空间大小的第四目标比特位集合包括:
判断当前维度的索引中与所述释放空间对应的已释放空间中最高内存地址对应的目标比特位的相邻比特位是否为所述第一预设值,若是,则比所述当前维度大的下一维度的索引存在能够释放所述释放空间大小的第四目标比特位集合,若否,则比所述当前维度大的下一维度的索引不存在能够释放所述释放空间大小的第四目标比特位集合;
组成所述索引的比特数组的高位指向高地址的内存;
所述目标比特位和所述相邻比特位组成所述下一维度的索引的一个索引比特位。
由上述描述可知,通过对当前维度的与要释放的空间对应的已释放空间中最高内存地址对应的目标比特位的相邻比特位是否处于没被分配状态进行判断,能够快速准确地判断是否能够往下一维度索引进行空间的继续释放。
请参照图3,本发明另一实施例提供了一种内存管理装置,包括:
索引创建模块,根据预设值为所述内存建立多个索引,不同索引的维度不同,所述维度为所述预设值的倍数;
内存分配模块,接收内存分配请求,根据所述内存分配请求中的内存空间大小匹配对应维度的目标索引,根据所述内存空间大小对所述目标索引进行赋值,根据赋值结果对所有其它维度的索引进行对应赋值;
内存释放模块,接收内存释放请求,根据所述内存释放请求中的内存地址以及释放空间的大小按照所述维度从小到大的顺序依次更新所有能够释放所述释放空间的索引。
本发明另一实施例提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述内存管理方法中的各个步骤。
请参照图4,本发明另一实施例提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述内存管理方法中的各个步骤。
本发明上述内存管理方法、装置、计算机可读存储介质及电子设备可以应用于任何类型的需要进行内存管理的业务场景,具有通用性。以下通过具体实施方式进行说明:
实施例一
请参照图2,一种内存管理的方法,包括步骤:
S1:根据预设值为所述内存建立多个索引,不同索引的维度不同,所述维度为所述预设值的倍数;
其中,所述索引为比特数组;
所述多个索引均指向所述内存;
所述比特数组的每一位指向与其索引的维度对应大小的内存空间;
比如,以1MB的内存管理为例,取预设值为4K,按照4K、8K、16K、32K、64K、128K这六种维度分别建立索引;
每个比特位指向与其索引的维度对应大小的内存空间,如图5所示,4K索引中每个bit指向4K的内存空间,8K索引中每个bit指向8K的内存空间;同理64K的索引中每个bit指向64K的内存空间;
通过对比特位进行赋值以形成索引信息,根据每一个比特位的索引信息可以确定比特位对应的内存是处于空闲状态还是已分配状态,具体的赋值可以灵活设定,只要空闲状态和已分配状态通过不同值指代就行,可以分别设定为第一预设值和第二预设值;
比如,初始状态下,所有比特位的索引信息均为1,表示对应的内存为空闲状态,一旦内存被分配后,设置对应的索引信息为0,表示对应的内存为已分配状态;
其中索引信息需要占用的空间大小分别为32Bytes、16Bytes、8Bytes、4Bytes、2Bytes、1Bytes,总共需要消耗的管理结构开销为63Bytes,具体的4K的索引空间大小计算如下:1MB/4K/8bit per byte=32Bytes,其他索引空间计算公式类似;
其中,具体的索引维度可以根据具体的应用场景进行设定,比如索引维度的创建也可以为2K的倍数,如2K、4K、6K、8K、10K等维度创建索引;
S2:接收内存分配请求,根据所述内存分配请求中的内存空间大小匹配对应维度的目标索引,根据所述内存空间大小对所述目标索引进行赋值,根据赋值结果对所有其它维度的索引进行对应赋值;
其中,根据所述内存分配请求中的内存空间大小匹配对应维度的目标索引包括:
将所述内存分配请求中的内存空间大小进行向上取整,得到第一内存空间,所述第一内存空间为所述预设值的倍数;
选取维度与所述第一内存空间相差最小并且大于或者等于所述第一内存空间的索引作为所述目标索引;
比如,请求分配的内存大小为19K,则根据预设值4K,取大于或者等于19K并且与19K距离最近的同时是4K倍数的内存空间大小,即为20K,20K与维度为32K的索引最适配,即一个比特位就能够容纳20K,并且维度又与20K距离最近,因此目标索引为维度为32K的索引;
根据所述内存空间大小对所述目标索引进行赋值后,根据所述赋值结果返回对应分配的内存地址,基于内存地址可以直观快速的获知要释放的空间对应的目标地址;
根据第一内存空间和目标索引,在目标索引匹配的索引信息中,即索引信息表示空闲状态的索引比特位中按照从低到高的顺序,搜索索引信息为1的位置,找到后,将该比特位设置为0,同时根据不同维度的索引的比特位之间的对应关系,对其它维度的索引的对应比特位进行赋值;
本实施例中,4K索引中2个比特位对应的内存空间对应于8K索引中1个比特位对应的内存空间;8K索引中2个比特位对应的内存空间对应于16K索引中1个比特位对应的内存空间;16K索引中2个比特位对应的内存空间对应32K索引中1个比特位对应的内存空间;以此类推;
比如,请求分配空间为19K,则取整后为20K,此时选择32K维度的索引;由于32K的索引维度其每个比特位都对应着32K的内存空间,所以需要分配20K内存时仅需将32K索引维度的最低地址第0个比特位进行索引信息改写,同时32K的第0个比特位对应着16K索引维度的第0、1两个比特位,16K的第0、1两个比特位又对应着8K索引维度的第0、1、2、3四个比特位,但20K在8K索引维度中只需要占用三个比特位即可,所以依据地址由低到高的顺序改写0、1、2三个比特位的索引信息,同理,8K索引维度的0、1、2三个比特位对应着4K索引维度的0、1、2、3、4、5六个比特位,而20K仅需5个比特位即可,依据地址由低到高的顺序改写0、1、2、3、4五个比特位的索引信息;
S3:接收内存释放请求,根据所述内存释放请求中的内存地址以及释放空间的大小按照所述维度从小到大的顺序依次更新所有能够释放所述释放空间的索引;
即从维度最小的索引开始,依次释放出满足所请求释放的空间大小并且又是整数个当前维度的比特位对应的空间;
比如要释放20K内存空间,其对应的内存地址是对应4K维度的索引中第8-12比特指向的的内存空间,则在进行释放时,先从4K维度索引开始,直接将8-12比特的比特位置为1;
然后判断8K索引是否有能够释放20K的与4K维度索引8-12比特对应的内存空间,以此列推,直至某个维度的索引无法释放位置;比如,如果到了64K维度的索引,由于20K是对应其第1个比特所指向的内存空间的后半部分地址的内存,而如果此时其第1个比特指向的内存空间的前半部分地址已经被分配了,则此时64K维度的就无法释放该20K内存空间;
实施例二
本实施例进一步限定了如何实现内存的快速分配:
所述根据所述内存空间大小对所述目标索引进行赋值,根据赋值结果对所有其它维度的索引进行对应赋值包括:
根据所述内存空间大小及所述目标索引每一位指向的内存空间大小在所述目标索引中按照预设顺序搜索与所述内存空间大小适配的并且值为第一预设值的第一目标比特位集合;
将所述第一目标比特位集合中的每一个第一目标比特位设置为第二预设值;
根据所述第一目标比特位集合以及其它索引的维度与所述目标索引的维度的关系在每一个其它索引中确定对应的第二目标比特位集合并将所述第二目标比特位集合中的每一个第二目标比特位设置为第二预设值。
比如:
假设建立4K、8K、16K、32K、64K、128K的索引,第一次分配请求为7K,第二次分配请求为15K,第三次分配请求为3K,第四次分配请求为19K,则如图6所示,具体过程如下:
7K按照4K倍数取整结果为8K,选择8K索引维度进行索引信息更新,8K的每个比特位对应的内存大小为8K,即只需第0个比特位进行信息更新,同时对应的4K索引维度需要对0、1两个比特位进行更新,16K、32K、64K、128K中对第0个比特位进行更新;
15K按照4K倍数取整结果为16K,选择16K索引维度进行索引信息更新,16K的每个比特位对应的内存大小为16K,即需要提供一个比特位,由于第0个比特位用于分配7K,且剩余空间不足以分配15K的大小,所以16K索引需要对其第一个比特位进行信息更新,同时更新对应8K索引维度中的2、3两个比特位和4K中的4~7四个比特位,32K第0个比特位剩余空间足以分配15K,更高索引维度同理,即不需要更新比特位信息;
3K按照4K倍数取整结果为4K,选择4K索引维度进行索引信息更新,4K的每个比特位对应的内存大小为4K,即需要提供一个比特位,由于0~1已经进行过分配,索引按照低位置到高位置原则,选取第2个比特位进行信息更新,对应的8K中的第1个比特位进行更新,更高索引维度依旧是第0位,索引无需更新;
19K按照4K倍数取整结果为20K,选择32K索引维度进行信息更新,32K的每个比特位对应的内存大小为32K,即需要提供一个比特位,由于第0个比特位已经进行过分配,且剩余空间不足以分配19K大小,选取第1个比特位进行信息更新,32K的第一个比特位对应着16K的第2、3两个比特位,8K的4~7四个比特位,4K的8~14八个比特位,但19K在8K中仅需三个比特位就足够分配所以选择4~6比特位进行更新,4K中需要五个比特位分配,选择8~12比特位进行更新;
最终得到针对上面四次分配的需要更新的索引位如表1所示:
表1
分配大小 |
取整大小 |
4K |
8K |
16K |
32K |
64K |
128K |
7K |
8K |
0、1 |
0 |
0 |
0 |
0 |
0 |
15K |
16K |
4~7 |
2、3 |
1 |
0 |
0 |
0 |
3K |
4K |
2 |
1 |
0 |
0 |
0 |
0 |
19K |
20K |
8~12 |
4~6 |
2、3 |
1 |
0 |
0 |
实施例三
本实施例进一步限定了如何实现内存的快速释放:
所述根据所述内存释放请求中的内存地址以及释放空间的大小按照所述维度从小到大的顺序依次更新所有能够释放所述释放空间的索引包括:
根据所述内存释放请求中的内存地址以及释放空间的大小从最小维度的索引中确定与所述释放空间大小匹配并且值为所述第二预设值的第三目标比特位集合,将所述第三目标比特位集合中的每一个第三目标比特位设置为所述第一预设值;
根据所述第三目标比特位集合按照维度从小到大的顺序依次判断其它维度的索引是否存在能够释放所述释放空间大小的第四目标比特位集合,若是,则将所述第四目标比特位集合中的每一个第四目标比特位设置为所述第一预设值;
具体的,所述判断其它维度的索引是否存在能够释放所述释放空间大小的第四目标比特位集合包括:
判断当前维度的索引中与所述释放空间对应的已释放空间中最高内存地址对应的目标比特位的相邻比特位是否为所述第一预设值,若是,则比所述当前维度大的下一维度的索引存在能够释放所述释放空间大小的第四目标比特位集合,若否,则比所述当前维度大的下一维度的索引不存在能够释放所述释放空间大小的第四目标比特位集合;
组成所述索引的比特数组的高位指向高地址的内存;
所述目标比特位和所述相邻比特位组成所述下一维度的索引的一个索引比特位;
基于实施例二的内存分配过程,假设第一次要释放4K内存,第二次要释放20K内存,则如图7所示,具体过程如下:
释放内存为4K时,根据之前分配内存时返回的内存地址,确定之前分配内存大小为4K时候,在4K索引维度进行改写的比特位为第2个比特位,将第二比特位的信息由0改为1并判断与其相邻的且对应着同一个下一维度索引的比特位内存的比特位信息是否为1,如是则向下一级合并,对下一维度进行对应空间的释放,再判断合并后的高位的比特位与其相邻的且对应着同一个更高维度索引比特位内存的索引信息是否为1,如是则向下一级合并,直到无法合并为止,在本实施例中,4K的第2个比特位与其相邻且对应着同一个下一维度索引的比特位内存的比特位为第3个比特位,第3个比特位在实施例二进行分配时并未用到,所以其比特位信息为1,则需要合并到8K索引中的第一个比特位,将8K第一个比特位的信息由1改成0,此时8K第1个比特位相邻且对应着同一个高纬度索引的比特位为第0个比特位,比特位信息为0,所以无法合并,此时内存释放完成;
同理释放20K内存,检索到在4K索引维度进行改写的比特位为第8~12五个比特位,将8~12比特位的索引信息由0改为1,并向8K索引进行合并,改写8K中第4~6比特位的索引信息,再向16K索引进行合并,改写16K中第2~3位比特位的索引信息,最后向32K进行合并改写32K中第1位比特位的索引信息,此时无法再向下合并,内存释放完成;
最终确定出的需更新的索引位如表2所示:
表2
释放大小 |
4K |
8K |
16K |
32K |
64K |
128K |
4K |
2 |
1 |
/ |
/ |
/ |
/ |
20K |
8~12 |
4~6 |
2~3 |
1 |
/ |
/ |
在进行释放过程中,为了判断是否可以向下一级所以进行合并,可以通过如下算法来确定:
假设bit_array表示索引数组,pos表示本次释放更新的所有比特位置中的最高比特位对应的位置,buddy_pos表示需要检测pos的相邻比特位置,next_pos表示需要更新的下一级索引位置中的最高比特位对应的位置:
buddy_pos=((pos|1)&(~(pos&1))
next_pos=(bit_array[pos]&bit_array[buddy_pos])?pos>>1:Invalid
pos=next_pos
重复这个过程,依次更新所有的索引信息;
其中,|表示或运算,&表示与运算,~表示取反运算,通过buddy_pos所在式子的运算,就能够确定出与pos相邻的比特所在的位置,这个相邻的比特与pos组合对应的是下一级的一个比特位,如图7中,如果是4K索引中,位置2的相邻位就是3,因为2、3对应的是8K索引的一个索引比特;位置5相邻的比特则是4,因为4、5对应的才是8K索引的一个索引比特,只要将对应位置转换成二进制,然后代入上述公式即可以算出来。
将本实施例的内存管理方法与现有的Buddy内存管理方法进行对比如表3所示:
表3
通过对比可知,通过多维所有内存管理方式相较于现有的Buddy内存管理方法在管理结构开销、分配和释放速率以及使用的业务场景方面均具有显著的进步。
实施例四
请参照图3,一种内存管理装置,包括:
索引创建模块,根据预设值为所述内存建立多个索引,不同索引的维度不同,所述维度为所述预设值的倍数;
内存分配模块,接收内存分配请求,根据所述内存分配请求中的内存空间大小匹配对应维度的目标索引,根据所述内存空间大小对所述目标索引进行赋值,根据赋值结果对所有其它维度的索引进行对应赋值;
内存释放模块,接收内存释放请求,根据所述内存释放请求中的内存地址以及释放空间的大小按照所述维度从小到大的顺序依次更新所有能够释放所述释放空间的的索引。
实施例五
一种计算机可读存储介质,其上存储有程序,所述程序被处理器执行时实现上述实施例一至三中任意一个中的一种内存管理方法中的各个步骤。
实施例六
请参照图4,一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述实施例一至三中任意一个中的一种内存管理方法中的各个步骤。
综上所述,本发明提供了一种内存管理方法、装置、计算机可读存储介质及电子设备,在对内存空间进行管理时,根据预设值为所述内存建立多个比特数组组成的索引,在进行内存分配时,根据待分配的内存空间大小匹配对应维度的目标索引,对目标索引进行比特位赋值,并对所有其它索引进行对应比特位赋值,在进行内存释放时,根据所述内存释放请求中的内存地址以及释放空间的大小按照所述维度从小到大的顺序依次更新所有能够释放所述释放空间的的索引;通过为内存建立不同维度的多个索引,在内存分配和释放时均对每个索引进行对应的索引位操作,将伙伴算法的拆分和合并操作简化为对不同维度的索引位操作,只需要进行比特位操作,不需要进行拆分和合并,简化了内存分配和释放过程的操作,并且直接通过比特数组进行内存管理,也不需要对内存进行链表管理,不仅减少了内存管理结构的开销,而且不需要固件来实现,可以集成至硬件中实现,能够适用于各种业务场景,提升了用户不同业务场景下的性能。
在本申请所提供的上述实施例中,应该理解到,所揭露的方法、装置、计算机可读存储介质以及电子设备,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个组件或模块可以结合或者可以集成到另一个装置,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或组件或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的组件可以是或者也可以不是物理上分开的,作为组件显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部组件来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个组件单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该软件产品存储在一个存储介质中,包括若干指令用以使得设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本发明所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等同变换,或直接或间接运用在相关的技术领域,均同理包括在本发明的专利保护范围内。