CN106294189A - 内存碎片整理方法及装置 - Google Patents

内存碎片整理方法及装置 Download PDF

Info

Publication number
CN106294189A
CN106294189A CN201510270858.4A CN201510270858A CN106294189A CN 106294189 A CN106294189 A CN 106294189A CN 201510270858 A CN201510270858 A CN 201510270858A CN 106294189 A CN106294189 A CN 106294189A
Authority
CN
China
Prior art keywords
memory space
mobile
space
data
value
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.)
Granted
Application number
CN201510270858.4A
Other languages
English (en)
Other versions
CN106294189B (zh
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.)
ZTE Corp
Original Assignee
ZTE Corp
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 ZTE Corp filed Critical ZTE Corp
Priority to CN201510270858.4A priority Critical patent/CN106294189B/zh
Priority to PCT/CN2015/087707 priority patent/WO2016187975A1/zh
Publication of CN106294189A publication Critical patent/CN106294189A/zh
Application granted granted Critical
Publication of CN106294189B publication Critical patent/CN106294189B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation

Abstract

本发明提供了一种内存碎片整理方法及装置,通过本发明提供的将目标应用程序划分多个线程;在对目标应用程序进行碎片整理时,查询每个线程中价值信息线段树中移动价值最大的链表,链表携带移动价值相同的存储空间,价值信息线段树用于查询每个链表的移动价值,移动价值用于衡量碎片整理时存储空间对应的分配或释放的价值;在移动价值最大的链表中选取满足预设移动条件的存储空间;将存储空间移动至目标存储空间,解决了相关技术中由于缺少对NVM的内存碎片整理机制导致的碎片整理耗时的问题,进而达到了节约碎片整理时间,提升碎片整理效率的效果。

Description

内存碎片整理方法及装置
技术领域
本发明涉及通信领域,具体而言,涉及一种内存碎片整理方法及装置。
背景技术
随着云计算和大数据技术的迅猛发展,用户对存储系统的存储效率与存储质量的要求越来越高,即,需要具备容量大、密度高、能耗低、读写速度快等特点的存储系统,而以动态随机存取存储器(Dynamic Random Access Memory,简称DRAM)与闪存Flash为代表的存储介质逐渐达到了技术瓶颈,例如容量和密度瓶颈。即,在相同面积下,DRAM与Flash的容量已经很难再增加;此外,在很多手持设备中,DRAM的能耗,特别是刷新能耗已经占据手持设备系统能耗的40%左右。而在一些数据中心中,DRAM的刷新能耗所带来的成本增加也是不容小觑的。对于Flash而言,虽然密度大于DRAM,但其读写速度远远慢于DRAM,且写入次数限制过小。这些不利因素,限制了Flash的未来应用。因此,长期以来研究人员都在不断地寻找满足要求的、新的存储介质。
随着新型非易失存储器(Non-Volatile Memory,简称NVM)取得了不小的进步,它们的大容量、高密度、低能耗、读写速度快、磨损周期长等特点引起了学术界和工业界的广泛关注,使人们在云计算、大数据时代背景下,看到了存储系统性能提升的希望,在云计算和大数据背景下,很多应用程序都会要求自己的数据或数据结构被持久化存储。而持久化内存不仅可以满足这一要求,还可以减少存储栈层次,提高存储效率。应用程序使用持久化内存最有效的一种方式,即将持久化内存映射到进程地址空间中。如此一来,应用程序就可以直接读写持久化内存区域,极大地减少额外开销。但是同普通的堆空间管理类似,持久化堆也应有效组织堆中的空闲空间,并按照申请的空间大小分配给应用程序使用。由于需要分配的空间大小并不固定,所以持久化堆和普通堆一样,都面临内存碎片问题。由于NVM的非易失性,即使重启进程,碎片也不会消失。因为堆管理机制必须分配连续空间,因此若不对这些碎片进行整理,持久化堆很快就会出现即使有足够的空闲空间,也不能满足应用程序分配要求的情况。另一方面,目前很多应用都要求7*24方式工作。在这种场景下,是没有办法进行离线的碎片整理。
由于相关堆空间的内存碎片整理机制,基本都是针对DRAM上建立的普通堆。这类机制的主要缺陷是在进行内存碎片整理时,对上层业务的性能影响较大。造成这种情况的主要原因有两点,一是全局扫描问题、二是引用更新问题。现有的碎片整理机制,在决定哪些对象需要移动到哪些地址上时,往往都要对已分配的对象或未分配的若干连续空间进行扫描,即进行全局扫描。另一方面,当某个对象移动结束之后,就需要更新之前指向该对象的其他所有对象,即进行引用更新。一些堆管理实现方案,是完全不支持引用更新的;而另一些堆管理方案,在进行引用更新时,则需要遍历所有对象或所有引用了被移动对象的对象。无论是全局扫描,还是引用更新,现有的堆内存碎片整理机制都比较耗时,对正在运行的上层业务影响较大,并不能满足在线内存碎片整理的要求。
针对相关技术中由于缺少对NVM的内存碎片整理机制导致的碎片整理耗时的问题,目前尚未提出有效的解决方案。
发明内容
本发明提供了一种内存碎片整理方法及装置,以至少解决相关技术中由于缺少对NVM的内存碎片整理机制导致的碎片整理耗时的问题。
根据本发明的一个方面,提供了一种内存碎片整理方法,包括:将目标应用程序划分多个线程;在对目标应用程序进行碎片整理时,查询每个线程中价值信息线段树中移动价值最大的链表,链表携带移动价值相同的存储空间,价值信息线段树用于查询每个链表的移动价值,移动价值用于衡量碎片整理时存储空间对应的分配或释放的价值;在移动价值最大的链表中选取满足预设移动条件的存储空间;将存储空间移动至目标存储空间。
进一步地,在移动价值最大的链表中选取满足预设移动条件的存储空间的步骤包括:依据目标应用程序对应的数据移动门限值,在移动价值最大的链表中选取移动数据量小于或等于数据移动门限值的存储空间;将移动数据量小于或等于数据移动门限值的存储空间作为满足预设移动条件的存储空间。
进一步地,在移动价值最大的链表中选取移动数据量小于或等于数据移动门限值的存储空间的步骤包括:在移动价值最大的链表中选取最小移动数据量的存储空间,判断最小移动数据量是否小于或等于数据移动门限值;若最小移动数据量小于或等于数据移动门限值,则将最小移动数据量对应的存储空间作为满足预设移动条件的存储空间;若最小移动数据量大于数据移动门限值,则查询价值信息线段树中小于移动价值最大的链表,并在链表中依据数据移动门限值,匹配移动数据量小于或等于数据移动门限值的存储空间。
进一步地,在预设函数包括:确切分配函数,和/或多对象分配函数的情况下,将存储空间移动至目标存储空间的步骤包括:依据确切分配函数在对象数据区中,匹配与存储空间大小相等的存储空间,并将存储空间内的数据移动至匹配得到的目标存储空间中;若对存储空间匹配对应存储空间后存在剩余存储空间,则依据多对象分配函数匹配与剩余存储空间大小相等的存储空间,并将将剩余存储空间中的数据移动至匹配得到的存储空间中。
进一步地,在依据多对象分配函数匹配与剩余存储空间大小相等的存储空间的步骤包括:计算剩余存储空间的存储量;依据存储量通过调用多对象分配函数在对象数据区中,匹配与剩余存储空间大小相等的存储空间。
根据本发明的另一方面,提供了一种内存碎片整理装置,包括:划分模块,用于将目标应用程序划分多个线程;查询模块,用于在对目标应用程序进行碎片整理时,查询每个线程中价值信息线段树中移动价值最大的链表,链表携带移动价值相同的存储空间,价值信息线段树用于查询每个链表的移动价值,移动价值用于衡量碎片整理时存储空间对应的分配或释放的价值;选取模块,用于在移动价值最大的链表中选取满足预设移动条件的存储空间;移动模块,用于将存储空间移动至目标存储空间。
进一步地,选取模块包括:第一选取单元,用于依据目标应用程序对应的数据移动门限值,在移动价值最大的链表中选取移动数据量小于或等于数据移动门限值的存储空间;第二选取单元,用于将移动数据量小于或等于数据移动门限值的存储空间作为满足预设移动条件的存储空间。
进一步地,第一选取单元包括:第一选取子单元,用于在移动价值最大的链表中选取最小移动数据量的存储空间,判断最小移动数据量是否小于或等于数据移动门限值;第二选取子单元,用于在最小移动数据量小于或等于数据移动门限值的情况下,将最小移动数据量对应的存储空间作为满足预设移动条件的存储空间;匹配子单元,用于若最小移动数据量大于数据移动门限值,则查询价值信息线段树中小于移动价值最大的链表,并在链表中依据数据移动门限值,匹配移动数据量小于或等于数据移动门限值的存储空间。
进一步地,在预设函数包括:确切分配函数,和/或多对象分配函数的情况下,移动模块包括:空间匹配单元,用于依据确切分配函数在对象数据区中,匹配与存储空间大小相等的存储空间,并将存储空间内的数据移动至匹配得到的目标存储空间中;移动单元,用于在对存储空间匹配对应存储空间后存在剩余存储空间的情况下,依据多对象分配函数匹配与剩余存储空间大小相等的存储空间,并将将剩余存储空间中的数据移动至匹配得到的存储空间中。
进一步地,移动单元包括:计算子单元,用于计算剩余存储空间的存储量;匹配子单元,用于依据存储量通过调用多对象分配函数在对象数据区中,匹配与剩余存储空间大小相等的存储空间。
通过本发明,采用将目标应用程序划分多个线程;在对目标应用程序进行碎片整理时,查询每个线程中价值信息线段树中移动价值最大的链表,链表携带移动价值相同的存储空间,价值信息线段树用于查询每个链表的移动价值,移动价值用于衡量碎片整理时存储空间对应的分配或释放的价值;在移动价值最大的链表中选取满足预设移动条件的存储空间;将存储空间移动至目标存储空间。解决了相关技术中由于缺少对NVM的内存碎片整理机制导致的碎片整理耗时的问题,进而达到了节约碎片整理时间,提升碎片整理效率的效果。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明实施例的内存碎片整理方法的流程图;
图2是根据本发明实施例的内存碎片整理装置的结构框图;
图3是根据本发明实施例的一种内存碎片整理装置的结构框图;
图4是根据本发明实施例的另一种内存碎片整理装置的结构框图;
图5是根据本发明实施例的又一种内存碎片整理装置的结构框图;
图6是根据本发明实施例的再一种内存碎片整理装置的结构框图;
图7是根据本发明实施例的一种持久化堆的对象模型的结构图;以及,
图8是根据本发明实施例的另一种持久化堆的对象模型的结构图。
具体实施方式
下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
实施例一
本实施例提供的存储空间管理方法可以适用于非易失存储存储器,其中,非易失存储存储器(Non-Volatile Memory,简称NVM)至少可以包括:阻变式存储器(ResistiveRAM,简称RRAM)、相变存储器(Phase Change Memory,简称PCM)、磁性随机存储器(Magnetic RAM,简称MRAM)以及自旋力矩转移存储器(Spin-Torque Transfer RAM,简称STT RAM)。其中,该类型的存储器具备大容量、高密度、低能耗、读写速度快、磨损周期长等特点,该类型的存储器可以直接连接到处理器内存子系统中,即和内存总线相连。在这种情况下,NVM可被称为持久化内存,即持久化内存Persistent Memory。在云计算和大数据背景下,很多应用程序都会要求自己的数据或数据结构被持久化存储。而持久化内存不仅可以满足这一要求,还可以减少存储栈层次,提高存储效率。应用程序使用持久化内存最有效的一种方式,即将持久化内存映射到进程地址空间中。如此一来,应用程序就可以直接读写持久化内存区域,极大地减少额外开销。而这被映射的持久化内存区域,即可称为持久化堆。
同普通的堆空间管理类似,持久化堆也应有效组织堆中的空闲空间,并按照申请的空间大小分配给应用程序使用。由于需要分配的空间大小并不固定,所以持久化堆和普通堆一样,都面临内存碎片问题。由于NVM的非易失性,即使重启进程,碎片也不会消失。因为堆管理机制必须分配连续空间,因此若不对这些碎片进行整理,持久化堆很快就会出现即使有足够的空闲空间,也不能满足应用程序分配要求的情况。另一方面,目前很多应用都要求7*24方式工作。在这种场景下,是没有办法进行离线的碎片整理。因此,很有必要对持久化堆进行在线的内存碎片整理。
目前有关堆空间的内存碎片整理机制,基本都是针对DRAM上建立的普通堆。这类机制的主要缺陷是在进行内存碎片整理时,对上层业务的性能影响较大。造成这种情况的主要原因有两点,一是全局扫描问题、二是引用更新问题。现有的碎片整理机制,在决定哪些对象需要移动到哪些地址上时,往往都要对已分配的对象或未分配的若干连续空间进行扫描,即进行全局扫描。另一方面,当某个对象移动结束之后,就需要更新之前指向该对象的其他所有对象,即进行引用更新。一些堆管理实现方案,是完全不支持引用更新的;而另一些堆管理方案,在进行引用更新时,则需要遍历所有对象或所有引用了被移动对象的对象。无论是全局扫描,还是引用更新,现有的堆内存碎片整理机制都比较耗时,对正在运行的上层业务影响较大,并不能满足在线内存碎片整理的要求。
针对上述问题,本实施例提供了一种内存碎片整理方法,具体如下:
在本实施例中提供了一种内存碎片整理方法,图1是根据本发明实施例的内存碎片整理方法的流程图,如图1所示,该流程包括如下步骤:
步骤S102,将目标应用程序划分多个线程;
步骤S104,在对目标应用程序进行碎片整理时,查询每个线程中价值信息线段树中移动价值最大的链表,其中,该链表携带移动价值相同的存储空间,该价值信息线段树用于查询每个链表的移动价值,该移动价值用于衡量碎片整理时存储空间对应的分配或释放的价值;
步骤S106,在移动价值最大的链表中选取满足预设移动条件的存储空间;
步骤S108,将存储空间移动至目标存储空间。
具体的,首先对目标应用程序划分多个线程,其次,在对该目标应用程序进行碎片整理时,查询上述每个线程中价值信息线段树中价值最大的链表,进一步的,在移动价值最大的链表中选取满足预设移动条件的存储空间后,将存储空间移动至目标存储空间。
其中,本实施例中提供的持久化堆为了提高并发性,也应划分成若干线程堆。这种情况下,同一应用程序中,每个线程会拥有自己的线程堆,以减少争用。同样地,为了提高碎片整理的吞吐量和并发性,本实施例以单个线程堆为范围进行对象移动。如此一来,多个线程堆就可以并发地进行对象移动,以提高碎片整理的效率。
此外,本实施例中持久化堆所分配的对象,采用元数据和数据分离的方案。在该方案中,对象的元数据包含了对象数据区的地址,要访问数据区,必须通过元数据和相应的智能指针。基于步骤S102至步骤S108,在将存储空间移动至目标存储空间的过程中,即,通过智能指针依据元数据映射至数据区,进一步的,将数据区的存储空间移动至目标存储空间。
采用这种方式的主要原因,即为了防止外部程序直接操作持久化堆空间而带来的安全隐患。由于NVM的持久性,这种安全隐患很有可能导致长期的严重后果。在上述方案下,当对象移动完成之后,进行引用更新将变得十分简单。即只需要修改被移动对象的元数据,使其指向新的对象数据区。显然,这一步骤的时间复杂度为O(1)。
通过上述步骤,将目标应用程序划分多个线程;在对目标应用程序进行碎片整理时,查询每个线程中价值信息线段树中移动价值最大的链表,链表携带移动价值相同的存储空间,价值信息线段树用于查询每个链表的移动价值,移动价值用于衡量碎片整理时存储空间对应的分配或释放的价值;在移动价值最大的链表中选取满足预设移动条件的存储空间;将存储空间移动至目标存储空间。解决了相关技术中由于缺少对NVM的内存碎片整理机制导致的碎片整理耗时的问题,进而达到了节约碎片整理时间,提升碎片整理效率的效果。
进一步地,在步骤S106中移动价值最大的链表中选取满足预设移动条件的存储空间的步骤包括:
Step1,依据目标应用程序对应的数据移动门限值,在移动价值最大的链表中选取移动数据量小于或等于数据移动门限值的存储空间;
Step2,将移动数据量小于或等于数据移动门限值的存储空间作为满足预设移动条件的存储空间。
这里本实施例为不影响上层业务的运行,则在对目标应用程序执行碎片整理的过程中,通过设定数据移动门限值,以一次只移动一小部分数据,而且该移动的这部分数据是最划算的,即,通过移动小部分数据换取大的存储空间作为本实施例的实现特点,依据数据移动门限值,通过在链表中选取移动数据量小于或等于该数据移动门限值的存储空间,进一步的将该存储空间作为满足预设移动条件的存储空间。
具体的,由于价值信息线段树中,移动价值相同的线段被组织进一个链表中,而该链表按照线段长度从小到大排列。其中,预设移动条件可以为:查找价值信息线段树并找到移动价值最大的节点后,就可以快速地从链表中找到移动数据量最小的线段。
进一步地,基于S106中的Step1,在移动价值最大的链表中选取移动数据量小于或等于数据移动门限值的存储空间的步骤包括:
a,在移动价值最大的链表中选取最小移动数据量的存储空间,判断最小移动数据量是否小于或等于数据移动门限值;
b,若最小移动数据量小于或等于数据移动门限值,则将最小移动数据量对应的存储空间作为满足预设移动条件的存储空间;
c,若最小移动数据量大于数据移动门限值,则查询价值信息线段树中小于移动价值最大的链表,并在链表中依据数据移动门限值,匹配移动数据量小于或等于数据移动门限值的存储空间。
具体的,如果该线段的长度依然大于门限值,比如4MBytes,那么就需要继续访问价值信息线段树,查找下一个节点。该节点的移动价值应最接近最大的移动价值。如此递归进行,直到找到符合要求的节点,或者将价值信息线段树遍历完。依据log复杂度,则可以获得需要移动的对象的集合,即,本实施例中需要移动的存储空间。
进一步地,在预设函数包括:确切分配函数,和/或多对象分配函数的情况下,步骤S108中将存储空间移动至目标存储空间的步骤包括:
Step1,依据确切分配函数在对象数据区中,匹配与存储空间大小相等的存储空间,并将存储空间内的数据移动至匹配得到的目标存储空间中;
Step2,若对存储空间匹配对应存储空间后存在剩余存储空间,则依据多对象分配函数匹配与剩余存储空间大小相等的存储空间,并将将剩余存储空间中的数据移动至匹配得到的存储空间中。
具体的,本实施例针对对象数据区与中的每个存储空间,调用确切分配函数,尝试进行确切的分配,即分配的空闲存储空间大小正好和该存储空间的大小一致。若找不到存储空间大小正好一致的空闲存储空间,则会放弃分配操作。
此外,如果该存储空间匹配对应存储空间后存在剩余存储空间,则通过切割大于该存储空间大小的空闲存储空间,依据该剩余存储空间的大小分配空闲的存储空间。
进一步地,基于步骤S108中的Step2中在依据多对象分配函数匹配与剩余存储空间大小相等的存储空间的步骤包括:
a,计算剩余存储空间的存储量;
b,依据存储量通过调用多对象分配函数在对象数据区中,匹配与剩余存储空间大小相等的存储空间。
具体的,基于步骤S108中的Step2,在将剩余存储空间中的数据移动至匹配得到的存储空间过程中,需要首先计算剩余对象总的存储量,然后再以该存储量,调用多对象分配函数,为多个对象对应的该存储量分配空间。其中,该函数先找依据存储空间的大小匹配存储空间大小相等的存储空间的分配,如果找不到的话,则进一步的对大于该存储空间的存储空间空间进行切割,从而得到与该存储空间大小相等的存储空间。
此外,除本实施例中步骤S106和S108中分别对如何确定需要移动的存储空间,以及获取该存储空间的目标存储空间进行了叙述,而该存储空间如何移动如下:由于对象移动的触发,通常都是在线程堆所属的线程环境中运行,因此若还在该环境中执行耗时的对象移动操作,将会影响上层业务。所以,创建一个新线程,由该线程执行具体的对象移动操作。创建新线程的同时,会将移动的对象集合、移动的目的地信息交给新线程。
新线程被创建起来之后,将从其启动参数中获取到移动对象集合和移动目的地等信息。然后,针对每一个对象,都执行一次写事务。在写事务开始之前,如果进程崩溃或系统宕机,之前分配的目的地空间并不会丢失。这是由于托管列表的存在。在进行对象移动时,写事务首先会占有被移动对象,假设为A。然后,将A的数据区内容,写入到目的地对象B的数据区。接着,交换A和B的元数据部分。注意,该步骤需要记录日志。最后,写事务放弃对A的占有,并执行事务提交。
这里有几点需要说明。第一,如果对象A被其他写事务占有,则先移动其他的对象。该步骤执行完之后,再移动剩余的对象。若此时还被占用,则采用随机等待一段时间的方式,再尝试占有。尝试数次后,放弃本次移动,线程结束运行。尝试的次数,随机等待的时间范围可设置。第二,按照上述步骤移动数据,依然会出现读事务访问老地址的情况。通常情况下,这不会带来逻辑上的错误。因为,软件事务存储机制会在事务提交时更新对象的时间戳信息。第三,线程结束运行时,才会主动释放B所占的空间。这样一来,就使得对象原存储空间不会过早回收,进一步保证了第二点提到的情形下的逻辑正确性。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
在本实施例中还提供了一种内存碎片整理装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图2是根据本发明实施例的内存碎片整理装置的结构框图,如图2所示,该装置包括:划分模块22,查询模块24,选取模块26和移动模块28,其中,
划分模块22,用于将目标应用程序划分多个线程;
查询模块24,与划分模块22建立电连接,用于在对目标应用程序进行碎片整理时,查询每个线程中价值信息线段树中移动价值最大的链表,链表携带移动价值相同的存储空间,价值信息线段树用于查询每个链表的移动价值,移动价值用于衡量碎片整理时存储空间对应的分配或释放的价值;
选取模块26,与查询模块24建立电连接,用于在移动价值最大的链表中选取满足预设移动条件的存储空间;
移动模块28,与选取模块26建立电连接,用于将存储空间移动至目标存储空间。
进一步地,图3是根据本发明实施例的一种内存碎片整理装置的结构框图,如图3所示,选取模块26包括:第一选取单元261和第二选取单元262,其中,
第一选取单元261,用于依据目标应用程序对应的数据移动门限值,在移动价值最大的链表中选取移动数据量小于或等于数据移动门限值的存储空间;
第二选取单元262,与第一选取单元261建立电连接,用于将移动数据量小于或等于数据移动门限值的存储空间作为满足预设移动条件的存储空间。
进一步地,图4是根据本发明实施例的另一种内存碎片整理装置的结构框图,如图4所示,第一选取单元261包括:第一选取子单元2611,第二选取子单元2612和匹配子单元2613,其中,
第一选取子单元2611,用于在移动价值最大的链表中选取最小移动数据量的存储空间,判断最小移动数据量是否小于或等于数据移动门限值;
或者,
第二选取子单元2612,用于在最小移动数据量小于或等于数据移动门限值的情况下,将最小移动数据量对应的存储空间作为满足预设移动条件的存储空间;
或者,
匹配子单元2613,用于若最小移动数据量大于数据移动门限值,则查询价值信息线段树中小于移动价值最大的链表,并在链表中依据数据移动门限值,匹配移动数据量小于或等于数据移动门限值的存储空间。
进一步地,图5是根据本发明实施例的又一种内存碎片整理装置的结构框图,如图5所示,在预设函数包括:确切分配函数,和/或多对象分配函数的情况下,移动模块28包括:空间匹配单元281和移动单元282,其中,
空间匹配单元281,用于依据确切分配函数在对象数据区中,匹配与存储空间大小相等的存储空间,并将存储空间内的数据移动至匹配得到的目标存储空间中;
移动单元282,与空间匹配单元281建立电连接,用于在对存储空间匹配对应存储空间后存在剩余存储空间的情况下,依据多对象分配函数匹配与剩余存储空间大小相等的存储空间,并将将剩余存储空间中的数据移动至匹配得到的存储空间中。
进一步地,图6是根据本发明实施例的再一种内存碎片整理装置的结构框图,如图6所示,移动单元282包括:计算子单元2821和匹配子单元2822,其中,
计算子单元2821,用于计算剩余存储空间的存储量;
匹配子单元2822,与计算子单元2821建立电连接,用于依据存储量通过调用多对象分配函数在对象数据区中,匹配与剩余存储空间大小相等的存储空间。
需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述模块分别位于多个处理器中。
本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的程序代码:
S1,将目标应用程序划分多个线程;
S2,在对目标应用程序进行碎片整理时,查询每个线程中价值信息线段树中移动价值最大的链表,其中,该链表携带移动价值相同的存储空间,该价值信息线段树用于查询每个链表的移动价值,该移动价值用于衡量碎片整理时存储空间对应的分配或释放的价值;
S3,在移动价值最大的链表中选取满足预设移动条件的存储空间;
S4,将存储空间移动至目标存储空间。
可选地,存储介质还被设置为存储用于执行以下步骤的程序代码:
S1,依据目标应用程序对应的数据移动门限值,在移动价值最大的链表中选取移动数据量小于或等于数据移动门限值的存储空间;
S2,将移动数据量小于或等于数据移动门限值的存储空间作为满足预设移动条件的存储空间。
可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
可选地,在本实施例中,处理器根据存储介质中已存储的程序代码执行在移动价值最大的链表中选取移动数据量小于或等于数据移动门限值的存储空间的步骤包括:在移动价值最大的链表中选取最小移动数据量的存储空间,判断最小移动数据量是否小于或等于数据移动门限值;若最小移动数据量小于或等于数据移动门限值,则将最小移动数据量对应的存储空间作为满足预设移动条件的存储空间;若最小移动数据量大于数据移动门限值,则查询价值信息线段树中小于移动价值最大的链表,并在链表中依据数据移动门限值,匹配移动数据量小于或等于数据移动门限值的存储空间。
可选地,在本实施例中,处理器根据存储介质中已存储的程序代码执行在预设函数包括:确切分配函数,和/或多对象分配函数的情况下,将存储空间移动至目标存储空间的步骤包括:依据确切分配函数在对象数据区中,匹配与存储空间大小相等的存储空间,并将存储空间内的数据移动至匹配得到的目标存储空间中;若对存储空间匹配对应存储空间后存在剩余存储空间,则依据多对象分配函数匹配与剩余存储空间大小相等的存储空间,并将将剩余存储空间中的数据移动至匹配得到的存储空间中。
可选地,在本实施例中,处理器根据存储介质中已存储的程序代码执行在依据多对象分配函数匹配与剩余存储空间大小相等的存储空间的步骤包括:计算剩余存储空间的存储量;依据存储量通过调用多对象分配函数在对象数据区中,匹配与剩余存储空间大小相等的存储空间。
可选地,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。
具体的,本实施例提供的一种内存碎片整理方法是基于持久化对的基本模型,以及在对目标应用程序进行碎片整理的过程中,通过应用线段树的功能实现的,具体如下:
首先介绍持久化堆的基本模型和本实施例所用的线段树,并在此基础之上,说明如何维护该线段树,以及如何利用线段树进行对象移动。
第一,持久化堆模型
同构建于DRAM上的许多普通堆类似,为了充分利用多核资源、提高程序运行的并发性,持久化堆会为需要使用持久化存储的每个线程,创建一个持久化的线程堆。通常情况下,持久化堆除了维护若干线程堆外,还会提供一个用于后备存储的中心堆。当线程堆的空闲空间不够时,会向中心堆申请空间。反之,当线程堆的空闲空间过多时,会向中心堆归还空间。
从线程堆中分配到的对象,必须要符合图7所示的对象模型。即持久化堆既会为对象分配数据区,也会为其分配元数据区,并使元数据指向数据区;外部程序访问对象时,需要通过智能指针,且智能指针指向对象的元数据。持久化堆除了提供类似于malloc的分配函数外,还需要提供以下两种方式的分配函数。第一,确切分配函数。即,被分配的空闲空间大小正好和对象的大小一致,无需对空闲空间进行切割。若该接口找不到空间大小正好一致的空闲空间,则会放弃分配操作。第二,多对象分配函数。即,一次性可以分配多个对象,且这些对象的数据区都连在一起。当对象被分配出来之后,会将对象放入每个线程堆维护的已分配对象的托管列表中。通过该列表,可以实现垃圾回收。
除了上述假设外,在本实施例中,持久化堆还应提供常见的软件事务存储机制,比如LSA(Lazy Snapshot Algorithm)算法,以使得应用程序可以获得良好的并发性。
第二,数据结构
如前所述,本实施例是以线程堆为单位进行对象移动,即碎片整理。所以,下面只需要讨论一个线程堆中的情况即可。
为了避免在对象移动中对全局存储空间进行扫描,本实施例在每个线程堆的分配和释放操作过程中,跟踪空闲空间和已分配空间情况,以便在执行对象移动操作前选出最有利的移动对象集合和移动目的地。而线程堆跟踪存储空间的方法,即建立两棵线段树。下面首先对这两棵线段树进行说明。
为了简化讨论,我们假设线程堆的数据存储空间只包含一个连续的空间,并可以将此空间视作一条直线。线程堆中分配出去的、被对象占用的空间可以视为直线上的一条线段。显然,这个线段内部可能包含一个或多个对象。而每条线段之外,要么是空闲空间,要么就是线程堆数据存储空间的边界。因此,这些线段一定是互不相交的。本实施例中为每个线程堆建立的第一棵线段树,即以这些线段的起始地址作为key的红黑树。而该树的每个节点除了相应的父节点、左右孩子节点外,还需要存储节点对应的线段的位置、长度等信息。为了便于讨论,我们将这颗红黑树称为位置信息线段树。
除了位置信息线段树外,本实施例还为每个线程堆建立了第二棵树,以跟踪最具移动价值的对象组合,即位置信息线段树中的各个线段。下面首先介绍线段移动价值的概念。比如,存在线段[a,b]、[c,d]、[e,f],其中b<c-1、d<e-1,且[a,b]、[c,d]之间,[c,d]、[e,f]之间再无其他线段。线段[c,d]的移动价值,v([c,d])就是将其移走之后能够得到的连续空闲空间大小。很显然,v([c,d])=e-b-1。本实施例要建立的第二棵树,即是以线段的移动价值作为key的红黑树。而该树的每个节点除了相应的父节点、左右孩子节点外,还需要存储节点对应的线段的位置、长度、线段价值等信息。为了便于讨论,我们将这颗红黑树称为价值信息线段树。显然,通过查找该树,我们能够找到最具移动价值的线段,即指移动该线段后能够得到的连续空闲空间最大。
这里几点需要说明。首先,在价值信息线段树中,可能存在移动价值相同的若干线段。这些线段会被组织在一个链表中,由价值信息线段树中对应的节点指向。也就是说,节点代表了一组移动价值相同的线段。在这个链表中,每个元素即线段是按照一定顺序排列的。该顺序,即线段对应的存储空间由小到大的顺序。
其次,在逻辑层面上位置信息线段树和价值信息线段树是两棵独立的树,但在实现中完全可以将其实现成一棵树,只是共存了两棵树的各个节点指针而已。
第三,由于线程堆可以向中心堆反复申请空间或归还空间,所以线程堆的存储空间不一定是连续的。也就是说,并不是在一条连续的直线上进行线段操作。由于一个对象不可能跨越不连续的空间,并且只要操作线段树时判断线段是否处于一段连续空间的边界,那么线程堆中即使存在多个不连续存储空间的情况,也不会对两棵线段树的操作造成逻辑上的错误。
最后,这两棵线段树既可以存储在DRAM空间中,也可以存储在NVM中。若存储在DRAM中,在进程启动时需要重建这两棵线段树。
第三,存储空间信息跟踪
当线程堆分配、释放空间,从中心堆分配空间,线程堆归还空间时,通常都会影响到对象移动的决策,都会涉及到对位置信息线段树和价值信息线段树的修改。下面就对这些场景下,两棵线段树的修改进行描述。
首先,空间分配
当线程堆分配空间给上层应用时,所分配的空间一定是在空闲空间的两端之一,不可能在空闲空间中间分配。首先假设线程堆存在一个连续的存储空间,其范围是[m,n],下面仅讨论在该连续空间上分配的情况。对于存在多个连续空间场景的处理,情况类似,线段都会被组织进当前线程堆对应的两棵线段树中,而不管其是否属于不同的连续空间。只要在处理过程中,考虑连续空间的边界,就不会有逻辑错误。接下来,分几种情况讨论线段树的更新。
1.假设[m,n]范围内并无任何线段,此时线程堆分配的空间是[i,j],其中i=m,j<=n或m<=i,j=n。
a,对于位置信息线段树而言,插入节点[i,j]。
b,对于价值信息线段树而言,插入节点[i,j],v([i,j])=m-n+1。这里需要注意,虽然该线段有可能无法移动到其他空间,但也将其移动价值设为整个连续空间大小。因为关注的是移动价值之间的相对值而已。
2.假设存在线段[a,b]、[c,d]、[e,f]、[g,h],其中m<=a、b<c、d<e、f<g、h<=n,且任意线段之间再无其他线段,线程堆分配的空间是[i,j],i=d+1,j<e-1,此时,线段[c,d]和线段[i,j]可以合并成一个线程[c,j],即将位置线段树中[c,d]对应的节点扩展而已。
a,对于位置信息线段树而言,需要查找线段[c,d],然后修改其以变成[c,j]。
b,对于价值信息线段树而言,[i,j]的加入只会对[e,f]有影响,而对[a,b]、原[c,d]和[g,h]无影响。v([e,f])=g-j-1,即v([e,f])=v([e,f])-(j-i+1)。对价值信息线段树的修改,相当于先删除节点[e,f],再以新的移动价值将[e,f]插入。
3.假设存在线段[a,b]、[c,d]、[e,f]、[g,h],其中m<=a、b<c、d<e、f<g、h<=n,且任意线段之间再无其他线段,线程堆分配的空间是[i,j],j=e-1,d+1<i,此时,线段[e,f]和线段[i,j]可以合并成一个线程[i,f],即将位置线段树中[e,f]对应的节点扩展而已。
a,对于位置信息线段树而言,需要查找线段[e,f],然后修改其以变成[i,f]。
b,对于价值信息线段树而言,[i,j]的加入只会对[c,d]有影响,而对[a,b]、原[e,f]和[g,h]无影响。v([c,d])=i-b-1,即v([c,d])=v([c,d])-(j-i+1)。对价值信息线段树的修改,相当于先删除节点[c,d],再以新的移动价值将[c,d]插入。
4.假设存在线段[a,b]、[c,d]、[e,f]、[g,h],其中m<=a、b<c、d<e、f<g、h<=n,且任意线段之间再无其他线段,线程堆分配的空间是[i,j],i=d+1,j=e-1,此时,线段[c,d]、[i,j]、[e,f]可以合并成一个线程[c,f]。
a,对于位置信息线段树而言,查找[c,d]或[e,f],对[c,d]或[e,f]对应的节点扩展变成[c,f],并删除[e,f]或[c,d]对应的节点。
b,对于价值信息线段树而言,[i,j]的加入对[a,b]和[g,h]无影响。v([c,f])=g-b-1。对价值信息线段树的修改,相当于先删除节点[c,d]和[e,f],再以新的移动价值将[c,f]插入。
5.假设存在线段[a,b],其中m<a-1、b<=n,从m到a再无线段,线程堆分配的空间是[i,j],i=m,j<a-1。
a,对于位置信息线段树而言,将插入新节点[i,j]。
b,对于价值信息线段树而言,将插入新节点[i,j],其v([i,j])=a-m;同时删除节点[a,b],修改v([a,b])=v([a,b])-(j-i+1),再插入节点[a,b]。
6.假设存在线段[a,b],其中m<a-1、b<=n,从m到a再无线段。线程堆分配的空间是[i,j],i>=m,j=a-1,此时,线段[a,b]和线段[i,j]可以合并成一个线程[i,b],即将位置线段树中[a,b]对应的节点扩展而已。
a,对于位置信息线段树而言,需要查找线段[a,b],然后修改其以变成[i,b]。
b,对于价值信息线段树而言,v([i,b])=v([a,b]),即相当于将原[a,b]节点扩展而已。
7.假设存在线段[a,b],其中m<=a、b<n-1,从b到n再无线段。线程堆分配的空间是[i,j],j=n,b<i-1。
a,对于位置信息线段树而言,将插入新节点[i,j]。
b,对于价值信息线段树而言,将插入新节点[i,j],其v([i,j])=n-b;同时删除节点[a,b],修改v([a,b])=v([a,b])-(j-i+1),再插入节点[a,b]。
8.假设存在线段[a,b],其中m<=a、b<n-1,从b到n再无线段。线程堆分配的空间是[i,j],j<=n,b=i-1。此时,线段[a,b]和线段[i,j]可以合并成一个线程[a,j],即将位置线段树中[a,b]对应的节点扩展而已。
a,对于位置信息线段树而言,需要查找线段[a,b],然后修改其以变成[a,j]。
b,对于价值信息线段树而言,v([a,j])=v([a,b]),即相当于将原[a,b]节点扩展而已。
上面介绍了内存分配场景下,各种情况对线段树的影响,下面说明基本的操作流程。首先,获取到当前线程堆分配的空间[i,j]。然后根据端点值i,在位置信息线段树中进行查找。找到与[i,j]相邻的线段后,再根据连续空间的边界情况,判断当前的分配场景,是上述1到8中的哪一个。最后,按照上述1到8项的描述更新两棵线段树。
其次,空间释放
空间释放操作,也会对位置信息线段树和价值信息线段树产生影响。被释放的内存,一定可以在线段树中找到一个线段,使得释放内存对应的线段,是被找到的线段的子集或者就是同一个线段。根据线段位置关系和被释放内存的位置信息,我们可以从以下几种情况讨论线段树的更新。同样的,假设线程堆存在一个连续的存储空间,其范围是[m,n]。
1.假设存在线段[a,b]、[c,d]、[e,f],其中m<=a、b<c、d<e、f<=n,且任意线段之间再无其他线段,被归还的空间是[i,j],c<i,j<d。
a,对于位置信息线段树而言,[c,d]将被分割成[c,i-1]和[j+1,d]。即,删除节点[c,d],加入节点[c,i-1]和[j+1,d]。
b,对于价值信息线段树而言,也需要删除节点[c,d],加入节点[c,i-1]和[j+1,d]。其中,v([c,i-1])=j-b,v([j+1,d])=e-i。
2.假设存在线段[a,b]、[c,d]、[e,f],其中m<=a、b<c、d<e、f<=n,且任意线段之间再无其他线段,被归还的空间是[i,j],c=i,j=d。
a,对于位置信息线段树而言,删除节点[i,j]。
b,对于价值信息线段树而言,也需要删除节点[i,j],并且,还需要删除节点[a,b]、[e,f]。v([a,b])=v([a,b])+e-i,v([e,f])=v([e,f])+j-b,再插入节点[a,b]、[e,f]。
3.假设存在线段[a,b]、[c,d]、[e,f],其中m<=a、b<c、d<e、f<=n,且任意线段之间再无其他线段,被归还的空间是[i,j],c=i,j<d。
a,对于位置信息线段树而言,将节点[c,d]缩减到[j+1,d]。
b,对于价值信息线段树而言,由于v([j+1,d])=v([c,d]),所以只需要更改节点[c,d]。但需要删除节点[a,b],再使,v([a,b])=v([a,b])+(j-i+1),再插入[a,b]。
4.假设存在线段[a,b]、[c,d]、[e,f],其中m<=a、b<c、d<e、f<=n,且任意线段之间再无其他线段,被归还的空间是[i,j],j=d,c<i。
a,对于位置信息线段树而言,将节点[c,d]缩减到[c,i-1]。
b,对于价值信息线段树而言,由于v([c,i-1])=v([c,d]),所以只需要更改节点[c,d]。但需要删除节点[e,f],再使,v([e,f])=v([e,f])+(j-i+1),再插入[e,f]。
5.假设存在线段[a,b]、[c,d],其中m<=a、b<c、d<=n,且任意线段之间、m到a之间再无其他线段,被归还的空间是[i,j],a<i,j<b。
a,对于位置信息线段树而言,[a,b]将被分割成[a,i-1]和[j+1,b]。即,删除节点[a,b],加入节点[a,i-1]和[j+1,b]。
b,对于价值信息线段树而言,也需要删除节点[a,b],加入节点[a,i-1]和[j+1,b]。其中,v([a,i-1])=j+1-m,v([j+1,b])=c-i。
6.假设存在线段[a,b]、[c,d],其中m<=a、b<c、d<=n,且任意线段之间、m到a之间再无其他线段,被归还的空间是[i,j],a=i,j=b。
a,对于位置信息线段树而言,删除节点[a,b]。
b,对于价值信息线段树而言,需要删除节点[a,b]、[c,d],v([c,d])=v([c,d])+b-m+1,再插入节点[c,d]。
7.假设存在线段[a,b]、[c,d],其中m<=a、b<c、d<=n,且任意线段之间、m到a之间再无其他线段,被归还的空间是[i,j],a=i,j<b。
a,对于位置信息线段树而言,将节点[a,b]缩减到[j+1,b]。
b,对于价值信息线段树而言,v([j+1,b])=v([a,b]),即保持不变,无需做任何修改。
8.假设存在线段[a,b]、[c,d],其中m<=a、b<c、d<=n,且任意线段之间、m到a之间再无其他线段,被归还的空间是[i,j],a<i,j=b。
a,对于位置信息线段树而言,将节点[a,b]缩减到[a,i-1]。
b,对于价值信息线段树而言,v([a,i-1])=v([a,b]),即保持不变,无需做任何修改。而v([c,d])=v([c,d])+(j-i+1),即需要删除[c,d],再更改v([c,d]),最后插入[c,d]。
9.假设存在线段[a,b]、[c,d],其中m<=a、b<c、d<=n,且任意线段之间、d到n之间再无其他线段,被归还的空间是[i,j],c<i,j<d。
a,对于位置信息线段树而言,[c,d]将被分割成[c,i-1]和[j+1,d]。即,删除节点[a,b],加入节点[c,i-1]和[j+1,d]。
b,对于价值信息线段树而言,也需要删除节点[c,d],加入节点[c,i-1]和[j+1,d]。其中,v([c,i-1])=j-b,v([j+1,d])=n-i+1。
10.假设存在线段[a,b]、[c,d],其中m<=a、b<c、d<=n,且任意线段之间、d到n之间再无其他线段,被归还的空间是[i,j],c=i,j=d。
a,对于位置信息线段树而言,删除节点[c,d]。
b,对于价值信息线段树而言,需要删除节点[a,b]、[c,d],v([a,b])=v([a,b])+n-c+1,再插入节点[a,b]。
11.假设存在线段[a,b]、[c,d],其中m<=a、b<c、d<=n,且任意线段之间、d到n之间再无其他线段,被归还的空间是[i,j],c=i,j<d。
a,对于位置信息线段树而言,将节点[c,d]缩减到[j+1,d]。
b,对于价值信息线段树而言,v([j+1,d])=v([c,d]),即保持不变,无需做任何修改。而v([a,b])=v([a,b])+(j-i+1),即需要删除[a,b],再更改v([a,b]),最后插入[a,b]。
12.假设存在线段[a,b]、[c,d],其中m<=a、b<c、d<=n,且任意线段之间、d到n之间再无其他线段,被归还的空间是[i,j],c<i,j=d。
a,对于位置信息线段树而言,将节点[c,d]缩减到[c,i-1]。
b,对于价值信息线段树而言,v([c,i-1])=v([c,d]),即保持不变,无需做任何修改。
13.假设[m,n]中只存在线段[a,b],即m<=a、b<=n,被归还的空间是[i,j],a<i,j<b。
a,对于位置信息线段树而言,[a,b]将被分割成[a,i-1]和[j+1,b]。即,删除节点[a,b],加入节点[a,i-1]和[j+1,b]。
b,对于价值信息线段树而言,也需要删除节点[a,b],加入节点[a,i-1]和[j+1,b]。其中,v([a,i-1])=j-m+1,v([j+1,b])=n-i+1。
14.假设[m,n]中只存在线段[a,b],即m<=a、b<=n,被归还的空间是[i,j],a=i,j=b。
a,对于位置信息线段树而言,删除节点[a,b]。
b,对于价值信息线段树而言,也需要删除节点[a,b]。
15.假设[m,n]中只存在线段[a,b],即m<=a、b<=n,被归还的空间是[i,j],a=i,j<b。
a,对于位置信息线段树而言,将节点[a,b]缩减到[j+1,b]。
b,对于价值信息线段树而言,v([j+1,b])=v([a,b]),即保持不变,无需做任何修改。
16.假设[m,n]中只存在线段[a,b],即m<=a、b<=n,被归还的空间是[i,j],a<i,j=b。
a,对于位置信息线段树而言,将节点[a,b]缩减到[a,i-1]。
b,对于价值信息线段树而言,v([a,i-1])=v([a,b]),即保持不变,无需做任何修改。
上面介绍了空间释放场景下,各种情况对线段树的影响,下面说明基本的操作流程。首先,获取到释放的空间[i,j]。然后根据端点值i,在位置信息线段树中进行查找。找到包含了[i,j]的线段后,再根据相邻线段和连续空间的边界情况,判断当前的分配场景,是上述1到16中的哪一个。最后,按照上述1到16项的描述更新两棵线段树。
第三,从中心堆获得空间
当线程堆空间不够时,会从中心堆分配空间。即,会对线程堆维护的两棵线段树产生影响。下面分若干种情况,对此加以讨论。
1.从中心堆获得的连续空间,若与线程堆已有的连续空间均不相连,则仅需要保存该空间位置信息即可,无需对线段树进行修改。
2.从中心堆获得的连续空间,若与线程堆已有的连续空间中的一个或两个相连,且这些相连的空间均不存在线段,即还未分配,则仅需要将这些相连的空间合并成一个空间,并保持合并后空间的位置信息,而无需对线段树进行修改。
3.假设从中心堆获得的连续空间[m,n],仅与线程堆已有的连续空间[p,q]相连,且后者存在一个线段[a,b],其中,n+1=p、p<=a、p与a之间不存在其他线段,或q+1=m、b<=q、q与b之间不存在其他线段,则,v([a,b])=v([a,b])+n-m+1,即从价值信息线段树中,删除[a,b],再修改v([a,b]),最后再插入[a,b]。
4.假设从中心堆获得的连续空间[m,n],与线程堆已有的连续空间[p,q]、[r,s]相连。其中,[p,q]存在一个线段[a,b],n+1=p,p<=a,p与a之间不存在其他线段;[r,s]存在一个线段[c,d],s+1=m,d<=s,s与d之间不存在其他线段,则,需要从价值信息线段树中,删除[a,b]和[c,d],再修改v([a,b])=v([a,b])+n-m+1+s-d、v([c,d])=v([c,d])+n-m+1+a-p,最后再插入[a,b]和[c,d]。
当从中心堆获得存储空间后,首先将其与之前保存的连续空间进行比较,判断与哪些空间是相连的。之后,再通过位置信息线段树查找相连空间中,与从中心堆获得空间相邻的线段。查找的方式即在位置信息线段树中,搜索新获得的空间的端点。找到之后,根据上述1到4种情况,分别进行处理即可。
第四,向中心堆归还空间
当线程堆中空闲空间过多时,线程堆会将一部分空闲空间归还给中心堆。如此一来,就有可能对两棵线段树产生影响。下面分若干种情况,对此加以讨论。
1.假设被归还的空间,与线程堆已有的连续空间均不相连,则只需要将该空间信息删去即可,无需更改两棵线段树。
2.假设被归还的空间,与线程堆已有的连续空间中的一个或两个相连,且这些相连的空间均不存在线段,即还未分配,则只需要将该空间信息删去即可,无需更改两棵线段树。
3.假设被归还的空间[m,n],仅与线程堆已有的连续空间[p,q]相连,且后者存在一个线段[a,b],其中,n+1=p、p<=a、p与a之间不存在其他线段,或q+1=m、b<=q、q与b之间不存在其他线段,则,v([a,b])=v([a,b])-(n-m+1),即从价值信息线段树中,删除[a,b],再修改v([a,b]),最后再插入[a,b]。
4.假设被归还的空间[m,n],与线程堆已有的连续空间[p,q]、[r,s]相连。其中,[p,q]存在一个线段[a,b],n+1=p,p<=a,p与a之间不存在其他线段;[r,s]存在一个线段[c,d],s+1=m,d<=s,s与d之间不存在其他线段,需要从价值信息线段树中,删除[a,b]和[c,d],再修改v([a,b])=v([a,b])-(n-m+1+s-d)、v([c,d])=v([c,d])-(n-m+1+a-p),最后再插入[a,b]和[c,d]。
当向中心堆归还存储空间时,首先将其与之前保存的连续空间进行比较,判断与哪些空间是相连的。之后,再通过位置信息线段树查找相连空间中,与向中心堆归还空间相邻的线段。查找的方式即在位置信息线段树中,搜索要归还空间的端点。找到之后,根据上述1到4种情况,分别进行处理即可。
当对象移动完毕之后,就需要更新被移动对象的引用。在本实施例中,所有的对象都应符合图7的模型要求。当有多个对象引用某一个对象时,这些对象必须通过智能指针才能访问被引用对象,其基本模型如图8所示。从图8可以看出,对象移动完毕后,只需要修改对象元数据区中指向数据区的指针,即可达到对象引用更新的目的。
此外,本实施例与相关技术的区别在于:首先,本实施例所设计的内存碎片整理机制,是专门针对持久化堆的。而现有的内存碎片整理机制,基本上是针对DRAM上的普通堆。对于普通堆的碎片整理而言,是不用考虑系统故障或进程崩溃所带来的不一致问题。而本实施例,则通过使用undo类型的日志,记录了碎片整理过程对元数据的修改。
其次,本实施例所设计的内存碎片整理机制,避免了全局扫描操作对上层业务运行的较大影响。如前所述,本实施例会在持久化堆进行分配、释放、扩容、缩减等操作时,更新所维护的两棵线段树,而更新的复杂度仅是O(logn);每当定时器超时时,需要确定移动的对象集合和目的地,而该操作的复杂度也仅为O(logn)。显然,与全局扫描的复杂度O(n)相比,本实施例带来的时间开销要小很多。
第三,本实施例所设计的内存碎片整理机制,在进行被移动对象引用更新时,避免了遍历所有对象或所有引用了被移动对象的对象。本实施例只需要更新被移动对象的元数据,其时间复杂度为O(1)。
第四,本实施例所设计的内存碎片整理机制,具有良好的并发性。本实施例是以线程堆为碎片整理单位,多个线程堆可以并发地进行碎片整理。如此一来,即提高了碎片整理的并发性。另外,在本实施例中,对象移动的过程被设计成了软件事务存储中的一个写事务。这样,有助于对象移动和上层业务的并发执行。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种内存碎片整理方法,其特征在于,包括:
将目标应用程序划分多个线程;
在对所述目标应用程序进行碎片整理时,查询每个线程中价值信息线段树中移动价值最大的链表,所述链表携带移动价值相同的存储空间,所述价值信息线段树用于查询每个链表的移动价值,所述移动价值用于衡量碎片整理时存储空间对应的分配或释放的价值;
在所述移动价值最大的链表中选取满足预设移动条件的存储空间;
将所述存储空间移动至目标存储空间。
2.根据权利要求1所述的方法,其特征在于,所述在所述移动价值最大的链表中选取满足预设移动条件的存储空间的步骤包括:
依据所述目标应用程序对应的数据移动门限值,在所述移动价值最大的链表中选取移动数据量小于或等于所述数据移动门限值的存储空间;
将移动数据量小于或等于所述数据移动门限值的存储空间作为满足预设移动条件的存储空间。
3.根据权利要求2所述的方法,其特征在于,在所述移动价值最大的链表中选取移动数据量小于或等于所述数据移动门限值的存储空间的步骤包括:
在所述移动价值最大的链表中选取最小移动数据量的存储空间,判断所述最小移动数据量是否小于或等于所述数据移动门限值;
若所述最小移动数据量小于或等于所述数据移动门限值,则将所述最小移动数据量对应的存储空间作为满足所述预设移动条件的存储空间;
若所述最小移动数据量大于所述数据移动门限值,则查询所述价值信息线段树中小于所述移动价值最大的链表,并在所述链表中依据所述数据移动门限值,匹配移动数据量小于或等于所述数据移动门限值的存储空间。
4.根据权利要求1所述的方法,其特征在于,在预设函数包括:确切分配函数,和/或多对象分配函数的情况下,将所述存储空间移动至目标存储空间的步骤包括:
依据所述确切分配函数在对象数据区中,匹配与所述存储空间大小相等的存储空间,并将所述存储空间内的数据移动至匹配得到的目标存储空间中;
若对所述存储空间匹配对应存储空间后存在剩余存储空间,则依据所述多对象分配函数匹配与所述剩余存储空间大小相等的存储空间,并将将所述剩余存储空间中的数据移动至匹配得到的存储空间中。
5.根据权利要求4所述的方法,其特征在于,在依据所述多对象分配函数匹配与所述剩余存储空间大小相等的存储空间的步骤包括:
计算所述剩余存储空间的存储量;
依据所述存储量通过调用所述多对象分配函数在所述对象数据区中,匹配与所述剩余存储空间大小相等的存储空间。
6.一种内存碎片整理装置,其特征在于,包括:
划分模块,用于将目标应用程序划分多个线程;
查询模块,用于在对所述目标应用程序进行碎片整理时,查询每个线程中价值信息线段树中移动价值最大的链表,所述链表携带移动价值相同的存储空间,所述价值信息线段树用于查询每个链表的移动价值,所述移动价值用于衡量碎片整理时存储空间对应的分配或释放的价值;
选取模块,用于在所述移动价值最大的链表中选取满足预设移动条件的存储空间;
移动模块,用于将所述存储空间移动至目标存储空间。
7.根据权利要求6所述的装置,其特征在于,所述选取模块包括:
第一选取单元,用于依据所述目标应用程序对应的数据移动门限值,在所述移动价值最大的链表中选取移动数据量小于或等于所述数据移动门限值的存储空间;
第二选取单元,用于将移动数据量小于或等于所述数据移动门限值的存储空间作为满足预设移动条件的存储空间。
8.根据权利要求7所述的装置,其特征在于,所述第一选取单元包括:
第一选取子单元,用于在所述移动价值最大的链表中选取最小移动数据量的存储空间,判断所述最小移动数据量是否小于或等于所述数据移动门限值;
第二选取子单元,用于在所述最小移动数据量小于或等于所述数据移动门限值的情况下,将所述最小移动数据量对应的存储空间作为满足所述预设移动条件的存储空间;
匹配子单元,用于若所述最小移动数据量大于所述数据移动门限值,则查询所述价值信息线段树中小于所述移动价值最大的链表,并在所述链表中依据所述数据移动门限值,匹配移动数据量小于或等于所述数据移动门限值的存储空间。
9.根据权利要求6所述的装置,其特征在于,在预设函数包括:确切分配函数,和/或多对象分配函数的情况下,所述移动模块包括:
空间匹配单元,用于依据所述确切分配函数在对象数据区中,匹配与所述存储空间大小相等的存储空间,并将所述存储空间内的数据移动至匹配得到的目标存储空间中;
移动单元,用于在对所述存储空间匹配对应存储空间后存在剩余存储空间的情况下,依据所述多对象分配函数匹配与所述剩余存储空间大小相等的存储空间,并将将所述剩余存储空间中的数据移动至匹配得到的存储空间中。
10.根据权利要求9所述的装置,其特征在于,所述移动单元包括:
计算子单元,用于计算所述剩余存储空间的存储量;
匹配子单元,用于依据所述存储量通过调用所述多对象分配函数在所述对象数据区中,匹配与所述剩余存储空间大小相等的存储空间。
CN201510270858.4A 2015-05-25 2015-05-25 内存碎片整理方法及装置 Active CN106294189B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN201510270858.4A CN106294189B (zh) 2015-05-25 2015-05-25 内存碎片整理方法及装置
PCT/CN2015/087707 WO2016187975A1 (zh) 2015-05-25 2015-08-20 内存碎片整理方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510270858.4A CN106294189B (zh) 2015-05-25 2015-05-25 内存碎片整理方法及装置

Publications (2)

Publication Number Publication Date
CN106294189A true CN106294189A (zh) 2017-01-04
CN106294189B CN106294189B (zh) 2020-09-25

Family

ID=57392524

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510270858.4A Active CN106294189B (zh) 2015-05-25 2015-05-25 内存碎片整理方法及装置

Country Status (2)

Country Link
CN (1) CN106294189B (zh)
WO (1) WO2016187975A1 (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107506496A (zh) * 2017-09-28 2017-12-22 北京小米移动软件有限公司 碎片整理方法、装置及计算机可读存储介质
CN109508300A (zh) * 2018-11-22 2019-03-22 努比亚技术有限公司 一种磁盘碎片整理方法、设备及计算机可读存储介质
CN112527197A (zh) * 2020-12-09 2021-03-19 北京握奇智能科技有限公司 一种智能卡碎片存储空间整理方法、智能卡及系统

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112650693A (zh) * 2020-12-30 2021-04-13 上海创功通讯技术有限公司 一种静态内存管理方法及装置

Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1801121A (zh) * 2004-05-03 2006-07-12 微软公司 非易失性存储器高速缓存性能改进
CN101221536A (zh) * 2008-01-25 2008-07-16 中兴通讯股份有限公司 嵌入式系统的内存管理方法及装置
CN102012870A (zh) * 2010-11-18 2011-04-13 清华大学 内存分配方法
CN102024034A (zh) * 2010-11-26 2011-04-20 中国科学院声学研究所 一种面向高清媒体的嵌入式文件系统的碎片处理方法
US20130073787A1 (en) * 2011-09-16 2013-03-21 Apple Inc. Faster tree flattening for a system having non-volatile memory
CN103123604A (zh) * 2011-11-18 2013-05-29 苹果公司 跟踪数据处理系统的内存使用的方法
CN103678180A (zh) * 2013-11-29 2014-03-26 武汉天喻信息产业股份有限公司 智能卡非易失性存储器的管理方法
CN104008061A (zh) * 2013-02-22 2014-08-27 华为技术有限公司 内存回收方法及装置
US20140282589A1 (en) * 2013-03-13 2014-09-18 Samsung Electronics Company, Ltd. Quota-based adaptive resource balancing in a scalable heap allocator for multithreaded applications
CN104090732A (zh) * 2014-07-21 2014-10-08 昆腾微电子股份有限公司 非易失性存储器的管理方法和装置
CN104156173A (zh) * 2014-07-29 2014-11-19 浪潮(北京)电子信息产业有限公司 一种实现磁盘碎片整理的方法及装置

Patent Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1801121A (zh) * 2004-05-03 2006-07-12 微软公司 非易失性存储器高速缓存性能改进
CN101221536A (zh) * 2008-01-25 2008-07-16 中兴通讯股份有限公司 嵌入式系统的内存管理方法及装置
CN102012870A (zh) * 2010-11-18 2011-04-13 清华大学 内存分配方法
CN102024034A (zh) * 2010-11-26 2011-04-20 中国科学院声学研究所 一种面向高清媒体的嵌入式文件系统的碎片处理方法
US20130073787A1 (en) * 2011-09-16 2013-03-21 Apple Inc. Faster tree flattening for a system having non-volatile memory
CN103123604A (zh) * 2011-11-18 2013-05-29 苹果公司 跟踪数据处理系统的内存使用的方法
CN104008061A (zh) * 2013-02-22 2014-08-27 华为技术有限公司 内存回收方法及装置
US20140282589A1 (en) * 2013-03-13 2014-09-18 Samsung Electronics Company, Ltd. Quota-based adaptive resource balancing in a scalable heap allocator for multithreaded applications
CN103678180A (zh) * 2013-11-29 2014-03-26 武汉天喻信息产业股份有限公司 智能卡非易失性存储器的管理方法
CN104090732A (zh) * 2014-07-21 2014-10-08 昆腾微电子股份有限公司 非易失性存储器的管理方法和装置
CN104156173A (zh) * 2014-07-29 2014-11-19 浪潮(北京)电子信息产业有限公司 一种实现磁盘碎片整理的方法及装置

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107506496A (zh) * 2017-09-28 2017-12-22 北京小米移动软件有限公司 碎片整理方法、装置及计算机可读存储介质
CN109508300A (zh) * 2018-11-22 2019-03-22 努比亚技术有限公司 一种磁盘碎片整理方法、设备及计算机可读存储介质
CN109508300B (zh) * 2018-11-22 2022-07-05 广州爱云信息技术有限公司 一种磁盘碎片整理方法、设备及计算机可读存储介质
CN112527197A (zh) * 2020-12-09 2021-03-19 北京握奇智能科技有限公司 一种智能卡碎片存储空间整理方法、智能卡及系统

Also Published As

Publication number Publication date
CN106294189B (zh) 2020-09-25
WO2016187975A1 (zh) 2016-12-01

Similar Documents

Publication Publication Date Title
CN106294190B (zh) 一种存储空间管理方法及装置
CN104636285B (zh) 一种闪存存储系统及其读写、删除方法
CN101458613B (zh) 一种混合分级阵列的实现方法、混合分级阵列和存储系统
US7571163B2 (en) Method for sorting a data structure
CN107066498B (zh) 键值kv存储方法和装置
Ben-Aroya et al. Competitive analysis of flash-memory algorithms
CN107239230A (zh) 用于高效存储器内嵌去重应用的最优化的跳房子多散列表
CN103455631A (zh) 一种数据处理方法、装置及系统
CN106294189A (zh) 内存碎片整理方法及装置
CN103714013B (zh) 一种文件系统的存储空间的配置方法及装置
CN106469120A (zh) 碎片整理方法、装置及设备
CN103425435B (zh) 磁盘存储方法及磁盘存储系统
CN108959119A (zh) 存储系统中垃圾收集的方法和系统
CN103577513A (zh) 藉延迟节点实例化以缓存xml信息集的系统和/或方法
CN107783988A (zh) 一种目录树的加锁方法及设备
US9952798B2 (en) Repartitioning data in a distributed computing system
US20170160940A1 (en) Data processing method and apparatus of solid state disk
CN105339885A (zh) 磁盘上数据的小随机更改的高效存储
CN105573674A (zh) 一种面向海量小文件的分布式存储方法
CN103970795A (zh) 一种数据处理方法、装置及系统
CN100399294C (zh) 文件的有效数据管理的方法和设备
CN102184140A (zh) 一种面向实时数据库的表文件空间分配方法
CN101610197A (zh) 一种缓冲区管理方法及其系统
CN103530067A (zh) 一种数据操作的方法和设备
CN108804571B (zh) 一种数据存储方法、装置以及设备

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant