一种内存防碎片方法、系统及储存介质

著录项
  • CN202010107315.1
  • 20200221
  • CN111338981A
  • 20200626
  • 深圳震有科技股份有限公司
  • 谭冰;孟庆晓;吴闽华
  • G06F12/02
  • G06F12/02

  • 广东省深圳市南山区粤海街道高新区社区科苑南路3176号彩讯科技大厦五层、六层
  • 广东(44)
  • 深圳市君胜知识产权代理事务所(普通合伙)
  • 温宏梅;王永文
摘要
本发明公开一种内存防碎片方法、系统及存储介质,方法包括当接收到申请空闲内存块请求指令时,检测终端是否有空闲内存块;当存在至少一个空闲内存块时,确定待用空闲内存块及其内存长度;当所述待用空闲内存块的内存长度大于所述申请长度,确定所述待用空闲内存块是否被分割;若待用空闲内存块的内存长度与所述申请长度的差值大于最小内存块阈值,将待用空闲内存块分割成两块并使用。本发明旨在根据最小内存块阈值确定待分配的空闲内存块是否分割,从而保证每一个空闲内存块均有效使用,提高利用率,同时根据应用场景从低地址或从高地址分配空闲内存块,减少大小空闲内存块夹杂在一起的概率,减少分块操作的执行,提高分配的效率。
权利要求

1.一种内存防碎片方法,其特征在于,所述内存防碎片方法包括以下步骤:

当接收到申请空闲内存块请求指令时,检测终端是否有空闲内存块;

当检测到所述终端有至少一个空闲内存块时,根据所获取的申请长度确定待用空闲内存块以及待用空闲内存块的内存长度;

当所述待用空闲内存块的内存长度大于所述申请长度,比较所述待用空闲内存块的内存长度与所述申请长度的差值与预设的最小内存块阈值大小以确定所述待用空闲内存块是否被分割;

若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成两块并使用。

2.根据权利要求1所述的内存防碎片方法,其特征在于,还包括:

若所述待用空闲内存块的内存长度与所述申请长度的差值小于预设的最小内存块阈值,则所述待用空闲内存块不分割并使用所述待用空闲内存块。

3.根据权利要求1所述的内存防碎片方法,其特征在于,所述若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成两块并使用具体包括:

若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成第一空闲内存块和第二空闲内存块;其中,所述第二空闲内存块的内存长度=分割前所述待用空闲内存块的内存长度-申请长度;

使用所述第一空闲内存块并更新所述第一空闲内存块的状态为busy状态。

4.根据权利要求3所述的内存防碎片方法,其特征在于,所述若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成两块并使用之后包括:

实时检测是否接收到释放当前正使用的空闲内存块请求指令;

当检测到接收到释放当前正使用的空闲内存块请求指令时,释放所述第一空闲内存块并更新所述第一空闲内存块的状态为空状态。

5.根据权利要求4所述的内存防碎片方法,其特征在于,所述若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成两块并使用之后还包括:

判断与所述第一空闲内存块相邻的第三空闲内存块的状态是否为空状态;

当判断与所述第一空闲内存块相邻的第三空闲内存块的状态是为空状态时,将所述第一空闲块与所述第三空闲内存块自动合并成第四空闲内存块。

6.根据权利要求1所述的内存防碎片方法,其特征在于,针对终端有多个空闲内存块时,所述根据所获取的申请长度确定待用空闲内存块以及待用空闲内存块的内存长度具体包括:

获取申请长度以及每个空闲内存块的内存长度;

将所述申请长度与所有空闲内存块的内存长度一一比较,获取大于等于所述申请长度的空闲内存块作为初始空闲内存块;

当获取的初始空闲内存块只有一个时,该初始空闲内存块为待用空闲内存块并获取所述待用空闲内存块的内存大小;

当获取的初始空闲内存块为多个时,将所有的初始空闲内存块按内存长度由小到大排序,获取第一个排序对应的初始空闲内存块作为待用空闲内存块,同时获取所述待用空闲内存块的内存大小。

7.根据权利要求1所述的内存防碎片方法,其特征在于,所述当检测到所述终端有至少一个空闲内存块时,根据所获取的申请长度确定待用空闲内存块以及待用空闲内存块的内存长度还包括:

获取预设的用于区分高低地址分配的长度阈值;

当所述申请长度大于所述长度阈值时,则从内存高地址确定空闲内存块;

当所述申请长度小于所述长度阈值时,则从内存低地址确定空闲内存块。

8.根据权利要求7所述的内存防碎片方法,其特征在于,所述最小内存块阈值为512字节,所述长度阈值包括512字节,1024字节,2048字节以及4096字节中的一种。

9.一种系统,包括处理器以及与所述处理器连接的存储器,所述存储器存储有内存防碎片程序,所述处理器执行时用于实现如权利要求1-8任一项所述的内存防碎片方法中的步骤。

10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现如权利要求1-8任意一项所述的内存防碎片方法中的步骤。

说明书
技术领域

本发明涉及计算机技术领域,具体涉及一种内存防碎片方法、系统及存储介质。

现有的堆内存技术是根据实际需要的长度来分配内存块,并且是固定从低地址或高地址依次分配内存块。当待分配的内存块大于实际需要的长度时进行分片,这样,容易导致分片后的内存块内存过小而无法分配或分配失败,使得内存利用率低,还导致内存空间浪费。

因此,现有技术还有待发展和改进。

基于此,有必要针对现有技术中内存块利用率低且浪费空间的技术问题,提供一种内存防碎片方法、系统及存储介质,旨在根据最小内存块阈值确定待分配的空闲内存块是否分割,从而保证每一个空闲内存块均有效使用,提高利用率,同时根据应用场景从低地址或从高地址分配空闲内存块,减少大小空闲内存块夹杂在一起的概率,减少分块操作的执行,提高分配的效率。

为了达到上述目的,本发明采取了以下技术方案:

一种内存防碎片方法,所述内存防碎片方法包括以下步骤:

当接收到申请空闲内存块请求指令时,检测终端是否有空闲内存块;

当检测到所述终端有至少一个空闲内存块时,根据所获取的申请长度确定待用空闲内存块以及待用空闲内存块的内存长度;

当所述待用空闲内存块的内存长度大于所述申请长度,比较所述待用空闲内存块的内存长度与所述申请长度的差值与预设的最小内存块阈值大小以确定所述待用空闲内存块是否被分割;

若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成两块并使用。

所述的内存防碎片方法,其中,还包括:

若所述待用空闲内存块的内存长度与所述申请长度的差值小于预设的最小内存块阈值,则所述待用空闲内存块不分割并使用所述待用空闲内存块。

所述的内存防碎片方法,其中,所述若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成两块并使用具体包括:

若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成第一空闲内存块和第二空闲内存块;其中,所述第二空闲内存块的内存长度=分割前所述待用空闲内存块的内存长度-申请长度;

使用所述第一空闲内存块并更新所述第一空闲内存块的状态为busy状态。

所述的内存防碎片方法,其中,所述若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成两块并使用之后包括:

实时检测是否接收到释放当前正使用的空闲内存块请求指令;

当检测到接收到释放当前正使用的空闲内存块请求指令时,释放所述第一空闲内存块并更新所述第一空闲内存块的状态为空状态。

所述的内存防碎片方法,其中,所述若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成两块并使用之后还包括:

判断与所述第一空闲内存块相邻的第三空闲内存块的状态是否为空状态;

当判断与所述第一空闲内存块相邻的第三空闲内存块的状态是为空状态时,将所述第一空闲块与所述第三空闲内存块自动合并成第四空闲内存块。

所述的内存防碎片方法,其中,针对终端有多个空闲内存块时,所述根据所获取的申请长度确定待用空闲内存块以及待用空闲内存块的内存长度具体包括:

获取申请长度以及每个空闲内存块的内存长度;

将所述申请长度与所有空闲内存块的内存长度一一比较,获取大于等于所述申请长度的空闲内存块作为初始空闲内存块;

当获取的初始空闲内存块只有一个时,该初始空闲内存块为待用空闲内存块并获取所述待用空闲内存块的内存大小;

当获取的初始空闲内存块为多个时,将所有的初始空闲内存块按内存长度由小到大排序,获取第一个排序对应的初始空闲内存块作为待用空闲内存块,同时获取所述待用空闲内存块的内存大小。

所述的内存防碎片方法,其中,所述当检测到所述终端有至少一个空闲内存块时,根据所获取的申请长度确定待用空闲内存块以及待用空闲内存块的内存长度还包括:

获取预设的用于区分高低地址分配的长度阈值;

当所述申请长度大于所述长度阈值时,则从内存高地址确定空闲内存块;

当所述申请长度小于所述长度阈值时,则从内存低地址确定空闲内存块。

所述的内存防碎片方法,其中,所述最小内存块阈值为512字节,所述长度阈值包括512字节,1024字节,2048字节以及4096字节中的一种。

本发明还提供一种系统,包括处理器以及与所述处理器连接的存储器,所述存储器存储有内存防碎片程序,所述处理器执行时用于实现上述所述的内存防碎片方法中的步骤。

本发明还提供一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现上述所述的内存防碎片方法中的步骤。

有益效果:

相对于现有技术,本发明提供了一种内存防碎片方法、系统及存储介质,该方法包括当接收到申请空闲内存块请求指令时,检测终端是否有空闲内存块;当检测到所述终端有至少一个空闲内存块时,根据所获取的申请长度确定待用空闲内存块以及待用空闲内存块的内存长度;当所述待用空闲内存块的内存长度大于所述申请长度,比较所述待用空闲内存块的内存长度与所述申请长度的差值与预设的最小内存块阈值大小以确定所述待用空闲内存块是否被分割;若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成两块并使用。本发明旨在根据最小内存块阈值确定待分配的空闲内存块是否分割,从而保证每一个空闲内存块均有效使用,提高利用率,同时根据应用场景从低地址或从高地址分配空闲内存块,减少大小空闲内存块夹杂在一起的概率,减少分块操作的执行,提高分配的效率。

图1为本发明提供的一种内存防碎片方法的流程图。

图2为本发明系统的功能原理框图。

为使本发明的目的、技术方案及效果更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。

本发明所提供的内存防碎片方法,不根据实际需要的申请长度分配空闲内存块,而是从所有空闲内存块中查最佳匹配的空闲内存块进行使用,并且在待用空闲内存块只有满足分割后的其中未使用的空闲内存块大于最小内存块阈值才可进行分割,以保证分割前后的每一个空闲内存块均能有效使用,提高利用率。并且在分配空闲内存块时根据实际需要的申请长度选择待用空闲内存块地址的高低,并非固定总是从低地址分配或总是从高地址分配。

请参阅图1,图1是本发明提供的一种内存防碎片方法的流程图,应该说明的是,本发明实施方式的内存防碎片方法并不限于图1所示的流程图中的步骤及顺序,根据不同的需求,流程图中的步骤可以增加、移除或者改变顺序。

如图1所示,本发明提供的内存防碎片方法包括以下步骤:

S10、当接收到申请空闲内存块请求指令时,检测终端是否有空闲内存块。

在本发明实施例中,步骤S10之前,预先设置用于指示待用空闲内存块是否被分割的最小内存块阈值,该最小内存块阈值为一常用编解码需要的长度。所述最小内存块阈值并非限制性包括512字节,1024字节,2048字节以及4096字节中的一种。本实施例中,优选所述最小内存块阈值为512字节。所述最小内存块阈值的设置是通过根据各编解码用的内存大小的统计值和在设备中使用的概率决定从小或从大地址分配的内存大小的阈值,这样,统计各编解码需要分配内存的长度(size)划分出有限的几种内存块类型,分配待用空闲内存块时取最合适的内存长度。

还预先设置用于区分高低地址的长度阈值,所述长度阈值包括512字节,1024字节,2048字节以及4096字节中的一种。例如,设置长度阈值为2048字节,当申请长度3000字节大于长度阈值2048时,从内存高地址确定空闲内存块;当申请长度2000字节小于长度阈值2048时,从内存低地址确定空闲内存块。这样划分分配降低在同一块内存区同时出现大小内存块机率。

进一步地,所述申请空闲内存块请求指令可以是打开应用程序时所发出的申请空闲内存块请求指令。

当接收到申请空闲内存块请求指令时,检测终端是否有空闲内存块。也就是说,所述终端是否有未使用的空闲内存块,即该空闲内存块的状态为空状态。

若空闲内存块的状态为busy状态,即表示当前空闲内存块正在被使用。

因此,在接收到申请空闲内存块请求指令时,需要判断终端是否有空状态对应的空闲内存块。

当检测到所述终端不存在空状态的空闲内存块时,反馈申请失败的提示。

S20、当检测到所述终端有至少一个空闲内存块时,根据所获取的申请长度确定待用空闲内存块以及待用空闲内存块的内存长度。

在本实施例中,若检测到所述终端只有一个空闲内存块,则该空闲内存块作为待用空闲内存块,并获取所述待用空闲内存块的内存长度。

若检测到所述终端有多个空闲内存块,则需要根据所获取的申请长度确定待用空闲内存块以及待用空闲内存块的内存长度。其具体过程包括:

获取申请长度以及每个空闲内存块的内存长度;

将所述申请长度与所有空闲内存块的内存长度一一比较,获取大于等于所述申请长度的空闲内存块作为初始空闲内存块;

当获取的初始空闲内存块只有一个时,该初始空闲内存块为待用空闲内存块并获取所述待用空闲内存块的内存大小;

当获取的初始空闲内存块为多个时,将所有的初始空闲内存块按内存长度由小到大排序,获取第一个排序对应的初始空闲内存块作为待用空闲内存块,同时获取所述待用空闲内存块的内存大小。

也就是说,有多个空闲内存块时,最接近该申请长度对应的空闲内存块,这样,降低碎片形成的机率,有效提高空间利用率。

这样,与现有技术不同处在于,本发明搜索满足申请长度的空闲内存块不是仅搜索到满足大于等于申请长度的第一个空闲内存块就分配并使用,而是根据所有的空闲内存块的索引,出与该申请长度最佳匹配的空闲内存块。也就是说,匹配的空闲内存块的内存长度几乎等于待分配的申请长度。例如,申请长度2000,第一个空闲内存块4096,第二个空闲内存块2048,现有技术是搜索到第一个空闲内存块4096就分配使用,而本发明却是搜索这两个空闲内存块,确定与2000最接近的第二空闲内存块2048分配使用。这样,避免空闲内存块的合理利用,有效防止空间浪费和碎片化。

S30、当所述待用空闲内存块的内存长度大于所述申请长度,比较所述待用空闲内存块的内存长度与所述申请长度的差值与预设的最小内存块阈值大小以确定所述待用空闲内存块是否被分割。

即基于步骤S20,确定了待用空闲内存块后,为了进一步提高空间利用率,需要判断所述待用空闲内存块是否需要被分割后使用。这样,保证分割后的2个空闲内存块均能有效被当前使用或下一次使用,从而防止内存无效碎片产生。

当然,若所述待用空闲内存块的内存长度等于所述申请长度,是无需进行比较操作。

因此,当所述待用空闲内存块的内存长度大于所述申请长度时,计算所述待用空闲内存块的内存长度与所述申请长度的差值(即待用空闲内存块的内存长度-申请长度)。然后获取预设的最小内存块阈值,将该差值(绝对值)与最小内存块阈值进行大小比较,根据比较结果确定当前待用空闲内存块是否需要分割后使用。

S40、若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成两块并使用。

即步骤S40具体包括:

S41,若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成第一空闲内存块和第二空闲内存块;其中,所述第二空闲内存块的内存长度=分割前所述待用空闲内存块的内存长度-申请长度;

S42,使用所述第一空闲内存块并更新所述第一空闲内存块的状态为busy状态。

其中,所述busy状态表示当前第一空闲内存块正在使用状态。

例如:待用空闲内存块的内存长度4000-申请长度2048=1952大于最小内存块阈值如512,则将该待用空闲内存块分割为第一空闲内存块2048,并使用该第一空闲内存块以及第二空闲内存块1952,为空状态,以作为下一次申请空闲内存块的备用。

也就是说,所述若所述待用空闲内存块的内存长度与所述申请长度的差值大于预设的最小内存块阈值,则将所述待用空闲内存块分割成两块并使用之后包括:

实时检测是否接收到释放当前正使用的空闲内存块请求指令;

当检测到接收到释放当前正使用的空闲内存块请求指令时,释放所述第一空闲内存块并更新所述第一空闲内存块的状态为空状态。

其中,所述释放与申请是成对存在,例如不使用应用程序即关闭应用程序时即为释放。

进一步地,一旦所述第一空闲内存块的状态变更为空状态时,判断与所述第一空闲内存块相邻的第三空闲内存块的状态是否为空状态;当判断与所述第一空闲内存块相邻的第三空闲内存块的状态是为空状态时,将所述第一空闲块与所述第三空闲内存块自动合并成第四空闲内存块。这样,既能防止碎片化产生,也能提高内存块的可分配率,极大降低因空闲内存块的内存长度小于申请长度造成的申请分配失败的概率。

例如,第一个空闲内存块在用busy状态,第二个空闲内存块空状态,第三个空闲内存块空状态,第四个空闲内存块在用busy状态,则将第二个空闲内存块和第三个空闲内存块合并成一个空闲内存块,其内存长度为第二个空闲内存块和第三个空闲内存块的内存长度之和。

第一个空闲内存块空状态,第二个空闲内存块空状态,第三个空闲内存块在用busy状态,第四个空闲内存块在用busy状态,则将第一个空闲内存块和第二个空闲内存块合并成一个空闲内存块,其内存长度为第一个空闲内存块和第二个空闲内存块的内存长度之和。

第一个空闲内存块空状态,第二个空闲内存块在用busy状态,第三个空闲内存块空状态,第四个空闲内存块在用busy状态,则第一个空闲内存块不能和第三个空闲内存块合并。

这样,基于步骤S10-S40,根据最小内存块阈值确定待分配的空闲内存块是否分割,从而保证每一个空闲内存块均有效使用,提高内存块的可用率,同时根据应用场景从低地址或从高地址分配空闲内存块,减少大小空闲内存块夹杂在一起的概率,减少内存块分块的概率。

实施例二

基于上述内存防碎片方法,本发明还相应提供了一种系统,如图2所示,所述系统100包括处理器11以及与所述处理器11连接的存储器22,图2仅示出了系统100的部分组件,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。

所述存储器22在一些实施例中可以是所述系统100的内部存储单元,例如系统100的内存。所述存储器22在另一些实施例中也可以是所述系统100的外部存储设备,例如所述系统100上配备的插接式U盘,智能存储卡(Smart Media Card,SMC),安全数字(SecureDigital,SD)卡,闪存卡(Flash Card)等。进一步地,所述存储器22还可以既包括所述系统100的内部存储单元也包括外部存储设备。所述存储器22用于存储安装于所述系统100的应用软件及各类数据,例如所述内存防碎片程序代码等。所述存储器22还可以用于暂时地存储已经输出或者将要输出的数据。在一实施例中,存储器22上存储有内存防碎片程序,该内存防碎片程序可被处理器11所执行,从而实现本申请中内存防碎片方法,具体如上述方法所述。

所述处理器11在一些实施例中可以是一中央处理器(Central Processing Unit,CPU),微处理器,手机基带处理器或其他数据处理芯片,用于运行所述存储器22中存储的程序代码或处理数据,例如执行所述内存防碎片方法等,具体如上述方法所述。

本发明还提供一种计算机可读存储介质,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器(本实施例为所述处理器11)执行,以实现本发明内存防碎片方法中的步骤,具体如上述方法所述。

综上所述,本发明提供了一种内存防碎片方法、系统及存储介质,方法包括当接收到申请空闲内存块请求指令时,检测终端是否有空闲内存块;当存在至少一个空闲内存块时,确定待用空闲内存块及其内存长度;当所述待用空闲内存块的内存长度大于所述申请长度,确定所述待用空闲内存块是否被分割;若待用空闲内存块的内存长度与所述申请长度的差值大于最小内存块阈值,将待用空闲内存块分割成两块并使用。本发明旨在根据最小内存块阈值确定待分配的空闲内存块是否分割,从而保证每一个空闲内存块均有效使用,提高利用率,同时根据应用场景从低地址或从高地址分配空闲内存块,减少大小空闲内存块夹杂在一起的概率,减少分块操作的执行,提高分配的效率。

当然,本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关硬件(如处理器,控制器等)来完成,所述的程序可存储于一计算机可读取的存储介质中,该程序在执行时可包括如上述各方法实施例的流程。其中所述的存储介质可为存储器、磁碟、光盘等。

应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。

本文发布于:2024-09-24 20:25:02,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/85696.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议