CN117112215A - 内存分配方法、设备及存储介质 - Google Patents

内存分配方法、设备及存储介质 Download PDF

Info

Publication number
CN117112215A
CN117112215A CN202311085520.2A CN202311085520A CN117112215A CN 117112215 A CN117112215 A CN 117112215A CN 202311085520 A CN202311085520 A CN 202311085520A CN 117112215 A CN117112215 A CN 117112215A
Authority
CN
China
Prior art keywords
bit
memory
bitmap
offset
determining
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
Application number
CN202311085520.2A
Other languages
English (en)
Inventor
张逸飞
陆传胜
季向东
王德宇
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Volcano Engine Technology Co Ltd
Original Assignee
Beijing Volcano Engine Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Volcano Engine Technology Co Ltd filed Critical Beijing Volcano Engine Technology Co Ltd
Priority to CN202311085520.2A priority Critical patent/CN117112215A/zh
Publication of CN117112215A publication Critical patent/CN117112215A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本公开实施例提供一种内存分配方法、设备及存储介质,通过对待分配内存的第一线程分配预设大小的第一内存空间,并配置与所述第一内存空间存在映射关系的第一位图;根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,并基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识。通过在第一内存空间中为每一待分配内存的对象连续分配内存,提高对象分配性能,且无需在对象起始位置额外分配内存保存对象的元数据,节省了内存开销,利用更紧凑的位图存储对象的内存起始地址信息,指针可以指向对象内存的任意位置,从而支持指针运算。

Description

内存分配方法、设备及存储介质
技术领域
本公开实施例涉及计算机与网络通信技术领域,尤其涉及一种内存分配方法、设备及存储介质。
背景技术
内存管理是程序运行时系统的重要组成部分,主要负责运行时的内存分配和回收。在程序中,绝大多数内存分配的请求来自于程序中的对象分配,即为对象分配对应的内存空间。由于对象分配是非常高频的操作,对象分配的性能会极大地影响程序的性能。
内存管理的形式决定了对象分配的形式和效率,然而现有技术中对象分配的性能不高。
发明内容
本公开实施例提供一种内存分配方法、设备及存储介质,以提高对象分配性能。
第一方面,本公开实施例提供一种内存分配方法,包括:
对待分配内存的第一线程分配预设大小的第一内存空间,并配置与所述第一内存空间存在映射关系的第一位图;
根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,并基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识。
第二方面,本公开实施例提供一种内存分配设备,包括:
分配单元,对待分配内存的第一线程分配预设大小的第一内存空间,并配置与所述第一内存空间存在映射关系的第一位图;根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存;
处理单元,用于基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识。
第三方面,本公开实施例提供一种电子设备,包括:至少一个处理器和存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如上第一方面以及第一方面各种可能的设计所述的内存分配方法。
第四方面,本公开实施例提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上第一方面以及第一方面各种可能的设计所述的内存分配方法。
第五方面,本公开实施例提供一种计算机程序产品,包括计算机执行指令,当处理器执行所述计算机执行指令时,实现如上第一方面以及第一方面各种可能的设计所述的内存分配方法。
本公开实施例提供的内存分配方法、设备及存储介质,通过对待分配内存的第一线程分配预设大小的第一内存空间,并配置与所述第一内存空间存在映射关系的第一位图;根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,并基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识。通过在第一内存空间中为每一待分配内存的对象连续分配内存,提高对象分配性能,有利于对象的连续访问,且无需在对象起始位置额外分配内存保存对象的元数据,节省了内存开销,提升程序访存的性能,利用更紧凑的位图存储对象的内存起始地址信息,可以快速确定对象的元数据,指针可以指向对象内存的任意位置,从而支持指针运算,保证代码的高效和简洁。
附图说明
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1a为现有技术中一种内存分配方法的示例图;
图1b为现有技术中另一种内存分配方法的示例图;
图2为本公开一实施例提供的内存分配方法的示意图;
图3为本公开一实施例提供的内存分配方法流程示意图;
图4为本公开另一实施例提供的内存分配方法的示意图;
图5为本公开另一实施例提供的内存分配方法的示意图;
图6a-d为本公开一实施例提供的确定目标对象的元数据的示意图;
图7为本公开一实施例提供的内存分配设备的结构框图;
图8为本公开一实施例提供的电子设备的硬件结构示意图。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
内存管理的形式决定了对象分配的形式和效率。
例如,一种分块内存分配器的分配方式是:向操作系统分配一大块内存,再将大块内存分成不同的组,不同的组用于分配不同大小的对象,同一个组内的内存被划分为大小相同的内存块。与此同时,内存管理系统会记录每个内存组的元数据,例如该内存组的起始和结束地址、分配对象的大小等。
如图1a所示,从操作系统获得的内存被分为了三组,分别用于分配8B,16B和24B的对象。每一组的内存被划分成大小相等的内存块,其中灰色表示内存块已经被分配,白色表示空闲块。当程序需要分配对象时,首先获取对象的大小;根据大小找到对应的内存组并从中获取空闲块,返回空闲块的起始地址,即完成了一次对象分配。
这种分配方式的优点是:结合指向对象的指针和内存组的元数据,就可以获取对象的元数据,例如对象的起始和结束地址、对象的大小等,方便内存管理。同时,由于对象元数据是在分配时确定的,不需要通过指针类型来确定对象的类型,这种内存管理形式也给语言带来了自由度,语言可以支持指针运算,例如将指向对象的指针通过指针运算转换成指向其中某个域的指针,从而写出更高效的程序。但是,这种分配方式的缺点也很明显。由于分配对象的操作较多,需要根据对象大小找到对应内存组,再在内存组中找到空闲块,导致对象分配的效率不高。
此外,另外一种内存分配器着眼于更高效的对象分配。分配器会给每个线程分配一个较大对象分配缓冲区,并在其中连续分配对象。如图1b所示,base和end分别表示该对象分配缓冲区的起始和结束地址;top表示当前使用到的位置,top左侧是已经分配的内存,top右侧是待分配的内存,虚线表示对象的分界线,ptr是指向对象的指针。在这样的对象分配缓冲区中分配对象非常高效。根据对象大小s,移动top指针到top+s的位置,返回移动前top的地址,即完成了一次分配。因此,这种内存分配器会在一个对象分配缓冲区中连续分配大小不一的对象。在这种场景下,会在对象起始位置额外分配内存来保存对象的元数据。在图1b中,对象起始位置灰色的部分表示对象上保存的元数据。同时指向对象的指针只能指向对象特定的位置,从而准确获取到对象元数据。这种方式的缺点是:需要额外的空间存储对象元数据,同时要求指针指向对象特定的位置(指向对象内存起始地址),不支持指针运算。
为了解决上述技术问题,本公开提供一种内存分配方法,通过对待分配内存的第一线程分配预设大小的第一内存空间,并配置与所述第一内存空间存在映射关系的第一位图,例如如图2所示;根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,并基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识。通过在第一内存空间中为每一待分配内存的对象连续分配内存,提高对象分配性能,有利于对象的连续访问,且无需在对象起始位置额外分配内存保存对象的元数据,节省了内存开销,提升程序访存的性能,利用更紧凑的位图存储对象的内存起始地址信息,可以快速确定对象的元数据,由于对象内存是连续的、且内存中无对象的元数据,因此指针可以指向对象内存的任意位置,从而支持指针运算,保证代码的高效和简洁。
下面将结合具体实施例对本公开的内存分配方法进行详细介绍。
参考图3,图3为本公开一实施例提供的内存分配方法流程示意图。本实施例的方法可以应用在终端设备或服务器中,该内存分配方法包括:
S201、对待分配内存的第一线程分配预设大小的第一内存空间,并配置与所述第一内存空间存在映射关系的第一位图。
在本实施例中,对于程序对象连续分配内存的第一线程,在需要分配第一线程中各对象的内存时,可以对第一线程分配一个预设大小的第一内存空间(或称之为缓冲区),第一内存空间可以是一个较大的内存空间,例如其预设大小可以为1KB,第一线程的对象会在第一内存空间中连续分配内存。
而为了方便确定每个对象的元数据,也即对象内存相关信息,包括内存起始地址、内存结束地址、以及内存大小等,且不需要将元数据也与对象一起存储在内存中,且能够支持指针运算,本实施例中另外配置了与第一内存空间存在映射关系的位图(Bitmap),记为第一位图,其中位图的最小单元是一个bit,可以有1或0两种取值,其中第一位图的初始值为0,其中映射关系是为了将第一内存空间映射到第一位图中,尤其是将第一内存空间的特定大小的空间映射到第一位图中,以便于以第一位图来反映第一内存空间的存储情况。其中映射关系可以是任意映射关系,只要能够将第一内存空间的特定大小的空间映射到第一位图中即可,例如可以依次对应,或者按照某种指定的顺序对应。
可选的,映射关系为:第一位图中的每一位依次与内存空间的预设数量n个字节(Byte)相对应,例如第一内存空间每8个字节(Byte)对应第一位图中的1个比特位(bit),而若第一内存空间为1KB,则第一位图大小为1KB/8=128bit=16B,也即第一位图共有128个比特位,占用16字节的空间。
在第一种可选实施例中,第一内存空间和第一位图的对应关系可如图2所示,第一内存空间的起始n字节与第一位图的最后一个比特位对齐,第一内存空间的第2个n字节与第一位图的倒数第二个比特位对齐,以此类推,第一内存空间的最后n字节与第一位图的第一个比特位对齐。也即,在图2中,第一内存空间的头部(起始位置base)在左,尾部(结束位置end)在右,而第一位图的头部在右,尾部在左。
在第二种可选实施例中,第一内存空间和第一位图的对应关系可如图4所示,第一内存空间的起始n字节与第一位图的第一个比特位对齐,第一内存空间的第2个n字节与第一位图的第二个比特位对齐,以此类推,第一内存空间的最后n字节与第一位图的最后一个比特位对齐。也即,在图4中,第一内存空间的头部(起始位置base)在左,尾部(结束位置end)在右,而第一位图的头部在左,尾部在右。
下述实施例中以第一种可选实施例作为示例进行说明,第二种可选实施例与第一种可选实施例类似,进行适应性的变化即可,此处不做赘述。当然本实例中映射关系并不限于上述举例,其他映射关系亦可。
S202、根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,并基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识。
在本实施例中,根据第一线程中每一待分配内存的对象的大小在第一内存空间中连续分配内存,从而实现内存的连续分配,并且对每一对象分配的内存大小与对象的大小相同,或大于对象的大小。
本实施例中,在对象的内存中不需要存储对象的元数据(包括内存起始地址、内存结束地址、以及内存大小等),而是利用第一内存空间与第一位图之间的映射关系,将每一对象的内存起始地址在第一位图中进行标识。
尤其是基于映射关系,将第一内存空间与第一位图中的比特位进行对齐,进而可以基于映射关系确定每一对象的内存起始地址在第一位图中对应的比特位,可将该比特位设置为1,后续可以利用映射关系基于值为1的比特位反推每一对象的内存起始地址,由于对象的内存连续分配,也可以反推每一对象的内存结束地址,进而也可以确定对象大小。
本实施例提供的内存分配方法,通过对待分配内存的第一线程分配预设大小的第一内存空间,并配置与所述第一内存空间存在映射关系的第一位图;根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,并基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识。通过在第一内存空间中为每一待分配内存的对象连续分配内存,提高对象分配性能,有利于对象的连续访问,且无需在对象起始位置额外分配内存保存对象的元数据,节省了内存开销,提升程序访存的性能,利用更紧凑的位图存储对象的内存起始地址信息,可以快速确定对象的元数据,指针可以指向对象内存的任意位置,从而支持指针运算,保证代码的高效和简洁。
在上述实施例的基础上,若第一内存空间与第一位图之间的映射关系为第一位图中的每一比特位依次与第一内存空间的预设数量的字节相对应,在此基础上,S202具体可包括:
将所述第一位图的所有比特位清零;
根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,且每一对象的内存大小为所述预设数量的倍数;
将每一所述对象的内存起始地址在所述第一位图中对应的比特位设置为1。
在本实施例中,在第一内存空间中首次对第一线程的对象分配内存前,或者也可在配置与第一内存空间存在映射关系的第一位图时,可以将第一位图的所有比特位清零,以避免对后续标识过程产生影响。
在对任一对象分配内存时,所分配的每一对象的内存为预设数量n的倍数(包括1倍、2倍等),可以确定该对象在第一内存空间中的起始地址,所有对象的内存起始地址都是预设数量n的倍数,例如n为8,则所有对象的内存起始地址都是8的倍数,这样可以根据对象的内存起始地址确定第一位图中对应的比特位,将该比特位设置为1,也即说明此比特位对应对象的内存起始地址。
其中,在根据对象的内存起始地址确定第一位图中对应的比特位时,可确定对象的内存起始地址对应比特位在第一位图中所在字节,具体的,可以将对象的内存起始地址减去第一内存空间起始地址,再除以n,确定内存起始地址在第一位图中对应第m个比特位(也即在第一位图中的偏移量),比特位在第一位图中所在字节为第m/8个字节(其中8bit=1Byte),在第一位图的起始地址基础上加上m/8,可定位对象的内存起始地址对应比特位所在字节的地址,在该字节中通过位运算的方式将对象的内存起始地址对应比特位设置为1。
当然,将每一对象的内存起始地址在第一位图中进行标识的方式并不限于上述举例,采用其他方式亦可。
在上述任一实施例的基础上,所述根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,具体可包括:
在对任一对象分配内存前,判断所述第一内存空间的未使用内存是否满足该对象的大小;
若所述第一内存空间的未使用内存满足该对象的大小,则根据该对象的大小从未使用内存的起始地址开始分配内存。
在本实施例中,由于已经为第一线程分配了一个预设大小的第一内存空间,而第一内存空间是有限的,第一线程中的待分配内存的对象存在多个,因此第一内存空间可能会出现存满的情况,在对任一待分配内存的对象分配内存前,先判断第一内存空间的未使用内存是否满足该对象的大小,若满足该对象的大小,说明第一内存空间的未使用内存比较充足,可以在第一内存空间中继续为该对象分配内存,也即根据该对象的大小从未使用内存的起始地址开始分配内存。
其中判断第一内存空间的未使用内存是否满足该对象的大小,可以通过将第一内存空间未使用内存的起始地址与该对象的大小相加,判断相加结果是否超过第一内存空间的结束地址,如果超过,则说明第一内存空间的未使用内存不满足该对象的大小。
如图5所示,若第一内存空间的未使用内存不满足该对象的大小,则对未使用内存的起始地址在第一位图中对应位设置为1,也即将未使用内存作为一个空对象,将空对象的内存起始地址在第一位图中对应位设置为1(以在第一位图中作为与前一对象的边界),并舍弃未使用内存,并重新分配预设大小的第二内存空间(其中第二内存空间的大小可以等于第一内存空间的大小,也可大于或小于的大小,可选的,可以按照一定规则递增),并配置与第二内存空间存在映射关系的第二位图(第二内存空间与第二位图之间的映射关系可以与上述实施例中的映射关系相同,也可不同);根据所述第一线程中每一待分配内存的对象的大小在所述第二内存空间中连续分配内存,并基于映射关系将每一对象的内存起始地址在第二位图中进行标识,其过程同上述实施例,此处不再赘述,同样的,对于第二内存空间和第二位图,下述的其他过程也与第一内存空间和第一位图相同,下述的其他过程仅以第一内存空间和第一位图作为示例进行说明。
在上述任一实施例的基础上,上述的内存分配方法支持指针运算,包括但不限于指针的算术运算(如加减)、关系运算(如比较两个指针大小、是否相等),指针可以指向对象的内存的任意位置,因此需要基于指针确定所指向对象的元数据,包括但不限于对象内存起始地址、内存结束地址、以及内存大小中的至少一项,其具体过程如下:
确定指向所述第一内存空间中任一目标对象的内存范围内的指针的地址;
根据所述指针的地址以及所述第一位图,确定所述目标对象的元数据。
在本实施例中,若某个指针指向第一内存空间中任一目标对象的内存范围内,包括目标对象的内存起始地址、内存结束地址、或者内存起始地址与内存结束地址之间的任意地址,可以先确定指针所指向的地址,也即指针的地址。由于第一位图中包含各对象的起始地址信息,因此,基于指针的地址可以指定目标对象,再结合第一位图可以推理出目标对象的元数据,包括但不限于目标对象的内存起始地址、内存结束地址、以及内存大小中的至少一项。
具体的,在根据所述指针的地址以及所述第一位图,确定所述目标对象的元数据时,可包括:
首先,确定所述指针的地址在所述第一位图中对应的第一比特位。
在本实施例中,由于第一内存空间每预设数量n个字节对应第一位图中的一个比特位,因此在确定指针的地址在第一位图中对应的比特位(记为第一比特位)时,只要确定指针所在n个字节中的第一个字节在第一位图中对应的比特位即可,而指针所在n个字节中的第一个字节的地址可以通过将指针的地址的低log2n位清零得到,假设预设数量n为8,则将指针的地址的低3位清零,得到指针所在n个字节中的第一个字节的地址,进而确定指针所在n个字节中的第一个字节在第一位图中对应的比特位,作为指针的地址在第一位图中对应的第一比特位。具体的,第一比特位在第一位图中的位置=(指针所在n个字节中的第一个字节的地址-第一内存空间的起始地址)/n,或者也可以是(指针的地址-第一内存空间的起始地址)/n,并取整。
进一步的,确定目标对象的内存起始地址、内存结束地址、以及内存大小的过程分别如下。
其中,确定目标对象的内存起始地址的过程如下:
在所述第一位图中向头部方向寻找所述第一比特位最近的数值为1的第二比特位,确定所述第一比特位与所述第二比特位之间的第一偏移量,根据所述第一偏移量以及所述预设数量,确定所述目标对象的内存起始地址与所述指针的地址之间的第一内存偏移量;根据所述指针的地址和所述第一内存偏移量,确定所述目标对象的内存起始地址。
在本实施例中,在确定指针的地址在第一位图中对应的第一比特位后,在第一位图中向头部方向寻找第一比特位最近的数值为1的第二比特位,第二比特位对应目标对象的内存起始地址,其中对于上述实施例中的图2,头部方向为右侧方向,也即在第一位图中在第一比特位右侧寻找最近的数值为1的第二比特位;对于图4,头部方向为左侧方向,也即在第一位图中在第一比特位左侧寻找最近的数值为1的第二比特位。
获取第一比特位与第二比特位之间的第一偏移量,也即第一比特位和第二比特位之间存在的比特位数量,对应的,也就能确定在第一内存空间中目标对象的内存起始地址与指针的地址(指针所在n个字节中的第一个字节的地址)之间存在的字节数=第一偏移量×预设数量n,也即第一内存偏移量,根据指针的地址和第一内存偏移量,可确定目标对象的内存起始地址,具体的,目标对象的内存起始地址=指针所在n个字节中的第一个字节的地址-第一内存偏移量。
确定目标对象的内存结束地址的过程如下:
在所述第一位图中向尾部方向寻找所述第一比特位最近的数值为1的第三比特位,确定所述第一比特位与所述第三比特位之间的第二偏移量,根据所述第二偏移量以及所述预设数量,确定所述目标对象的结束起始地址与所述指针的地址之间的第二内存偏移量;根据所述指针的地址和所述第二内存偏移量,确定所述目标对象的内存结束地址。
在本实施例中,与上述确定目标对象的内存起始地址的过程类似,在确定指针的地址在第一位图中对应的第一比特位后,在第一位图中向尾部方向寻找第一比特位最近的数值为1的第三比特位,第三比特位对应目标对象相邻的下一对象的内存起始地址,也是目标对象的内存结束地址,其中对于上述实施例中的图2,尾部方向为左侧方向,也即在第一位图中在第一比特位左侧寻找最近的数值为1的第三比特位;对于图4,尾部方向为右侧方向,也即在第一位图中在第一比特位右侧寻找最近的数值为1的第三比特位。
获取第一比特位与第三比特位之间的第二偏移量,也即第一比特位和第三比特位之间存在的比特位数量,对应的,也就能确定在第一内存空间中目标对象的结束地址与指针的地址(指针所在n个字节中的第一个字节的地址)之间存在的字节数=第二偏移量×预设数量n,也即第二内存偏移量,根据指针的地址和第二内存偏移量,可确定目标对象的内存结束地址,具体的,目标对象的内存结束地址=指针所在n个字节中的第一个字节的地址+第二内存偏移量。
确定目标对象的内存大小的过程如下:
根据所述目标对象的内存起始地址和所述目标对象的内存结束地址,确定所述目标对象的内存大小。
在上述实施例的基础上,所述确定所述指针的地址在所述第一位图中对应的第一比特位,包括:
确定所述第一比特位在所述第一位图中所在字节,并读取该字节对应的第一部分位图,在所述第一部分位图中确定所述第一比特位。
在本实施例中,由于第一位图可能比较大,因此在根据第一位图确定目标对象的元数据时,无需读取整个第一位图,而是只需要读取第一位图中第一比特位所在的一个字节即可,记为第一部分位图,第一部分位图包括8个比特位(1Byte=8bit),在第一部分位图中确定第一比特位,以及基于第一比特位进行后续第二比特位和第三比特位的寻找。
其中,确定所述第一比特位在所述第一位图中所在字节,可以先确定第一比特位在整个第一位图中是第几个比特位,其具体过程如上述实施例所述,确定指针所在n个字节中的第一个字节在第一位图中对应的比特位即可,第一比特位在第一位图中的位置=(指针所在n个字节中的第一个字节的地址-第一内存空间的起始地址)/n。进一步的,由于第一位图每8个比特位为一个字节,因此可以确定第一比特位在第一位图中所在字节的地址=第一位图的起始地址+(第一比特位在第一位图中的位置/8),进而根据第一比特位在第一位图中所在字节的地址从第一位图中读取该字节,得到第一部分位图。
而第一比特位在第一部分位图中的位置为第一比特位在第一位图中的位置%8(也即对8取余)。
进一步的,所述在所述第一位图中向头部方向寻找所述第一比特位最近的数值为1的第二比特位,确定所述第一比特位与所述第二比特位之间的第一偏移量,具体可包括:
确定所述第一比特位相对于所述第一部分位图尾部的第三偏移量;
判断所述第一部分位图中是否存在所述第二比特位;
若确定所述第一部分位图中存在所述第二比特位,则确定所述第二比特位相对于所述第一部分位图尾部的第四偏移量;根据所述第三偏移量和所述第四偏移量,确定所述第一比特位与所述第二比特位之间的第一偏移量;或者
若确定所述第一部分位图中不存在所述第二比特位,则沿头部方向读取相邻字节对应的部分位图,直至查找到存在所述第二比特位的第二部分位图,并确定所述第二比特位相对于所述第二部分位图尾部的第五偏移量;根据所述第五偏移量确定所述第二比特位相对于所述第一部分位图尾部的第六偏移量;根据所述第三偏移量和所述第六偏移量,确定所述第一比特位与所述第二比特位之间的第一偏移量。
在本实施例中,在第一部分位图中确定第一比特位后,可以确定第一比特位相对于第一部分位图尾部的第三偏移量,也即第一比特位到第一部分位图尾部之间存在几个比特位,其中第一部分位图头部、尾部的概念同上述实施例。
此外,考虑到对象的内存可能较大,导致在第一位图中跨多个字节,而由于第一部分位图只是第一位图的一个字节,第一位图中第一比特位向头部方向的第二比特位可能在第一部分位图中,也可能不在第一部分位图中,因此还需要判断第一部分位图中是否存在第二比特位,若确定第一部分位图中存在第二比特位,则确定第二比特位相对于第一部分位图尾部的第四偏移量,也即第二比特位到第一部分位图尾部之间存在几个比特位,将第四偏移量减去第三偏移量得到第一比特位与第二比特位之间的第一偏移量;若确定第一部分位图中不存在第二比特位,则沿头部方向依次读取相邻字节对应的部分位图,同样需要依次判断相邻字节对应的部分位图中是否存在第二比特位,若第一个相邻字节对应的部分位图中不存在第二比特位,则继续读下一个相邻字节对应的部分位图,以此类推,直至查找到存在第二比特位的部分位图,记为第二部分位图,进一步确定第二比特位相对于第二部分位图尾部的第五偏移量,而由于第三偏移量是以第一部分位图尾部为基准,而第五偏移量是以第二部分图尾部为基准,因此需要将第五偏移量转换为以第一部分位图尾部为基准,得到第二比特位相对于第一部分位图尾部的第六偏移量,这样将第六偏移量减去第三偏移量得到第一比特位与第二比特位之间的第一偏移量。具体的,在确定第六偏移量时,可获取第二部分位图尾部与第一部分位图尾部之间的比特位数量,将第五偏移量与该比特位数量相加,得到第六偏移量。
在上述实施例的基础上,可通过位运算的方式实现上述确定偏移量的过程,具体过程如下:
第一部分位图中确定第一比特位,可根据第一比特位在第一部分位图中的位置构建第一掩码,所述第一掩码的长度与所述第一部分位图相同,且所述第一比特位对应的位置为1,其余位置为0。
例如对于图6a,预设数量n=8,指针指向第一内存空间(起始地址base,结束地址end,假设base=0)中第30个字节,也即指针的地址为ptr=(30)10=(11110)2,指针所在8个字节中的第一个字节的地址p=(24)10=(11000)2(ptr的低log28位清零),第一比特位在第一位图中的位置index=(ptr-base)/n=3(取整),假设第一位图的地址为由x至y,其中第一部分位图的地址bytep=x+(index/8)=x,而第一比特位在第一部分位图中的位置=index%8=3%8=3,构建第一掩码mask1=1<<(index%8)=1<<(3%8)=1<<3=00001000。
进一步的,在所述第一掩码中确定在1朝向所述第一掩码尾部方向存在0的数量,也即1左侧0的数量,确定为第一比特位相对于第一部分位图尾部的第三偏移量。其中可通过CPU中预设指令leadingZeros(a)实现,其中leadingZeros(a)是计算a中开头连续0的个数,因此第三偏移量=leadingZeros(mask1)=4。
在判断所述第一部分位图中是否存在所述第二比特位时,具体可包括:
构建第二掩码,所述第二掩码的长度与所述第一部分位图相同,且所述第二掩码尾部预设位数的位置为0,其余位置为1,预设数量为第三偏移量;
在上述示例中,第二掩码mask2=00001111,可通过如下方式得到,mask2=0xFF>>第三偏移量=00001111(也即将11111111右移第三偏移量)。
进一步的,将第二掩码与第一部分位图进行按位与运算,运算结果bt=*bytep&mask2=01100011&00001111=00000011,若运算结果bt不为0,则说明第一部分位图中存在第二比特位,运算结果bt尾部的第一个1就对应第二比特位的位置;若运算结果bt为0,则说明第一部分位图中不存在第二比特位。
若运算结果bt不为0,则确定运算结果bt中尾部存在0的数量,也即第二比特位朝向运算结果尾部方向存在0的数量,确定为第四偏移量,第四偏移量=leadingZeros(bt)=6。进而第一比特位与第二比特位之间的第一偏移量=第四偏移量-第三偏移量=6-4=2。
若运算结果bt为0,则如图6b所示,沿头部方向(向右)读取相邻字节对应的部分位图,并判断该部分位图是否为0,若确定该部分位图不为0,则记为第二部分位图,并确定第二部分位图中存在第二比特位;进而确定第二部分位图尾部存在0的数量,确定为第二比特位相对于第二部分位图尾部的第五偏移量;第二部分位图尾部与第一部分位图尾部之间的比特位数量为8,将第五偏移量与该比特位数量相加(也即第五偏移量+8),得到第二比特位相对于第一部分位图尾部的第六偏移量。进而第一比特位与第二比特位之间的第一偏移量=第六偏移量-第三偏移量。
若确定相邻字节对应的部分位图为0,则沿头部方向(向右)继续读取下一相邻字节对应的部分位图,若确定该部分位图不为0,则将该部分位图记为第二部分位图,同样确定该第二部分位图尾部存在0的数量,确定为第二比特位相对于该第二部分位图尾部的第五偏移量;第二部分位图尾部与第一部分位图尾部之间的比特位数量为8*2(也即2个字节),在第五偏移量与该比特位数量相加(也即第五偏移量+8*2),得到第二比特位相对于第一部分位图尾部的偏移量,与第三偏移量相减得到第一比特位与第二比特位之间的第一偏移量。以此类推,此处不再赘述。
在上述实施例的基础上,所述在所述第一位图中向尾部方向寻找所述第一比特位最近的数值为1的第三比特位,确定所述第一比特位与所述第三比特位之间的第二偏移量,包括:
确定所述第一比特位相对于所述第一部分位图头部的第七偏移量;
判断所述第一部分位图中是否存在所述第三比特位;
若确定所述第一部分位图中存在所述第三比特位,则确定所述第三比特位相对于所述第一部分位图头部的第八偏移量;根据所述第七偏移量和所述第八偏移量,确定所述第一比特位与所述第三比特位之间的第二偏移量;或者
若确定所述第一部分位图中不存在所述第三比特位,则沿尾部方向依次读取相邻字节对应的部分位图,直至查找到存在所述第三比特位的第三部分位图,并确定所述第三比特位相对于所述第三部分位图头部的第九偏移量;根据所述第九偏移量确定所述第三比特位相对于所述第一部分位图头部的第十偏移量;根据所述第七偏移量和所述第十偏移量,确定所述第一比特位与所述第三比特位之间的第二偏移量。
在本实施例中,在第一部分位图中确定第一比特位后,可以确定第一比特位相对于第一部分位图头部的第七偏移量,也即第一比特位到第一部分位图头部之间存在几个比特位,其中第一部分位头部、尾部的概念同上述实施例。
同样,由于对象的内存可能较大,导致在第一位图中跨多个字节,第一位图中第一比特位向尾部方向的第三比特位可能在第一部分位图中,也可能不在第一部分位图中,因此还需要判断第一部分位图中是否存在第三比特位,若确定第一部分位图中存在第三比特位,则确定第三比特位相对于第一部分位图头部的第八偏移量,也即第三比特位到第一部分位图头部之间存在几个比特位,将第八偏移量减去第七偏移量得到第一比特位与第三比特位之间的第二偏移量;若确定第一部分位图中不存在第三比特位,则沿尾部方向依次读取相邻字节对应的部分位图,同样需要依次判断相邻字节对应的部分位图中是否存在第三比特位,若第一个相邻字节对应的部分位图中不存在第三比特位,则继续读下一个相邻字节对应的部分位图,以此类推,直至查找到存在第三比特位的部分位图,记为第三部分位图,进一步确定第三比特位相对于第三部分位图头部的第九偏移量,而由于第七偏移量是以第一部分位图头部为基准,而第九偏移量是以第三部分图头部为基准,因此需要将第九偏移量转换为以第一部分位图头部为基准,得到第三比特位相对于第一部分位图头部的第十偏移量,这样将第十偏移量减去第七偏移量得到第一比特位与第三比特位之间的第二偏移量。具体的,在确定第十偏移量时,可获取第三部分位图头部与第一部分位图头部之间的比特位数量,将第九偏移量与该比特位数量相加,得到第十偏移量。
在上述实施例的基础上,可通过位运算的方式实现上述确定偏移量的过程,具体过程如下:
如图6c,上述示例中,构建第一掩码mask1=00001000(若第一掩码在之前已构建,则此处无需重复构建),在所述第一掩码中确定在1朝向所述第一掩码头部方向存在0的数量,也即1右侧0的数量,确定为第一比特位相对于第一部分位图头部的第七偏移量。其中可通过CPU中预设指令trailingZeros(a)实现,其中trailingZeros(a)是计算a中结尾连续0的个数,因此第七偏移量=trailingZeros(mask1)=3。
在判断所述第一部分位图中是否存在所述第三比特位时,具体可包括:
构建第三掩码,所述第三掩码的长度与所述第一部分位图相同,且所述第三掩码头部预设位数的位置为0,其余位置为1,预设数量为所述第七偏移量加1;
在上述示例中,第三掩码mask3=11110000,可通过如下方式得到,mask2=0xFF<<(第七偏移量+1)=11110000(也即将11111111左移第七偏移量+1)。
进一步的,将第三掩码与第一部分位图进行按位与运算,运算结果bt=*bytep&mask3=01100011&11110000=01100000,若运算结果bt不为0,则说明第一部分位图中存在第三比特位,运算结果bt头部的第一个1就对应第三比特位的位置;若运算结果bt为0,则说明第一部分位图中不存在第三比特位。
若运算结果bt不为0,则确定运算结果bt中头部存在0的数量,也即第三比特位朝向运算结果头部方向存在0的数量,确定为第八偏移量,第八偏移量=trailingZeros(bt)=5。进而第一比特位与第三比特位之间的第二偏移量=第八偏移量-第七偏移量=5-3=2。
若运算结果bt为0,则如图6d所示,沿尾部方向(向左)读取相邻字节对应的部分位图,并判断该部分位图是否为0,若确定该部分位图不为0,则记为第三部分位图,并确定第三部分位图中存在第三比特位,进而确定第三部分位图头部存在0的数量,确定为第三比特位相对于第三部分位图头部的第九偏移量;第三部分位图头部与第一部分位图头部之间的比特位数量为8,将第九偏移量与该比特位数量相加(也即第九偏移量+8),得到第三比特位相对于第一部分位图头部的第十偏移量。进而第一比特位与第三比特位之间的第二偏移量=第十偏移量-第七偏移量。
若确定相邻字节对应的部分位图为0,则沿尾部方向(向左)继续读取下一相邻字节对应的部分位图,若确定该部分位图不为0,则将该部分位图记为第三部分位图,同样确定该第三部分位图头部存在0的数量,确定为第三比特位相对于该第三部分位图头部的第九偏移量;第三部分位图头部与第一部分位图头部之间的比特位数量为8*2(也即2个字节)在第九偏移量与该比特位数量相加(也即第九偏移量+8*2),得到第三比特位相对于第一部分位图头部的偏移量,与第七偏移量相减得到第一比特位与第三比特位之间的第二偏移量。以此类推,此处不再赘述。
对应于上文实施例的内存分配方法,图7为本公开实施例提供的内存分配设备的结构框图。为了便于说明,仅示出了与本公开实施例相关的部分。参照图7,所述内存分配设备700包括:分配单元701和处理单元702。
其中,分配单元701,用于对待分配内存的第一线程分配预设大小的第一内存空间,并配置与所述第一内存空间存在映射关系的第一位图;根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存;
处理单元702,用于基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识。
在本公开的一个或多个实施例中,所述映射关系为:所述第一位图中的每一比特位依次与所述第一内存空间的预设数量的字节相对应;
所述分配单元701在根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存时,用于将所述第一位图的所有比特位清零;根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,且每一对象的内存大小为所述预设数量的倍数;
所述处理单元702在基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识时,用于将每一所述对象的内存起始地址在所述第一位图中对应的比特位设置为1。
在本公开的一个或多个实施例中,所述分配单元701在根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存时,用于:
在对任一对象分配内存前,判断所述第一内存空间的未使用内存是否满足该对象的大小;
若所述第一内存空间的未使用内存满足该对象的大小,则根据该对象的大小从未使用内存的起始地址开始分配内存。
在本公开的一个或多个实施例中,所述分配单元701还用于,若所述第一内存空间的未使用内存不满足该对象的大小,则对未使用内存的起始地址在所述第一位图中对应位设置为1,并重新分配预设大小的第二内存空间,并基于映射关系将每一所述对象的内存起始地址在所述第二位图中进行标识;根据所述第一线程中每一待分配内存的对象的大小在所述第二内存空间中连续分配内存;
所述处理单元702还用于,基于映射关系将每一所述对象的内存起始地址在所述第二位图中进行标识。
在本公开的一个或多个实施例中,所述处理单元702还用于:
确定指向所述第一内存空间中任一目标对象的内存范围内的指针的地址;
根据所述指针的地址以及所述第一位图,确定所述目标对象的元数据,其中所述元数据包括内存起始地址、内存结束地址、以及内存大小中的至少一项。
在本公开的一个或多个实施例中,所述处理单元702在根据所述指针的地址以及所述第一位图,确定所述目标对象的元数据时,用于:
确定所述指针的地址在所述第一位图中对应的第一比特位;
在所述第一位图中向头部方向寻找所述第一比特位最近的数值为1的第二比特位,确定所述第一比特位与所述第二比特位之间的第一偏移量,根据所述第一偏移量以及所述预设数量,确定所述目标对象的内存起始地址与所述指针的地址之间的第一内存偏移量;根据所述指针的地址和所述第一内存偏移量,确定所述目标对象的内存起始地址;和/或
在所述第一位图中向尾部方向寻找所述第一比特位最近的数值为1的第三比特位,确定所述第一比特位与所述第三比特位之间的第二偏移量,根据所述第二偏移量以及所述预设数量,确定所述目标对象的结束起始地址与所述指针的地址之间的第二内存偏移量;根据所述指针的地址和所述第二内存偏移量,确定所述目标对象的内存结束地址;和/或
根据所述目标对象的内存起始地址和所述目标对象的内存结束地址,确定所述目标对象的内存大小。
在本公开的一个或多个实施例中,所述处理单元702在确定所述指针的地址在所述第一位图中对应的第一比特位时,用于:
确定所述第一比特位在所述第一位图中所在字节,并读取该字节对应的第一部分位图,在所述第一部分位图中确定所述第一比特位。
在本公开的一个或多个实施例中,所述处理单元702在所述第一位图中向头部方向寻找所述第一比特位最近的数值为1的第二比特位,确定所述第一比特位与所述第二比特位之间的第一偏移量时,用于:
确定所述第一比特位相对于所述第一部分位图尾部的第三偏移量;
判断所述第一部分位图中是否存在所述第二比特位;
若确定所述第一部分位图中存在所述第二比特位,则确定所述第二比特位相对于所述第一部分位图尾部的第四偏移量;根据所述第三偏移量和所述第四偏移量,确定所述第一比特位与所述第二比特位之间的第一偏移量;或者
若确定所述第一部分位图中不存在所述第二比特位,则沿头部方向依次读取相邻字节对应的部分位图,直至查找到存在所述第二比特位的第二部分位图,并确定所述第二比特位相对于所述第二部分位图尾部的第五偏移量;根据所述第五偏移量确定所述第二比特位相对于所述第一部分位图尾部的第六偏移量;根据所述第三偏移量和所述第六偏移量,确定所述第一比特位与所述第二比特位之间的第一偏移量。
在本公开的一个或多个实施例中,所述处理单元702在所述第一位图中向尾部方向寻找所述第一比特位最近的数值为1的第三比特位,确定所述第一比特位与所述第三比特位之间的第二偏移量时,用于:
确定所述第一比特位相对于所述第一部分位图头部的第七偏移量;
判断所述第一部分位图中是否存在所述第三比特位;
若确定所述第一部分位图中存在所述第三比特位,则确定所述第三比特位相对于所述第一部分位图头部的第八偏移量;根据所述第七偏移量和所述第八偏移量,确定所述第一比特位与所述第三比特位之间的第二偏移量;或者
若确定所述第一部分位图中不存在所述第三比特位,则沿尾部方向依次读取相邻字节对应的部分位图,直至查找到存在所述第三比特位的第三部分位图,并确定所述第三比特位相对于所述第三部分位图头部的第九偏移量;根据所述第九偏移量确定所述第三比特位相对于所述第一部分位图头部的第十偏移量;根据所述第七偏移量和所述第十偏移量,确定所述第一比特位与所述第三比特位之间的第二偏移量。
在本公开的一个或多个实施例中,所述处理单元702在所述第一部分位图中确定所述第一比特位后,还用于:
根据所述第一比特位在所述第一部分位图中的位置构建第一掩码,所述第一掩码的长度与所述第一部分位图相同,且所述第一比特位对应的位置为1,其余位置为0。
在本公开的一个或多个实施例中,所述处理单元702在确定所述第一比特位相对于所述第一部分位图尾部的第三偏移量时,用于:
在所述第一掩码中确定在1朝向所述第一掩码尾部方向存在0的数量,确定为所述第三偏移量。
在本公开的一个或多个实施例中,所述处理单元702在判断所述第一部分位图中是否存在所述第二比特位时,用于:
构建第二掩码,所述第二掩码的长度与所述第一部分位图相同,且所述第二掩码尾部预设位数的位置为0,其余位置为1,预设数量为第三偏移量;
将所述第二掩码与所述第一部分位图进行按位与运算,若运算结果不为0,则确定所述第一部分位图中存在所述第二比特位;或者,若运算结果为0,则确定所述第一部分位图中不存在所述第二比特位;
相应的,所述处理单元702在确定所述第二比特位相对于所述第一部分位图尾部的第四偏移量时,用于:
确定运算结果尾部存在0的数量,确定为所述第四偏移量。
在本公开的一个或多个实施例中,所述处理单元702在确定所述第二部分位图中存在所述第二比特位,则确定所述第二比特位相对于所述第二部分位图尾部的第五偏移量时,用于:
若确定所述第二部分位图不为0,则确定所述第二部分位图中存在所述第二比特位;
确定所述第二部分位图尾部存在0的数量,确定为所述第五偏移量;
相应的,所述处理单元702在根据所述第五偏移量确定所述第二比特位相对于所述第一部分位图尾部的第六偏移量时,用于:
获取所述第二部分位图尾部与所述第一部分位图尾部之间的比特位数量;
将所述第五偏移量与所述比特位数量相加,得到所述第六偏移量。
在本公开的一个或多个实施例中,所述处理单元702在确定所述第一比特位相对于所述第一部分位图头部的第七偏移量时,用于:
在所述第一掩码中确定在1朝向所述第一掩码头部方向存在0的数量,确定为所述第七偏移量。
在本公开的一个或多个实施例中,所述处理单元702在判断所述第一部分位图中是否存在所述第三比特位时,用于:
构建第三掩码,所述第三掩码的长度与所述第一部分位图相同,且所述第三掩码头部预设位数的位置为0,其余位置为1,预设数量为所述第七偏移量加1;
将所述第三掩码与所述第一部分位图进行按位与运算,若运算结果不为0,则确定所述第一部分位图中存在所述第三比特位;或者,若运算结果为0,则确定所述第一部分位图中不存在所述第三比特位;
相应的,所述处理单元702在确定所述第三比特位相对于所述第一部分位图头部的第八偏移量时,用于:
确定运算结果头部存在0的数量,确定为所述第八偏移量。
在本公开的一个或多个实施例中,所述处理单元702在确定所述第三部分位图中存在所述第三比特位,则确定所述第三比特位相对于所述第三部分位图头部的第九偏移量时,用于:
若确定所述第三部分位图不为0,则确定所述第三部分位图中存在所述第三比特位;
确定所述第三部分位图头部存在0的数量,确定为所述第九偏移量;
相应的,所述处理单元702在根据所述第九偏移量确定所述第三比特位相对于所述第一部分位图头部的第十偏移量时,用于:
获取所述第三部分位图头部与所述第一部分位图头部之间的比特位数量;
将所述第九偏移量与所述比特位数量相加,得到所述第十偏移量。
本实施例提供的设备,可用于执行上述方法实施例的技术方案,其实现原理和技术效果类似,本实施例此处不再赘述。
参考图8,其示出了适于用来实现本公开实施例的电子设备800的结构示意图,该电子设备800可以为终端设备或服务器。其中,终端设备可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、个人数字助理(Personal Digital Assistant,简称PDA)、平板电脑(Portable Android Device,简称PAD)、便携式多媒体播放器(Portable MediaPlayer,简称PMP)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字TV、台式计算机等等的固定终端。图8示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图8所示,电子设备800可以包括处理装置(例如中央处理器、图形处理器等)801,其可以根据存储在只读存储器(Read Only Memory,简称ROM)802中的程序或者从存储装置808加载到随机访问存储器(Random Access Memory,简称RAM)803中的程序而执行各种适当的动作和处理。在RAM 803中,还存储有电子设备800操作所需的各种程序和数据。处理装置801、ROM 802以及RAM 803通过总线804彼此相连。输入/输出(I/O)接口805也连接至总线804。
通常,以下装置可以连接至I/O接口805:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置806;包括例如液晶显示器(Liquid CrystalDisplay,简称LCD)、扬声器、振动器等的输出装置807;包括例如磁带、硬盘等的存储装置808;以及通信装置809。通信装置809可以允许电子设备800与其他设备进行无线或有线通信以交换数据。虽然图8示出了具有各种装置的电子设备800,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置809从网络上被下载和安装,或者从存储装置808被安装,或者从ROM 802被安装。在该计算机程序被处理装置801执行时,执行本公开实施例的方法中限定的上述功能。
需要说明的是,本公开上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、RF(射频)等等,或者上述的任意合适的组合。
上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。
上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备执行上述实施例所示的方法。
可以以一种或多种程序设计语言或其组合来编写用于执行本公开的操作的计算机程序代码,上述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LocalArea Network,简称LAN)或广域网(Wide Area Network,简称WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现。其中,单元的名称在某种情况下并不构成对该单元本身的限定,例如,第一获取单元还可以被描述为“获取至少两个网际协议地址的单元”。
本文中以上描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。例如,非限制性地,可以使用的示范类型的硬件逻辑部件包括:现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上系统(SOC)、复杂可编程逻辑设备(CPLD)等等。
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
第一方面,根据本公开的一个或多个实施例,提供了一种内存分配方法,包括:
对待分配内存的第一线程分配预设大小的第一内存空间,并配置与所述第一内存空间存在映射关系的第一位图;
根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,并基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识。
根据本公开的一个或多个实施例,所述映射关系为:所述第一位图中的每一比特位依次与所述第一内存空间的预设数量的字节相对应;
相应的,所述根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,并基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识,包括:
将所述第一位图的所有比特位清零;
根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,且每一对象的内存大小为所述预设数量的倍数;
将每一所述对象的内存起始地址在所述第一位图中对应的比特位设置为1。
根据本公开的一个或多个实施例,所述根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,包括:
在对任一对象分配内存前,判断所述第一内存空间的未使用内存是否满足该对象的大小;
若所述第一内存空间的未使用内存满足该对象的大小,则根据该对象的大小从未使用内存的起始地址开始分配内存。
根据本公开的一个或多个实施例,所述方法还包括:
若所述第一内存空间的未使用内存不满足该对象的大小,则对未使用内存的起始地址在所述第一位图中对应位设置为1,并重新分配预设大小的第二内存空间,并基于映射关系将每一所述对象的内存起始地址在所述第二位图中进行标识;
根据所述第一线程中每一待分配内存的对象的大小在所述第二内存空间中连续分配内存,并基于映射关系将每一所述对象的内存起始地址在所述第二位图中进行标识。
根据本公开的一个或多个实施例,所述方法还包括:
确定指向所述第一内存空间中任一目标对象的内存范围内的指针的地址;
根据所述指针的地址以及所述第一位图,确定所述目标对象的元数据,其中所述元数据包括内存起始地址、内存结束地址、以及内存大小中的至少一项。
根据本公开的一个或多个实施例,所述根据所述指针的地址以及所述第一位图,确定所述目标对象的元数据,包括:
确定所述指针的地址在所述第一位图中对应的第一比特位;
在所述第一位图中向头部方向寻找所述第一比特位最近的数值为1的第二比特位,确定所述第一比特位与所述第二比特位之间的第一偏移量,根据所述第一偏移量以及所述预设数量,确定所述目标对象的内存起始地址与所述指针的地址之间的第一内存偏移量;根据所述指针的地址和所述第一内存偏移量,确定所述目标对象的内存起始地址;和/或
在所述第一位图中向尾部方向寻找所述第一比特位最近的数值为1的第三比特位,确定所述第一比特位与所述第三比特位之间的第二偏移量,根据所述第二偏移量以及所述预设数量,确定所述目标对象的结束起始地址与所述指针的地址之间的第二内存偏移量;根据所述指针的地址和所述第二内存偏移量,确定所述目标对象的内存结束地址;和/或
根据所述目标对象的内存起始地址和所述目标对象的内存结束地址,确定所述目标对象的内存大小。
根据本公开的一个或多个实施例,所述确定所述指针的地址在所述第一位图中对应的第一比特位,包括:
确定所述第一比特位在所述第一位图中所在字节,并读取该字节对应的第一部分位图,在所述第一部分位图中确定所述第一比特位。
根据本公开的一个或多个实施例,所述在所述第一位图中向头部方向寻找所述第一比特位最近的数值为1的第二比特位,确定所述第一比特位与所述第二比特位之间的第一偏移量,包括:
确定所述第一比特位相对于所述第一部分位图尾部的第三偏移量;
判断所述第一部分位图中是否存在所述第二比特位;
若确定所述第一部分位图中存在所述第二比特位,则确定所述第二比特位相对于所述第一部分位图尾部的第四偏移量;根据所述第三偏移量和所述第四偏移量,确定所述第一比特位与所述第二比特位之间的第一偏移量;或者
若确定所述第一部分位图中不存在所述第二比特位,则沿头部方向依次读取相邻字节对应的部分位图,直至查找到存在所述第二比特位的第二部分位图,并确定所述第二比特位相对于所述第二部分位图尾部的第五偏移量;根据所述第五偏移量确定所述第二比特位相对于所述第一部分位图尾部的第六偏移量;根据所述第三偏移量和所述第六偏移量,确定所述第一比特位与所述第二比特位之间的第一偏移量。
根据本公开的一个或多个实施例,所述在所述第一位图中向尾部方向寻找所述第一比特位最近的数值为1的第三比特位,确定所述第一比特位与所述第三比特位之间的第二偏移量,包括:
确定所述第一比特位相对于所述第一部分位图头部的第七偏移量;
判断所述第一部分位图中是否存在所述第三比特位;
若确定所述第一部分位图中存在所述第三比特位,则确定所述第三比特位相对于所述第一部分位图头部的第八偏移量;根据所述第七偏移量和所述第八偏移量,确定所述第一比特位与所述第三比特位之间的第二偏移量;或者
若确定所述第一部分位图中不存在所述第三比特位,则依次读取相邻字节对应的部分位图,直至查找到存在所述第三比特位的第三部分位图,并确定所述第三比特位相对于所述第三部分位图头部的第九偏移量;根据所述第九偏移量确定所述第三比特位相对于所述第一部分位图头部的第十偏移量;根据所述第七偏移量和所述第十偏移量,确定所述第一比特位与所述第三比特位之间的第二偏移量。
根据本公开的一个或多个实施例,所述在所述第一部分位图中确定所述第一比特位后,还包括:
根据所述第一比特位在所述第一部分位图中的位置构建第一掩码,所述第一掩码的长度与所述第一部分位图相同,且所述第一比特位对应的位置为1,其余位置为0。
根据本公开的一个或多个实施例,所述确定所述第一比特位相对于所述第一部分位图尾部的第三偏移量,包括:
在所述第一掩码中确定在1朝向所述第一掩码尾部方向存在0的数量,确定为所述第三偏移量。
根据本公开的一个或多个实施例,所述判断所述第一部分位图中是否存在所述第二比特位,包括:
构建第二掩码,所述第二掩码的长度与所述第一部分位图相同,且所述第二掩码尾部预设位数的位置为0,其余位置为1,预设数量为第三偏移量;
将所述第二掩码与所述第一部分位图进行按位与运算,若运算结果不为0,则确定所述第一部分位图中存在所述第二比特位;或者,若运算结果为0,则确定所述第一部分位图中不存在所述第二比特位;
相应的,所述确定所述第二比特位相对于所述第一部分位图尾部的第四偏移量,包括:
确定运算结果尾部存在0的数量,确定为所述第四偏移量。
根据本公开的一个或多个实施例,所述确定所述第二部分位图中存在所述第二比特位,则确定所述第二比特位相对于所述第二部分位图尾部的第五偏移量,包括:
若确定所述第二部分位图不为0,则确定所述第二部分位图中存在所述第二比特位;
确定所述第二部分位图尾部存在0的数量,确定为所述第五偏移量;
相应的,所述根据所述第五偏移量确定所述第二比特位相对于所述第一部分位图尾部的第六偏移量,包括:
获取所述第二部分位图尾部与所述第一部分位图尾部之间的比特位数量;
将所述第五偏移量与所述比特位数量相加,得到所述第六偏移量。
根据本公开的一个或多个实施例,所述确定所述第一比特位相对于所述第一部分位图头部的第七偏移量,包括:
在所述第一掩码中确定在1朝向所述第一掩码头部方向存在0的数量,确定为所述第七偏移量。
根据本公开的一个或多个实施例,所述判断所述第一部分位图中是否存在所述第三比特位,包括:
构建第三掩码,所述第三掩码的长度与所述第一部分位图相同,且所述第三掩码头部预设位数的位置为0,其余位置为1,预设数量为所述第七偏移量加1;
将所述第三掩码与所述第一部分位图进行按位与运算,若运算结果不为0,则确定所述第一部分位图中存在所述第三比特位;或者,若运算结果为0,则确定所述第一部分位图中不存在所述第三比特位;
相应的,所述确定所述第三比特位相对于所述第一部分位图头部的第八偏移量,包括:
确定运算结果头部存在0的数量,确定为所述第八偏移量。
根据本公开的一个或多个实施例,所述确定所述第三部分位图中存在所述第三比特位,则确定所述第三比特位相对于所述第三部分位图头部的第九偏移量,包括:
若确定所述第三部分位图不为0,则确定所述第三部分位图中存在所述第三比特位;
确定所述第三部分位图头部存在0的数量,确定为所述第九偏移量;
相应的,所述根据所述第九偏移量确定所述第三比特位相对于所述第一部分位图头部的第十偏移量,包括:
获取所述第三部分位图头部与所述第一部分位图头部之间的比特位数量;
将所述第九偏移量与所述比特位数量相加,得到所述第十偏移量。
第二方面,根据本公开的一个或多个实施例,提供了一种内存分配设备,包括:
分配单元,用于对待分配内存的第一线程分配预设大小的第一内存空间,并配置与所述第一内存空间存在映射关系的第一位图;根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存;
处理单元,用于基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识。
根据本公开的一个或多个实施例,所述映射关系为:所述第一位图中的每一比特位依次与所述第一内存空间的预设数量的字节相对应;
所述分配单元在根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存时,用于将所述第一位图的所有比特位清零;根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,且每一对象的内存大小为所述预设数量的倍数;
所述处理单元在基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识时,用于将每一所述对象的内存起始地址在所述第一位图中对应的比特位设置为1。
根据本公开的一个或多个实施例,所述分配单元在根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存时,用于:
在对任一对象分配内存前,判断所述第一内存空间的未使用内存是否满足该对象的大小;
若所述第一内存空间的未使用内存满足该对象的大小,则根据该对象的大小从未使用内存的起始地址开始分配内存。
根据本公开的一个或多个实施例,所述分配单元还用于,若所述第一内存空间的未使用内存不满足该对象的大小,则对未使用内存的起始地址在所述第一位图中对应位设置为1,并重新分配预设大小的第二内存空间,并基于映射关系将每一所述对象的内存起始地址在所述第二位图中进行标识;根据所述第一线程中每一待分配内存的对象的大小在所述第二内存空间中连续分配内存;
所述处理单元还用于,基于映射关系将每一所述对象的内存起始地址在所述第二位图中进行标识。
根据本公开的一个或多个实施例,所述处理单元还用于:
确定指向所述第一内存空间中任一目标对象的内存范围内的指针的地址;
根据所述指针的地址以及所述第一位图,确定所述目标对象的元数据,其中所述元数据包括内存起始地址、内存结束地址、以及内存大小中的至少一项。
根据本公开的一个或多个实施例,所述处理单元在根据所述指针的地址以及所述第一位图,确定所述目标对象的元数据时,用于:
确定所述指针的地址在所述第一位图中对应的第一比特位;
在所述第一位图中向头部方向寻找所述第一比特位最近的数值为1的第二比特位,确定所述第一比特位与所述第二比特位之间的第一偏移量,根据所述第一偏移量以及所述预设数量,确定所述目标对象的内存起始地址与所述指针的地址之间的第一内存偏移量;根据所述指针的地址和所述第一内存偏移量,确定所述目标对象的内存起始地址;和/或
在所述第一位图中向尾部方向寻找所述第一比特位最近的数值为1的第三比特位,确定所述第一比特位与所述第三比特位之间的第二偏移量,根据所述第二偏移量以及所述预设数量,确定所述目标对象的结束起始地址与所述指针的地址之间的第二内存偏移量;根据所述指针的地址和所述第二内存偏移量,确定所述目标对象的内存结束地址;和/或
根据所述目标对象的内存起始地址和所述目标对象的内存结束地址,确定所述目标对象的内存大小。
根据本公开的一个或多个实施例,所述处理单元在确定所述指针的地址在所述第一位图中对应的第一比特位时,用于:
确定所述第一比特位在所述第一位图中所在字节,并读取该字节对应的第一部分位图,在所述第一部分位图中确定所述第一比特位。
根据本公开的一个或多个实施例,所述处理单元在所述第一位图中向头部方向寻找所述第一比特位最近的数值为1的第二比特位,确定所述第一比特位与所述第二比特位之间的第一偏移量时,用于:
确定所述第一比特位相对于所述第一部分位图尾部的第三偏移量;
判断所述第一部分位图中是否存在所述第二比特位;
若确定所述第一部分位图中存在所述第二比特位,则确定所述第二比特位相对于所述第一部分位图尾部的第四偏移量;根据所述第三偏移量和所述第四偏移量,确定所述第一比特位与所述第二比特位之间的第一偏移量;或者
若确定所述第一部分位图中不存在所述第二比特位,则依次读取相邻字节对应的部分位图,直至查找到存在所述第二比特位的第二部分位图,并确定所述第二比特位相对于所述第二部分位图尾部的第五偏移量;根据所述第五偏移量确定所述第二比特位相对于所述第一部分位图尾部的第六偏移量;根据所述第三偏移量和所述第六偏移量,确定所述第一比特位与所述第二比特位之间的第一偏移量。
根据本公开的一个或多个实施例,所述处理单元在所述第一位图中向尾部方向寻找所述第一比特位最近的数值为1的第三比特位,确定所述第一比特位与所述第三比特位之间的第二偏移量时,用于:
确定所述第一比特位相对于所述第一部分位图头部的第七偏移量;
判断所述第一部分位图中是否存在所述第三比特位;
若确定所述第一部分位图中存在所述第三比特位,则确定所述第三比特位相对于所述第一部分位图头部的第八偏移量;根据所述第七偏移量和所述第八偏移量,确定所述第一比特位与所述第三比特位之间的第二偏移量;或者
若确定所述第一部分位图中不存在所述第三比特位,则沿尾部方向依次读取相邻字节对应的部分位图,直至查找到存在所述第三比特位的第三部分位图,并确定所述第三比特位相对于所述第三部分位图头部的第九偏移量;根据所述第九偏移量确定所述第三比特位相对于所述第一部分位图头部的第十偏移量;根据所述第七偏移量和所述第十偏移量,确定所述第一比特位与所述第三比特位之间的第二偏移量。
根据本公开的一个或多个实施例,所述处理单元在所述第一部分位图中确定所述第一比特位后,还用于:
根据所述第一比特位在所述第一部分位图中的位置构建第一掩码,所述第一掩码的长度与所述第一部分位图相同,且所述第一比特位对应的位置为1,其余位置为0。
根据本公开的一个或多个实施例,所述处理单元在确定所述第一比特位相对于所述第一部分位图尾部的第三偏移量时,用于:
在所述第一掩码中确定在1朝向所述第一掩码尾部方向存在0的数量,确定为所述第三偏移量。
根据本公开的一个或多个实施例,所述处理单元在判断所述第一部分位图中是否存在所述第二比特位时,用于:
构建第二掩码,所述第二掩码的长度与所述第一部分位图相同,且所述第二掩码尾部预设位数的位置为0,其余位置为1,预设数量为第三偏移量;
将所述第二掩码与所述第一部分位图进行按位与运算,若运算结果不为0,则确定所述第一部分位图中存在所述第二比特位;或者,若运算结果为0,则确定所述第一部分位图中不存在所述第二比特位;
相应的,所述处理单元在确定所述第二比特位相对于所述第一部分位图尾部的第四偏移量时,用于:
确定运算结果尾部存在0的数量,确定为所述第四偏移量。
根据本公开的一个或多个实施例,所述处理单元在确定所述第二部分位图中存在所述第二比特位,则确定所述第二比特位相对于所述第二部分位图尾部的第五偏移量时,用于:
若确定所述第二部分位图不为0,则确定所述第二部分位图中存在所述第二比特位;
确定所述第二部分位图尾部存在0的数量,确定为所述第五偏移量;
相应的,所述处理单元在根据所述第五偏移量确定所述第二比特位相对于所述第一部分位图尾部的第六偏移量时,用于:
获取所述第二部分位图尾部与所述第一部分位图尾部之间的比特位数量;
将所述第五偏移量与所述比特位数量相加,得到所述第六偏移量。
根据本公开的一个或多个实施例,所述处理单元在确定所述第一比特位相对于所述第一部分位图头部的第七偏移量时,用于:
在所述第一掩码中确定在1朝向所述第一掩码头部方向存在0的数量,确定为所述第七偏移量。
根据本公开的一个或多个实施例,所述处理单元在判断所述第一部分位图中是否存在所述第三比特位时,用于:
构建第三掩码,所述第三掩码的长度与所述第一部分位图相同,且所述第三掩码头部预设位数的位置为0,其余位置为1,预设数量为所述第七偏移量加1;
将所述第三掩码与所述第一部分位图进行按位与运算,若运算结果不为0,则确定所述第一部分位图中存在所述第三比特位;或者,若运算结果为0,则确定所述第一部分位图中不存在所述第三比特位;
相应的,所述处理单元在确定所述第三比特位相对于所述第一部分位图头部的第八偏移量时,用于:
确定运算结果头部存在0的数量,确定为所述第八偏移量。
根据本公开的一个或多个实施例,所述处理单元在确定所述第三部分位图中存在所述第三比特位,则确定所述第三比特位相对于所述第三部分位图头部的第九偏移量时,用于:
若确定所述第三部分位图不为0,则确定所述第三部分位图中存在所述第三比特位;
确定所述第三部分位图头部存在0的数量,确定为所述第九偏移量;
相应的,所述处理单元在根据所述第九偏移量确定所述第三比特位相对于所述第一部分位图头部的第十偏移量时,用于:
获取所述第三部分位图头部与所述第一部分位图头部之间的比特位数量;
将所述第九偏移量与所述比特位数量相加,得到所述第十偏移量。
第三方面,根据本公开的一个或多个实施例,提供了一种电子设备,包括:至少一个处理器和存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如上第一方面以及第一方面各种可能的设计所述的内存分配方法。
第四方面,根据本公开的一个或多个实施例,提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上第一方面以及第一方面各种可能的设计所述的内存分配方法。
第五方面,根据本公开的一个或多个实施例,提供了一种计算机程序产品,包括计算机执行指令,当处理器执行所述计算机执行指令时,实现如上第一方面以及第一方面各种可能的设计所述的内存分配方法。
以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的公开范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述公开构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
此外,虽然采用特定次序描绘了各操作,但是这不应当理解为要求这些操作以所示出的特定次序或以顺序次序执行来执行。在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本公开的范围的限制。在单独的实施例的上下文中描述的某些特征还可以组合地实现在单个实施例中。相反地,在单个实施例的上下文中描述的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实施例中。
尽管已经采用特定于结构特征和/或方法逻辑动作的语言描述了本主题,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。

Claims (19)

1.一种内存分配方法,其特征在于,包括:
对待分配内存的第一线程分配预设大小的第一内存空间,并配置与所述第一内存空间存在映射关系的第一位图;
根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,并基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识。
2.根据权利要求1所述的方法,其特征在于,所述映射关系为:所述第一位图中的每一比特位依次与所述第一内存空间的预设数量的字节相对应;
相应的,所述根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,并基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识,包括:
将所述第一位图的所有比特位清零;
根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,且每一对象的内存大小为所述预设数量的倍数;
将每一所述对象的内存起始地址在所述第一位图中对应的比特位设置为1。
3.根据权利要求1或2所述的方法,其特征在于,所述根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存,包括:
在对任一对象分配内存前,判断所述第一内存空间的未使用内存是否满足该对象的大小;
若所述第一内存空间的未使用内存满足该对象的大小,则根据该对象的大小从未使用内存的起始地址开始分配内存。
4.根据权利要求3所述的方法,其特征在于,还包括:
若所述第一内存空间的未使用内存不满足该对象的大小,则对未使用内存的起始地址在所述第一位图中对应位设置为1,并重新分配预设大小的第二内存空间,并配置与所述第二内存空间存在映射关系的第二位图;
根据所述第一线程中每一待分配内存的对象的大小在所述第二内存空间中连续分配内存,并基于映射关系将每一所述对象的内存起始地址在所述第二位图中进行标识。
5.根据权利要求2所述的方法,其特征在于,所述方法还包括:
确定指向所述第一内存空间中任一目标对象的内存范围内的指针的地址;
根据所述指针的地址以及所述第一位图,确定所述目标对象的元数据,其中所述元数据包括内存起始地址、内存结束地址、以及内存大小中的至少一项。
6.根据权利要求5所述的方法,其特征在于,所述根据所述指针的地址以及所述第一位图,确定所述目标对象的元数据,包括:
确定所述指针的地址在所述第一位图中对应的第一比特位;
在所述第一位图中向头部方向寻找所述第一比特位最近的数值为1的第二比特位,确定所述第一比特位与所述第二比特位之间的第一偏移量,根据所述第一偏移量以及所述预设数量,确定所述目标对象的内存起始地址与所述指针的地址之间的第一内存偏移量;根据所述指针的地址和所述第一内存偏移量,确定所述目标对象的内存起始地址;和/或
在所述第一位图中向尾部方向寻找所述第一比特位最近的数值为1的第三比特位,确定所述第一比特位与所述第三比特位之间的第二偏移量,根据所述第二偏移量以及所述预设数量,确定所述目标对象的结束起始地址与所述指针的地址之间的第二内存偏移量;根据所述指针的地址和所述第二内存偏移量,确定所述目标对象的内存结束地址;和/或
根据所述目标对象的内存起始地址和所述目标对象的内存结束地址,确定所述目标对象的内存大小。
7.根据权利要求6所述的方法,其特征在于,所述确定所述指针的地址在所述第一位图中对应的第一比特位,包括:
确定所述第一比特位在所述第一位图中所在字节,并读取该字节对应的第一部分位图,在所述第一部分位图中确定所述第一比特位。
8.根据权利要求7所述的方法,其特征在于,所述在所述第一位图中向头部方向寻找所述第一比特位最近的数值为1的第二比特位,确定所述第一比特位与所述第二比特位之间的第一偏移量,包括:
确定所述第一比特位相对于所述第一部分位图尾部的第三偏移量;
判断所述第一部分位图中是否存在所述第二比特位;
若确定所述第一部分位图中存在所述第二比特位,则确定所述第二比特位相对于所述第一部分位图尾部的第四偏移量;根据所述第三偏移量和所述第四偏移量,确定所述第一比特位与所述第二比特位之间的第一偏移量;或者
若确定所述第一部分位图中不存在所述第二比特位,则沿头部方向依次读取相邻字节对应的部分位图,直至查找到存在所述第二比特位的第二部分位图,并确定所述第二比特位相对于所述第二部分位图尾部的第五偏移量;根据所述第五偏移量确定所述第二比特位相对于所述第一部分位图尾部的第六偏移量;根据所述第三偏移量和所述第六偏移量,确定所述第一比特位与所述第二比特位之间的第一偏移量。
9.根据权利要求7所述的方法,其特征在于,所述在所述第一位图中向尾部方向寻找所述第一比特位最近的数值为1的第三比特位,确定所述第一比特位与所述第三比特位之间的第二偏移量,包括:
确定所述第一比特位相对于所述第一部分位图头部的第七偏移量;
判断所述第一部分位图中是否存在所述第三比特位;
若确定所述第一部分位图中存在所述第三比特位,则确定所述第三比特位相对于所述第一部分位图头部的第八偏移量;根据所述第七偏移量和所述第八偏移量,确定所述第一比特位与所述第三比特位之间的第二偏移量;或者
若确定所述第一部分位图中不存在所述第三比特位,则沿尾部方向依次读取相邻字节对应的部分位图,直至查找到存在所述第三比特位的第三部分位图,并确定所述第三比特位相对于所述第三部分位图头部的第九偏移量;根据所述第九偏移量确定所述第三比特位相对于所述第一部分位图头部的第十偏移量;根据所述第七偏移量和所述第十偏移量,确定所述第一比特位与所述第三比特位之间的第二偏移量。
10.根据权利要求8所述的方法,其特征在于,所述在所述第一部分位图中确定所述第一比特位后,还包括:
根据所述第一比特位在所述第一部分位图中的位置构建第一掩码,所述第一掩码的长度与所述第一部分位图相同,且所述第一比特位对应的位置为1,其余位置为0;
所述确定所述第一比特位相对于所述第一部分位图尾部的第三偏移量,包括:
在所述第一掩码中确定在1朝向所述第一掩码尾部方向存在0的数量,确定为所述第三偏移量。
11.根据权利要求10所述的方法,其特征在于,所述判断所述第一部分位图中是否存在所述第二比特位,包括:
构建第二掩码,所述第二掩码的长度与所述第一部分位图相同,且所述第二掩码尾部预设位数的位置为0,其余位置为1,预设数量为第三偏移量;
将所述第二掩码与所述第一部分位图进行按位与运算,若运算结果不为0,则确定所述第一部分位图中存在所述第二比特位;或者,若运算结果为0,则确定所述第一部分位图中不存在所述第二比特位;
相应的,所述确定所述第二比特位相对于所述第一部分位图尾部的第四偏移量,包括:
确定运算结果尾部存在0的数量,确定为所述第四偏移量。
12.根据权利要求11所述的方法,其特征在于,所述确定所述第二部分位图中存在所述第二比特位,则确定所述第二比特位相对于所述第二部分位图尾部的第五偏移量,包括:
若确定所述第二部分位图不为0,则确定所述第二部分位图中存在所述第二比特位;
确定所述第二部分位图尾部存在0的数量,确定为所述第五偏移量;
相应的,所述根据所述第五偏移量确定所述第二比特位相对于所述第一部分位图尾部的第六偏移量,包括:
获取所述第二部分位图尾部与所述第一部分位图尾部之间的比特位数量;
将所述第五偏移量与所述比特位数量相加,得到所述第六偏移量。
13.根据权利要求9所述的方法,其特征在于,所述在所述第一部分位图中确定所述第一比特位后,还包括:
根据所述第一比特位在所述第一部分位图中的位置构建第一掩码,所述第一掩码的长度与所述第一部分位图相同,且所述第一比特位对应的位置为1,其余位置为0;
所述确定所述第一比特位相对于所述第一部分位图头部的第七偏移量,包括:
在所述第一掩码中确定在1朝向所述第一掩码头部方向存在0的数量,确定为所述第七偏移量。
14.根据权利要求13所述的方法,其特征在于,所述判断所述第一部分位图中是否存在所述第三比特位,包括:
构建第三掩码,所述第三掩码的长度与所述第一部分位图相同,且所述第三掩码头部预设位数的位置为0,其余位置为1,预设数量为所述第七偏移量加1;
将所述第三掩码与所述第一部分位图进行按位与运算,若运算结果不为0,则确定所述第一部分位图中存在所述第三比特位;或者,若运算结果为0,则确定所述第一部分位图中不存在所述第三比特位;
相应的,所述确定所述第三比特位相对于所述第一部分位图头部的第八偏移量,包括:
确定运算结果头部存在0的数量,确定为所述第八偏移量。
15.根据权利要求14所述的方法,其特征在于,所述确定所述第三部分位图中存在所述第三比特位,则确定所述第三比特位相对于所述第三部分位图头部的第九偏移量,包括:
若确定所述第三部分位图不为0,则确定所述第三部分位图中存在所述第三比特位;
确定所述第三部分位图头部存在0的数量,确定为所述第九偏移量;
相应的,所述根据所述第九偏移量确定所述第三比特位相对于所述第一部分位图头部的第十偏移量,包括:
获取所述第三部分位图头部与所述第一部分位图头部之间的比特位数量;
将所述第九偏移量与所述比特位数量相加,得到所述第十偏移量。
16.一种内存分配设备,其特征在于,包括:
分配单元,对待分配内存的第一线程分配预设大小的第一内存空间,并配置与所述第一内存空间存在映射关系的第一位图;根据所述第一线程中每一待分配内存的对象的大小在所述第一内存空间中连续分配内存;
处理单元,用于基于所述映射关系将每一所述对象的内存起始地址在所述第一位图中进行标识。
17.一种电子设备,其特征在于,包括:至少一个处理器和存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如权利要求1-15任一项所述的方法。
18.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如权利要求1-15任一项所述的方法。
19.一种计算机程序产品,其特征在于,包括计算机执行指令,当处理器执行所述计算机执行指令时,实现如权利要求1-15任一项所述的方法。
CN202311085520.2A 2023-08-25 2023-08-25 内存分配方法、设备及存储介质 Pending CN117112215A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311085520.2A CN117112215A (zh) 2023-08-25 2023-08-25 内存分配方法、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311085520.2A CN117112215A (zh) 2023-08-25 2023-08-25 内存分配方法、设备及存储介质

Publications (1)

Publication Number Publication Date
CN117112215A true CN117112215A (zh) 2023-11-24

Family

ID=88807170

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311085520.2A Pending CN117112215A (zh) 2023-08-25 2023-08-25 内存分配方法、设备及存储介质

Country Status (1)

Country Link
CN (1) CN117112215A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117724985A (zh) * 2024-02-08 2024-03-19 此芯科技(武汉)有限公司 一种内存访问行为监控方法、装置、存储介质及电子设备

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117724985A (zh) * 2024-02-08 2024-03-19 此芯科技(武汉)有限公司 一种内存访问行为监控方法、装置、存储介质及电子设备
CN117724985B (zh) * 2024-02-08 2024-04-30 此芯科技(武汉)有限公司 一种内存访问行为监控方法、装置、存储介质及电子设备

Similar Documents

Publication Publication Date Title
KR102594657B1 (ko) 비순차적 리소스 할당을 구현하는 방법 및 장치
CN111679921A (zh) 内存共享方法、内存共享装置及终端设备
CN117112215A (zh) 内存分配方法、设备及存储介质
US9389997B2 (en) Heap management using dynamic memory allocation
CN115994122B (zh) 快速缓存信息的方法、系统、设备及储存介质
CN115599707A (zh) 内存管理方法、装置、介质及电子设备
CN111813666B (zh) 一种内存泄露定位的方法、装置、介质和电子设备
CN114610650A (zh) 内存压缩方法、装置、存储介质及电子设备
CN110515872B (zh) 直接内存存取方法、装置、专用计算芯片及异构计算系统
CN110069452B (zh) 数据存储方法、装置和计算机可读存储介质
CN109101438B (zh) 用于存储数据的方法和装置
CN110674050A (zh) 内存越界检测方法、装置、电子设备及计算机存储介质
CN112084086B (zh) 一种信息收集方法、装置、介质和电子设备
CN111857915B (zh) 应用页面显示方法和装置
CN109634877B (zh) 流操作的实现方法、装置、设备及存储介质
CN117539664B (zh) 基于dpu的远程过程调用方法、设备及存储介质
CN111209062A (zh) 信息获取方法、装置、电子设备及计算机存储介质
CN117539380A (zh) 基于二进制数组的数据序列化方法、装置及电子设备
CN114625433B (zh) 应用程序启动方法和系统
CN117056244A (zh) 一种内存管理方法、装置、设备及介质
CN112732269B (zh) 一种应用于avs2硬件编码器的物理地址的访问方法及装置
CN113448550B (zh) 实现类的收集管理方法、装置、电子设备及计算机介质
CN116862752A (zh) 数据处理方法、装置、电子设备及存储介质
CN115220910B (zh) 一种资源调度方法、装置及设备
EP4120060A1 (en) Method and apparatus of storing data,and method and apparatus of reading data

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination