CN113867925A - 内存管理方法、装置、设备和存储介质 - Google Patents

内存管理方法、装置、设备和存储介质 Download PDF

Info

Publication number
CN113867925A
CN113867925A CN202010612893.0A CN202010612893A CN113867925A CN 113867925 A CN113867925 A CN 113867925A CN 202010612893 A CN202010612893 A CN 202010612893A CN 113867925 A CN113867925 A CN 113867925A
Authority
CN
China
Prior art keywords
memory
memory block
idle
block
blocks
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
CN202010612893.0A
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.)
Loongson Technology Corp Ltd
Original Assignee
Loongson Technology Corp 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 Loongson Technology Corp Ltd filed Critical Loongson Technology Corp Ltd
Priority to CN202010612893.0A priority Critical patent/CN113867925A/zh
Publication of CN113867925A publication Critical patent/CN113867925A/zh
Pending legal-status Critical Current

Links

Images

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

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System (AREA)

Abstract

本申请提供一种内存管理方法、装置、设备和存储介质,该方法包括:获取内存管理指令;根据所述内存管理指令,获取内存的多个空闲内存块,所述多个空闲内存块为不连续的内存块;根据所述多个空闲内存块,得到目标空闲内存块,所述目标空闲内存块的内存空间大于所述多个空闲内存块中任意一个空闲内存块的内存空间。依据内存管理指令,获取多个空闲内存块,并根据多个空闲内存块整理得到内存空间更大的目标空闲内存块,达到整理系统内存碎片的效果,为系统运行提供更大的连续内存空间,从而提高系统内存利用率。

Description

内存管理方法、装置、设备和存储介质
技术领域
本申请涉及计算机技术,尤其涉及一种内存管理方法、装置、设备和存储介质。
背景技术
威克沃(VxWorks)是一种嵌入式实时操作系统,具有实时性、可靠性、高效性、小型化、可裁剪等特点,但是,VxWorks的系统内存较小。
在VxWorks系统运行过程中,经过反复的申请内存、释放内存操作,连续的内存会被一些使用中的内存块分割出不连续并且大小不等的空闲内存块,导致系统内存碎片化,减少了实际可用的系统内存,内存利用率低。
发明内容
本申请提供一种内存管理方法、装置、设备和存储介质,通过将空闲内存块合并的方式,整理系统内存碎片,提供更大的连续内存空间,提高系统内存利用率。
第一方面,本申请提供一种内存管理方法,包括:获取内存管理指令;根据所述内存管理指令,获取内存的多个空闲内存块,所述多个空闲内存块为不连续的内存块;根据所述多个空闲内存块,得到目标空闲内存块,所述目标空闲内存块的内存空间大于所述多个空闲内存块中任意一个空闲内存块的内存空间。
可选的,所述内存管理指令中包括:第一信息,所述第一信息用于指示当前占用的内存块。所述根据所述内存管理指令,获取内存的多个空闲内存块,包括:根据所述当前占用的内存块,获取所述多个空闲内存块。
可选的,所述根据所述当前占用的内存块,获取所述多个空闲内存块,包括:根据所述当前占用的内存块,判断所述当前占用的内存块的相邻内存块是否为空闲;若是,则确定所述相邻内存块为所述空闲内存块。
可选的,所述内存管理方法还包括:若所述当前占用的内存块的相邻内存块不为空闲,则将所述相邻内存块作为当前占用的内存块,继续判断与所述相邻内存块相邻的内存块是否为空闲;若是,则确定与所述相邻内存块相邻的内存块为所述空闲内存块。
可选的,所述第一信息为所述当前占用的内存块的起始地址,所述起始地址用于确定所述当前占用的内存块。
可选的,内存块包括头部;所述内存块的头部中包括第二信息和第三信息,所述第二信息用于指示所述内存块的上一个相邻内存块是否空闲,所述第三信息用于指示所述内存块的内存空间大小。若当前占用的内存块为第i个内存块,则所述根据所述当前占用的内存块,判断所述当前占用的内存块的相邻内存块是否为空闲,包括:从所述第i个内存块的头部中获取第二信息,并根据所述第二信息,判断第i-1内存块是否为空闲,所述第i-1个内存块为所述第i个内存块的上一个相邻内存块;根据所述第三信息,确定第i+2个内存块;从所述第i+2个内存块的头部中获取第二信息,并根据所述第二信息,判断第i+1个内存块是否为空闲,所述第i+1个内存块为所述第i个内存块的下一个相邻内存块,所述第i+2个内存块为所述第i+1个内存块的下一个相邻内存块。
可选的,所述根据所述第三信息,确定第i+2个内存块,包括:根据所述第一信息、所述第i个内存块的头部中的第三信息,确定第i+1个内存块的起始地址;根据所述第i+1个内存块的起始地址、所述第i+1个内存块的头部中的第三信息,确定第i+2个内存块的起始地址。
可选的,所述多个空闲内存块包括第一空闲内存块和第二空闲内存块,所述第一空闲内存块与所述第二空闲内存块之间存在N个当前占用的内存块且不存在空闲内存块,所述N为大于0的整数。所述根据所述多个空闲内存块,得到目标空闲内存块,包括:将所述第一空闲内存块的内存空间以及所述N个当前占用的内存块的内存空间,确定为目标内存空间;将所述目标内存空间划分为N个第一内存块和一个第二内存块,其中,N个第一内存块分别作为所述N个当前占用的内存块,所述第二内存块作为空闲内存块且与所述第二空闲内存块相邻;将所述第二内存块和所述第二空闲内存块合并为所述目标空闲内存块。
可选的,所述将所述目标内存空间划分为N个第一内存块和一个第二内存块,包括:判断所述N个当前占用的内存块的内存空间大小是否小于所述第一空闲内存块的内存空间大小;若是,则将所述N个当前占用的内存块中的数据对应移动到所述第一空闲内存块的尾部;以及
将所述第一空闲块中包含移动后数据的内存空间确定为N个第一内存块,将所述目标内存空间中除所述N个第一内存块之外的内存空间确定为所述第二内存块。
第二方面,本申请提供一种内存管理装置,包括:获取模块,用于获取内存管理指令;根据所述内存管理指令,获取内存的多个空闲内存块,所述多个空闲内存块为不连续的内存块;处理模块,用于根据所述多个空闲内存块,得到目标空闲内存块,所述目标空闲内存块的内存空间大于所述多个空闲内存块中任意一个空闲内存块的内存空间。
可选的,所述内存管理指令中包括:第一信息,所述第一信息用于指示当前占用的内存块。所述获取模块在根据所述内存管理指令,获取内存的多个空闲内存块时,具体用于:根据所述当前占用的内存块,获取所述多个空闲内存块。
可选的,所述获取模块在根据所述当前占用的内存块,获取所述多个空闲内存块时,具体用于:根据所述当前占用的内存块,判断所述当前占用的内存块的相邻内存块是否为空闲;若是,则确定所述相邻内存块为所述空闲内存块。
可选的,所述获取模块还用于:若所述当前占用的内存块的相邻内存块不为空闲,则将所述相邻内存块作为当前占用的内存块,继续判断与所述相邻内存块相邻的内存块是否为空闲;若是,则确定与所述相邻内存块相邻的内存块为所述空闲内存块。
可选的,所述第一信息为所述当前占用的内存块的起始地址,所述起始地址用于确定所述当前占用的内存块。
可选的,内存块包括头部;所述内存块的头部中包括第二信息和第三信息,所述第二信息用于指示所述内存块的上一个相邻内存块是否空闲,所述第三信息用于指示所述内存块的内存空间大小。若当前占用的内存块为第i个内存块,则所述获取模块在根据所述当前占用的内存块,判断所述当前占用的内存块的相邻内存块是否为空闲时,具体用于:从所述第i个内存块的头部中获取第二信息,并根据所述第二信息,判断第i-1个内存块是否为空闲,所述第i-1个内存块为所述第i个内存块的上一个相邻内存块;根据所述第三信息,确定第i+2个内存块;从所述第i+2个内存块的头部中获取第二信息,并根据所述第二信息,判断第i+1个内存块是否为空闲,所述第i+1个内存块为所述第i个内存块的下一个相邻内存块,所述第i+2个内存块为所述第i+1个内存块的下一个相邻内存块。
可选的,所述根据所述第三信息,确定第i+2个内存块,包括:根据所述第一信息、所述第i个内存块的头部中的第三信息,确定第i+1个内存块的起始地址;根据所述第i+1个内存块的起始地址、所述第i+1个内存块的头部中的第三信息,确定第i+2个内存块的起始地址。
可选的,所述多个空闲内存块包括第一空闲内存块和第二空闲内存块,所述第一空闲内存块与所述第二空闲内存块之间存在N个当前占用的内存块且不存在空闲内存块,所述N为大于0的整数。所述处理模块在根据所述多个空闲内存块,得到目标空闲内存块时,具体用于:将所述第一空闲内存块的内存空间以及所述N个当前占用的内存块的内存空间,确定为目标内存空间;将所述目标内存空间划分为N个第一内存块和一个第二内存块,其中,N个第一内存块分别作为所述N个当前占用的内存块,所述第二内存块作为空闲内存块且与所述第二空闲内存块相邻;将所述第二内存块和所述第二空闲内存块合并为所述目标空闲内存块。
可选的,所述将所述目标内存空间划分为N个第一内存块和一个第二内存块,包括:判断所述N个当前占用的内存块的内存空间大小是否小于所述第一内存块的内存空间大小;若是,则将所述N个当前占用的内存块中的数据对应移动到所述第一空闲内存块的尾部,以得到N个第一内存块和一个第二内存块。
第三方面,本申请提供一种电子设备,包括:
存储器,用于存储程序指令;
处理器,用于调用并执行所述存储器中的程序指令,执行第一方面所述的方法。
第四方面,本申请提供一种计算机可读存储介质,所述存储介质存储有计算机程序,所述计算机程序被处理器执行时,实现第一方面所述的方法。
本申请提供了一种内存管理方法、装置、设备和存储介质,方法包括:获取内存管理指令;根据所述内存管理指令,获取内存的多个空闲内存块,所述多个空闲内存块为不连续的内存块;根据所述多个空闲内存块,得到目标空闲内存块,所述目标空闲内存块的内存空间大于所述多个空闲内存块中任意一个空闲内存块的内存空间。依据内存管理指令,获取多个空闲内存块,并根据多个空闲内存块整理得到内存空间更大的目标空闲内存块,达到整理系统内存碎片的效果,为系统运行提供更大的连续内存空间,从而提高系统内存利用率。
附图说明
为了更清楚地说明本申请或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请一实施例提供的一种应用场景图;
图2为本申请一实施例提供的一种内存块的示意图;
图3为本申请一实施例提供的一种内存管理方法的流程图;
图4为本申请另一实施例提供的一种内存管理方法的流程图;
图5为本申请一实施例提供的一种内存块的示意图;
图6为本申请另一实施例提供的一种内存块的示意图;
图7为本申请另一实施例提供的一种内存管理示意图;
图8为本申请一实施例提供的一种内存管理装置的结构示意图;
图9为本申请一实施例提供的一种电子设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请中的附图,对本申请中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
VxWorks是一种嵌入式实时操作系统,具有实时性、可靠性、高效性、小型化、可裁剪等特点,但是,VxWorks的系统内存较小。
按照使用状态,VxWorks操作系统中的内存可以分为两种,一种是使用中的内存,一种是空闲的内存,它们都以具有一定大小的连续内存空间构成的“内存块”的形式存在,即本申请中的当前占用的内存块和空闲内存块。其中,连续内存空间指的是连续内存地址所代表的内存空间。
某个程序运行时,例如,系统更新程序等,系统会进行动态内存分配,分配一段指定大小的内存空间给此程序使用,此段指定大小的内存空间也就成为了当前占用的内存块;程序运行结束时,可以通过释放上述分配给该程序的内存,将此当前占用的内存块中存储的数据清除,释放内存空间,进而使此当前占用的内存块又成为了空闲内存块。
相关技术中,VxWorks系统对于空闲内存块的管理方法是,通过自平衡二叉查找树,一般是AVL树对空闲内存块进行管理。AVL树是最先发明的自平衡二叉查找树,在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。当系统进行动态内存分配时,会在AVL树中查找能满足空间大小要求的最小的空闲内存块,此最小内存块的内存空间可能仍比需要的内存空间大,在分配了需要的内存空间后,还会将剩余的内存块重新插回AVL树中;释放内存后再次生成的空闲内存块也会被重新插回AVL树中。当存在两个地址连续的空闲内存块时,也会自动将其合并为同一空闲内存块。
正是由于这样的内存管理机制,空闲内存块的分配在内存地址上来说是随机的。因为任意两个地址连续的空闲内存块都会被自动合并为同一空闲内存块,所以内存地址最接近的两个被分配的内存块之间最多只会有一个空闲内存块。若此空闲内存块被部分分配,将会产生一个或两个新的空闲内存块。之前占用中的内存块空间被释放后,也可能面临相似的分配结果。如此,当前占用的内存块会将原本连续的内存空间分隔出许多不连续的空闲内存块。特别是在多次反复地进行申请内存、释放内存的操作后,空闲内存块可能会变得越来越小,以至于无法满足较大内存空间的需求,导致系统内存碎片化,内存利用率低。
基于此,本申请提供一种内存管理方法,通过对空闲内存块进行一些相应的整理操作,得到一些内存空间更大的空闲内存块,降低内存碎片化程度,提高系统内存的利用率。
本申请提供的内存管理方法,可以适用于任何搭载了VxWorks操作系统或与VxWorks操作系统内存管理方法相同的操作系统的电子设备,例如计算机、工业控制器等。图1为本申请一实施例提供的一种应用场景图。如图1所示,本申请的方法适用的电子设备可以为服务器、计算机等。
图2为本申请一实施例提供的一种内存块的示意图,其中图2(a)为未经过内存管理的示意图,图2(b)为内存管理后的示意图。图中用灰色部分表示当前占用的内存块,用白色部分表示空闲内存块。系统运行过程中经常会出现如图2(a)所示的空闲内存碎片化的情况,空闲内存块201和空闲内存块203之间是当前占用中的内存块202,如果可以在不影响当前占用中的内存块202的正常使用的情况下,将空闲内存块201和空闲内存块203合并的话,就可以得到一块内存空间较大的空闲内存块205。
图3为本申请一实施例提供的一种内存管理方法的流程图,如图3所示,本实施例的方法可以包括:
S301、获取内存管理指令。
在对空闲内存进行整理之前,要先获取对应的内存管理指令。
在一些实现方式中,可以在固定的时间进行内存管理。例如,设定系统运行时间每达到一个小时,进行一次内存管理,以防止分配内存失败。
在另一些实现方式中,可以在特定的条件下进行内存管理。例如,在每次分配内存失败时,进行一次内存管理。
S302、根据内存管理指令,获取内存的多个空闲内存块,多个空闲内存块为不连续的内存块。
根据内存管理指令,可以获取到多个空闲内存块,根据前述VxWorks系统对于空闲内存块的管理方法,可以知道,每两个空闲内存块之间会有至少一个当前占用的内存块,即,获取到的多个空闲内存块在内存空间上是不连续的。
S303、根据多个空闲内存块,得到目标空闲内存块,目标空闲内存块的内存空间大于多个空闲内存块中任意一个空闲内存块的内存空间。
根据获取到的多个不连续的空闲内存块,经过整理操作,即可得到目标空闲内存块,目标空闲内存块的内存空间是大于多个空闲内存块中的任意一个的。可选的,上述目标空闲内存块可以是一个连续的内存空间。
本实施例提供的内存管理方法,依据内存管理指令,获取多个空闲内存块,并根据多个空闲内存块整理得到内存空间更大的目标空闲内存块,达到整理系统内存碎片的效果,为系统运行提供更大的连续内存空间,从而提高系统内存利用率。
在一些实施例中,内存管理指令中包括第一信息,第一信息用于指示当前占用的内存块。根据内存管理指令,获取内存的多个空闲内存块,具体的可以是根据当前占用的内存块,来获取其它的空闲内存块,从而获得多个空闲内存块。
空闲内存块的信息并不容易直接获得,但是可以通过当前占用的内存块来间接得到。当前占用的内存块是已经被系统分配过的内存块,即当前时刻正处在已占用状态的内存块;系统分配内存的过程中,会生成包含当前占用的内存块的信息以指示所分配的内存块,可以将分配过程中生成的此信息作为第一信息加入内存管理指令。根据内存管理指令中的第一信息,可以确定当前占用的内存块,再根据此当前占用的内存块,即可获取到多个空闲内存块。
在一种具体的实施方式中,上述的第一信息可以为当前占用的内存块的起始地址,内存块的起始地址用于确定当前占用的内存块的位置。
具体的,当前占用的内存块的起始地址可以为当前占用的内存块的地址指针。
在VxWorks系统中,一般利用内存分配函数,实现根据程序的需要动态分配内存。其中一种内存分配函数为malloc函数。malloc函数的原型为void*malloc(unsigned intsize),其作用是在内存中分配一个长度为size的连续空间,malloc函数的返回值就是一个指向所分配的连续存储空间的起始地址的指针。因此,可以将malloc函数返回的起始地址的指针进行存储,在需要进行内存管理时,将预先存储的指针作为内存管理指令中的第一信息,指示当前占用的内存块的起始地址。
若指针指示的内存空间被释放,则其可能与邻近的空闲内存空间合并得到新的空闲内存块。根据此地址指针可能无法查找到与此新的空闲内存块相关的信息,也就无法基于此新的空闲内存块判断其邻近内存块的状态。因此,为保证地址指针的有效性,可以尽量选择最新的地址指针做为第一信息。以免指针所指示的内存块已被释放,而无法获取进行内存整理的必要信息。
另外,当空闲内存空间不足致使未能成功分配存储空间时,malloc函数返回的指针为空值。因此,前述的获取内存管理指令进行内存管理的其中一个具体的实现方式可以为,当检测到mallco函数的返回值为空值时执行后续的整理内存的操作。
在一些实施例中,多个空闲内存块包括第一空闲内存块和第二空闲内存块,第一空闲内存块与第二空闲内存块之间存在N个当前占用的内存块且不存在空闲内存块,N为大于0的整数。根据多个空闲内存块,得到目标空闲内存块的方式具体可以为:将第一空闲内存块的内存空间以及N个当前占用的内存块的内存空间,确定为目标内存空间;将目标内存空间划分为N个第一内存块和一个第二内存块,其中,N个第一内存块分别作为N个当前占用的内存块,第二内存块作为空闲内存块且与第二空闲内存块相邻;将第二内存块和第二空闲内存块合并为目标空闲内存块。
当N为1时,以图2为例,根据一内存管理指令,获取到两个空闲内存块201和203,空闲内存块201与空闲内存块203之间存在1个当前占用的内存块202。要根据这两个空闲内存块201和203得到目标空闲内存块,可以将空闲内存块203的内存空间和当前占用的内存块202的内存空间作为目标内存空间,将此目标内存空间重新划分,得到一个新的空闲内存块206和一个新的占用的内存块207,新的空闲内存块206与空闲内存块201相邻,依据如上所述的VxWorks系统的空闲内存块的管理方式,新的空闲内存块206和空闲内存块201将可以被合并为一个大的空闲内存块205,即目标空闲内存块。
当N大于1时,即第一空闲内存块与第二空闲内存块之间存在多个当前占用的内存块。可以理解的是,这种情况下,多个连续的当前占用的内存块可以抽象为一个大的当前占用的内存块,类似图2中的当前占用的内存块202。只需要在将目标内存空间重新划分时,将新的在用的内存块207同时划分为与整理之前的N个当前占用的内存块一一对应的内存块。
具体的,将目标内存空间重新划分的方式,可以通过数据迁移实现。当当前占用的内存块202的内存空间小于空闲内存块203时,可以直接将当前占用的内存块202中的数据写入空闲内存块203的尾部;当当前占用的内存块202的内存空间大于空闲内存块203时,可以将当前占用的内存块202中的部分数据写入空闲内存块203中,将当前占用的内存块202中剩余数据移动到当前占用的内存块202的尾部,这样当前占用的内存块202的前部空闲出来,构成新的空闲内存块。
图4为本申请另一实施例提供的一种内存管理方法的流程图,如图4所示,本实施例的方法可以包括:
S401、获取内存管理指令,内存管理指令中包括第一信息,第一信息用于指示当前占用的内存块。
本实施例中,步骤S401的具体实现过程可以参见图3所示实施例的相关描述,此处不再赘述。
S402、根据当前占用的内存块,判断当前占用的内存块的相邻内存块是否为空闲。
S403、若当前占用的内存块的相邻内存块是空闲,则确定相邻内存块为空闲内存块。
根据内存管理指令中的第一信息确定当前占用的内存块后,可以通过判断当前占用的内存块相邻的内存块是否为空闲内存块来获取多个空闲内存块。
S404、根据多个空闲内存块,得到目标空闲内存块,目标空闲内存块的内存空间大于多个空闲内存块中任意一个空闲内存块的内存空间。
本实施例中,步骤S404的具体实现过程可以参见图3所示实施例的相关描述,此处不再赘述。
本实施例提供的内存管理方法,依据内存管理指令,通过判断当前占用内存块的相邻内存块的使用状态的方式,获取多个空闲内存块,并根据多个空闲内存块整理得到内存空间更大的目标空闲内存块,达到整理系统内存碎片的效果,为系统运行提供更大的连续内存空间,从而提高系统内存利用率。
可以理解的是,普遍意义上的“相邻”是不限定方向的。上述实施例中所说的“相邻内存块”指的可以是相邻的前一个内存块和相邻的后一个内存块。其确定空闲内存块的方式相当于双向查找。
在另外一个实施例中,还可以通过单向查找的方式确定空闲内存块。例如,可以基于当前占用的内存块依次向前查找,通过确定当前占用的内存块之前的多个内存块的使用状态的方式,获取多个空闲内存块。
在内存中并无实际意义上的方位关系,上述的“前”“后”仅是一种形象的表述方式。具体的,可以以内存地址的增大或减小来表征前或后。
在一种实现方式中,内存管理指令中包括的第一信息可以指示一个当前占用的内存块,若执行S402后,判断结果为当前占用的内存块的其中一个相邻内存块不是空闲状态,则将此相邻内存块作为当前占用的内存块,再次执行S402,继续判断与此相邻内存块相邻的内存块是否为空闲状态,若是,则确定与相邻内存块相邻的内存块为空闲内存块。如此,可以至少获取到2个空闲内存块,根据此2个空闲内存块可以得到内存空间更大的目标空闲内存块。
另外,在重复执行S402时,新确定的当前占用的内存块的其中一个相邻内存块为之前已经确定过的当前占用的内存块,其状态是明确的。因而,可以转为前述的单向查找方式。例如,根据内存管理指令确定当前占用的内存块为a。经判断确定a的前一个内存块b为空闲状态,但a的后一个内存块c为占用状态。则将c确定为当前占用的内存块,继续判断c相邻的后一个内存块d是否为空闲状态。若d仍为占用状态,则继续判断d相邻的后一个内存块e是否为空闲状态。直至至少确定一个空闲状态的内存块。又例如,根据内存管理指令确定当前占用的内存块为a。经判断确定a的前一个内存块b和后一个内存块c都为占用状态。则可以同时将b和c确定为当前占用的内存块,继续判断b相邻的前一个内存块f和c相邻的后一个内存块d是否为空闲状态。直至至少确定两个空闲状态的内存块。
在一种实现方式中,内存管理指令中包括的第一信息可以指示多个当前占用的内存块,在执行S402-S403后,可以获取到多个空闲内存块,根据此多个空闲内存块可以得到内存空间更大的目标空闲内存块。
在一种实现方式中,内存块包括头部;内存块的头部中包括第二信息和第三信息,第二信息用于指示内存块的上一个相邻内存块是否空闲,第三信息用于指示内存块的内存空间大小。若当前占用的内存块为第i个内存块,则根据当前占用的内存块,判断当前占用的内存块的相邻内存块是否为空闲,包括:从第i个内存块的头部中获取第二信息,并根据第二信息,判断第i-1个内存块是否为空闲,第i-1个内存块为第i个内存块的上一个相邻内存块;根据第三信息,确定第i+2个内存块;从第i+2个内存块的头部中获取第二信息,并根据第二信息,判断第i+1个内存块是否为空闲,第i+1个内存块为第i个内存块的下一个相邻内存块,第i+2个内存块为第i+1个内存块的下一个相邻内存块。
在一种实现方式中,根据所述第三信息,确定第i+2个内存块,包括:根据第一信息、第i个内存块的头部中的第三信息,确定第i+1个内存块的起始地址;根据第i+1个内存块的起始地址、第i+1个内存块的头部中的第三信息,确定第i+2个内存块的起始地址。
图5为本申请一实施例提供的一种内存块的示意图。内存块包括内存的头部501和数据空间502两部分。头部501一般用于存储本内存块和相邻的上一内存块的一些基本信息,例如内存空间大小,使用状态等,因各个内存块头部存储的内容基本一致,因此头部的内存空间大小也是固定值;数据空间502则用于存储程序运行过程中的数据信息,头部501中所存储的内存块的内存空间大小一般就是指整个内存块的大小,即头部和数据空间两部分的空间大小之和。一般将头部的初始地址称为对应内存块的块头地址,而将数据空间部分的初始地址称为对应内存块的首地址、起始地址,也即前述地址指针所指示的地址。由此可知,内存块的块头地址与内存块的首地址的偏移量是固定值,即块头大小。
可以理解的是,在进行内存管理的过程中,会有内存块的变化。相应的,块头信息也会根据新的内存块进行调整,但块头的位置始终会在内存块的头部,块头中存储的信息始终为指示所在内存块和上一内存块的信息。
在内存管理过程中,如上述实施例中所描述的,数据迁移(移动)会带来至少两个相邻内存块的变化。所以块头内的信息一定会有所变化;例如,指示前一个内存块状态的信息可能会发生变化。但数据空间存储的数据一定不会发生变化。因此,在数据迁移的过程中,优选的,将数据向后迁移。仍以图2对应的实施例为例,先将内存块202的数据空间存储的数据整体向后移动。再根据数据所占空间大小,进一步确定新生成的内存块207的头部位置和头部存储的信息。
本申请中所说的将数据移动到某个内存块的“尾部”,其实际含义指的是数据移动原则是,填充此内存块的末端及以上的与移动的数据对应的空间。
可以理解的是,内存块的头部和数据存储空间并非内存块的固有结构划分,而是基于其存储的数据性质的划分,其本质仍是相同的存储空间。当内存块202的数据存储空间大于内存块203的数据存储空间时,会占用内存块203的头部,甚至内存块202的部分空间。
图6为本申请另一实施例提供的一种内存块的示意图。内存管理指令中包括一个地址指针ptr,ptr指向第i个内存块的首地址。第i个内存块的头部中存有第i-1个内存块的使用状态、第i-1个内存块的大小和第i个内存块的大小;第i+1个内存块的头部中存有第i个内存块的使用状态、第i个内存块的大小和第i+1个内存块的大小;第i+2个内存块的头部中存有第i+1个内存块的使用状态、第i+1个内存块的大小和第i+2个内存块的大小。
根据内存管理指令中的ptr,可以知道当前占用的内存块为第i个内存块,从第i个内存块的头部中可以获取到第i-1个内存块的使用状态为空闲,据此可以知道第i-1个内存块是空闲内存块。
根据第i个内存块的头部中存储的第i个内存块的大小和ptr可以确定第i+1个内存块起始地址,同样的,根据第i+1个内存块的头部中存储的第i+1个内存块的大小也可以得到第i+2个内存块的起始地址,从而获取到第i+2个内存块的头部中存储的第i+1个内存块的使用状态,以确定第i+1个内存块为空闲内存块。按照此方法,便可以根据当前占用的内存块,判断其相邻的内存块是否为空闲。
具体的,在程序实现方式上,可以依据上述实施例的方法构建一个具体的函数memDefrag(void*ptr),通过数据搬移的方式腾出一段空间用来和相邻的空闲空间合并,以实现内存管理,可以将该函数作为VxWorks系统库的一个成员,与内存分配函数malloc()、内存释放函数free()、内存调整函数realloc()等系统函数一同管理系统内存。因该函数是在VxWorks内存管理机制的基础下新实现的一种功能,因此并不会破坏原有的内存管理机制。
下面,结合图7,描述一下该函数的实现过程。
图7为本申请另一实施例提供的一种内存管理示意图。
(1)首先,传递参数给memDefrag函数,参数是当前占用的2号内存块的首地址指针(ptr),函数在ptr的基础上通过地址偏移得到该内存块(即2号内存块)的块头地址,通过分析2号内存块的头部的内容,可以得知1号内存块是否为空闲内存块,如果是,则继续执行(2)。
(2)通过分析2号内存块的块头,可以得知2号内存块的大小,从而就能找到3号内存块的首地址,同理,找到4号内存块的首地址。
(3)通过分析4号内存块的块头,可以知道3号内存块是否为空闲内存块,如果是,则执行(4)。
(4)通过分析每个块头,还能得知上述所有内存块的大小是多少,根据内存块的大小,到AVL树中找到3号内存块,将其申请出来,并在2号内存块和3号内存块内进行数据搬移,得到5号内存块和6号内存块,并返回6号内存块的首地址新的地址指针(newPtr),如图7中的(b)。
(5)将5号内存块插入AVL树中。在插入过程中,5号内存块和1号内存块会进行合并重新插入AVL树,该合并插入的过程,VxWorks库中已有具体的实现过程。
图7中的(c)是该方法执行完后的最终效果,我们将3个内存块合并为2个,空闲块由多变少,由小变大。
图8为本申请一实施例提供的一种内存管理装置的结构示意图,如图8所示,本实施例的内存管理装置800可以包括:获取模块801和处理模块802。
获取模块801,用于获取内存管理指令;根据内存管理指令,获取内存的多个空闲内存块,多个空闲内存块为不连续的内存块;处理模块802,用于根据多个空闲内存块,得到目标空闲内存块,目标空闲内存块的内存空间大于多个空闲内存块中任意一个空闲内存块的内存空间。
可选的,内存管理指令中包括:第一信息,第一信息用于指示当前占用的内存块。获取模块801在根据内存管理指令,获取内存的多个空闲内存块时,具体用于:根据当前占用的内存块,获取多个空闲内存块。
可选的,获取模块801在根据当前占用的内存块,获取多个空闲内存块时,具体用于:根据当前占用的内存块,判断当前占用的内存块的相邻内存块是否为空闲;若是,则确定相邻内存块为空闲内存块。
可选的,获取模块801还用于:若当前占用的内存块的相邻内存块不为空闲,则将相邻内存块作为当前占用的内存块,继续判断与相邻内存块相邻的内存块是否为空闲;若是,则确定与相邻内存块相邻的内存块为空闲内存块。
可选的,第一信息为当前占用的内存块的起始地址,起始地址用于确定当前占用的内存块。
可选的,内存块包括头部;内存块的头部中包括第二信息和第三信息,第二信息用于指示内存块的上一个相邻内存块是否空闲,第三信息用于指示内存块的内存空间大小。若当前占用的内存块为第i个内存块,则获取模块801在根据当前占用的内存块,判断当前占用的内存块的相邻内存块是否为空闲时,具体用于:从第i个内存块的头部中获取第二信息,并根据第二信息,判断第i-1个内存块是否为空闲,第i-1个内存块为第i个内存块的上一个相邻内存块;根据第三信息,确定第i+2个内存块;从第i+2个内存块的头部中获取第二信息,并根据第二信息,判断第i+1个内存块是否为空闲,第i+1个内存块为第i个内存块的下一个相邻内存块,第i+2个内存块为第i+1个内存块的下一个相邻内存块。
可选的,根据所述第三信息,确定第i+2个内存块,包括:根据第一信息、第i个内存块的头部中的第三信息,确定第i+1个内存块的起始地址;根据第i+1个内存块的起始地址、第i+1个内存块的头部中的第三信息,确定第i+2个内存块的起始地址。
可选的,多个空闲内存块包括第一空闲内存块和第二空闲内存块,第一空闲内存块与第二空闲内存块之间存在N个当前占用的内存块且不存在空闲内存块,N为大于0的整数。处理模块802在根据多个空闲内存块,得到目标空闲内存块时,具体用于:将第一空闲内存块的内存空间以及N个当前占用的内存块的内存空间,确定为目标内存空间;将目标内存空间划分为N个第一内存块和一个第二内存块,其中,N个第一内存块分别作为N个当前占用的内存块,第二内存块作为空闲内存块且与第二空闲内存块相邻;将第二内存块和第二空闲内存块合并为目标空闲内存块。
可选的,将目标内存空间划分为N个第一内存块和一个第二内存块,包括:判断N个当前占用的内存块的内存空间大小是否小于第一空闲内存块的内存空间大小;若是,则将N个当前占用的内存块中的数据对应移动到第一空闲内存块的尾部,;以及将所述第一空闲块中包含移动后数据的内存空间确定为N个第一内存块,将所述目标内存空间中除所述N个第一内存块之外的内存空间确定为。
本实施例的装置,可以用于执行上述任一实施例的方法,其实现原理和技术效果类似,此处不再赘述。
图9为本申请一实施例提供的一种电子设备的结构示意图,如图9所示,本实施例的电子设备900可以包括:存储器901、处理器902和内存903。
存储器901,用于存储程序指令。
处理器902,用于调用并执行存储器中的程序指令,执行:获取内存管理指令;根据内存管理指令,获取内存903的多个空闲内存块,多个空闲内存块为不连续的内存块;根据多个空闲内存块,得到目标空闲内存块,目标空闲内存块的内存空间大于多个空闲内存块中任意一个空闲内存块的内存空间。
可选的,内存管理指令中包括:第一信息,第一信息用于指示当前占用的内存块。处理器902在根据内存管理指令,获取内存的多个空闲内存块时,具体用于执行:根据当前占用的内存块,获取多个空闲内存块。
可选的,处理器902在根据当前占用的内存块,获取多个空闲内存块时,具体用于执行:根据当前占用的内存块,判断当前占用的内存块的相邻内存块是否为空闲;若是,则确定相邻内存块为空闲内存块。
可选的,处理器902还用于执行:若当前占用的内存块的相邻内存块不为空闲,则将相邻内存块作为当前占用的内存块,继续判断与相邻内存块相邻的内存块是否为空闲;若是,则确定与相邻内存块相邻的内存块为空闲内存块。
可选的,第一信息为当前占用的内存块的起始地址,起始地址用于确定当前占用的内存块。
可选的,内存块包括头部;内存块的头部中包括第二信息和第三信息,第二信息用于指示内存块的上一个相邻内存块是否空闲,第三信息用于指示内存块的内存空间大小。若当前占用的内存块为第i个内存块,则处理器902在根据当前占用的内存块,判断当前占用的内存块的相邻内存块是否为空闲时,具体用于执行:从第i个内存块的头部中获取第二信息,并根据第二信息,判断第i-1个内存块是否为空闲,第i-1个内存块为第i个内存块的上一个相邻内存块;根据第三信息,确定第i+2个内存块;从第i+2个内存块的头部中获取第二信息,并根据第二信息,判断第i+1个内存块是否为空闲,第i+1个内存块为第i个内存块的下一个相邻内存块,第i+2个内存块为第i+1个内存块的下一个相邻内存块。
可选的,根据所述第三信息,确定第i+2个内存块,包括:根据第一信息、第i个内存块的头部中的第三信息,确定第i+1个内存块的起始地址;根据第i+1个内存块的起始地址、第i+1个内存块的头部中的第三信息,确定第i+2个内存块的起始地址。
可选的,多个空闲内存块包括第一空闲内存块和第二空闲内存块,第一空闲内存块与第二空闲内存块之间存在N个当前占用的内存块且不存在空闲内存块,N为大于0的整数。处理器902在根据多个空闲内存块,得到目标空闲内存块时,具体用于执行:将第一空闲内存块的内存空间以及N个当前占用的内存块的内存空间,确定为目标内存空间;将目标内存空间划分为N个第一内存块和一个第二内存块,其中,N个第一内存块分别作为N个当前占用的内存块,第二内存块作为空闲内存块且与第二空闲内存块相邻;将第二内存块和第二空闲内存块合并为目标空闲内存块。
可选的,将目标内存空间划分为N个第一内存块和一个第二内存块,包括:判断N个当前占用的内存块的内存空间大小是否小于第一空闲内存块的内存空间大小;若是,则将N个当前占用的内存块中的数据对应移动到第一空闲内存块的尾部,以得到N个第一内存块和一个第二内存块。
本实施例的设备,可以用于执行上述任一实施例的方法,其实现原理和技术效果类似,此处不再赘述。
另外,本申请还提供一种计算机可读存储介质,存储介质存储有计算机程序,计算机程序被处理器执行时,实现上述任一实施例的方法。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述各实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。

Claims (11)

1.一种内存管理方法,其特征在于,包括:
获取内存管理指令;
根据所述内存管理指令,获取内存的多个空闲内存块,所述多个空闲内存块为不连续的内存块;
根据所述多个空闲内存块,得到目标空闲内存块,所述目标空闲内存块的内存空间大于所述多个空闲内存块中任意一个空闲内存块的内存空间。
2.根据权利要求1所述的方法,其特征在于,所述内存管理指令中包括:第一信息,所述第一信息用于指示当前占用的内存块;
所述根据所述内存管理指令,获取内存的多个空闲内存块,包括:
根据所述当前占用的内存块,获取所述多个空闲内存块。
3.根据权利要求2所述的方法,其特征在于,所述根据所述当前占用的内存块,获取所述多个空闲内存块,包括:
根据所述当前占用的内存块,判断所述当前占用的内存块的相邻内存块是否为空闲;
若是,则确定所述相邻内存块为所述空闲内存块。
4.根据权利要求3所述的方法,其特征在于,还包括:
若所述当前占用的内存块的相邻内存块不为空闲,则将所述相邻内存块作为当前占用的内存块,继续判断与所述相邻内存块相邻的内存块是否为空闲;
若是,则确定与所述相邻内存块相邻的内存块为所述空闲内存块。
5.根据权利要求3或4所述的方法,其特征在于,内存块包括头部;所述内存块的头部中包括第二信息和第三信息,所述第二信息用于指示所述内存块的上一个相邻内存块是否空闲,所述第三信息用于指示所述内存块的内存空间大小;
若当前占用的内存块为第i个内存块,则所述根据所述当前占用的内存块,判断所述当前占用的内存块的相邻内存块是否为空闲,包括:
从所述第i个内存块的头部中获取第二信息,并根据所述第二信息,判断第i-1个内存块是否为空闲,所述第i-1个内存块为所述第i个内存块的上一个相邻内存块;
根据所述第三信息,确定第i+2个内存块;
从所述第i+2个内存块的头部中获取第二信息,并根据所述第二信息,判断第i+1个内存块是否为空闲,所述第i+1个内存块为所述第i个内存块的下一个相邻内存块,所述第i+2个内存块为所述第i+1个内存块的下一个相邻内存块。
6.根据权利要求5所述的方法,其特征在于,所述根据所述第三信息,确定第i+2个内存块,包括:
根据所述第一信息、所述第i个内存块的头部中的第三信息,确定第i+1个内存块的起始地址;
根据所述第i+1个内存块的起始地址、所述第i+1个内存块的头部中的第三信息,确定第i+2个内存块的起始地址。
7.根据权利要求1-4任一项所述的方法,其特征在于,所述多个空闲内存块包括第一空闲内存块和第二空闲内存块,所述第一空闲内存块与所述第二空闲内存块之间存在N个当前占用的内存块且不存在空闲内存块,所述N为大于0的整数;
所述根据所述多个空闲内存块,得到目标空闲内存块,包括:
将所述第一空闲内存块的内存空间以及所述N个当前占用的内存块的内存空间,确定为目标内存空间;
将所述目标内存空间划分为N个第一内存块和一个第二内存块,其中,N个第一内存块分别作为所述N个当前占用的内存块,所述第二内存块作为空闲内存块且与所述第二空闲内存块相邻;
将所述第二内存块和所述第二空闲内存块合并为所述目标空闲内存块。
8.根据权利要求7所述的方法,其特征在于,所述将所述目标内存空间划分为N个第一内存块和一个第二内存块,包括:
判断所述N个当前占用的内存块的内存空间大小是否小于所述第一空闲内存块的内存空间大小;
若是,则将所述N个当前占用的内存块中的数据对应移动到所述第一空闲内存块的尾部;以及
将所述第一空闲块中包含移动后数据的内存空间确定为N个第一内存块,将所述目标内存空间中除所述N个第一内存块之外的内存空间确定为所述第二内存块。
9.一种内存管理装置,其特征在于,包括:
获取模块,用于获取内存管理指令;根据所述内存管理指令,获取内存的多个空闲内存块,所述多个空闲内存块为不连续的内存块;
处理模块,用于根据所述多个空闲内存块,得到目标空闲内存块,所述目标空闲内存块的内存空间大于所述多个空闲内存块中任意一个空闲内存块的内存空间。
10.一种电子设备,其特征在于,包括:
存储器,用于存储程序指令;
处理器,用于调用并执行所述存储器中的程序指令,执行如权利要求1至8中任一项所述的方法。
11.一种计算机可读存储介质,其特征在于,所述存储介质存储有计算机程序,所述计算机程序被处理器执行时,实现如权利要求1-8任一项所述的方法。
CN202010612893.0A 2020-06-30 2020-06-30 内存管理方法、装置、设备和存储介质 Pending CN113867925A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010612893.0A CN113867925A (zh) 2020-06-30 2020-06-30 内存管理方法、装置、设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010612893.0A CN113867925A (zh) 2020-06-30 2020-06-30 内存管理方法、装置、设备和存储介质

Publications (1)

Publication Number Publication Date
CN113867925A true CN113867925A (zh) 2021-12-31

Family

ID=78981221

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010612893.0A Pending CN113867925A (zh) 2020-06-30 2020-06-30 内存管理方法、装置、设备和存储介质

Country Status (1)

Country Link
CN (1) CN113867925A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2024109366A1 (zh) * 2022-11-23 2024-05-30 腾讯科技(深圳)有限公司 内存碎片的整理方法、装置、设备及存储介质

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2024109366A1 (zh) * 2022-11-23 2024-05-30 腾讯科技(深圳)有限公司 内存碎片的整理方法、装置、设备及存储介质

Similar Documents

Publication Publication Date Title
CN109690498B (zh) 内存管理方法和设备
CN108038002B (zh) 一种嵌入式软件内存管理方法
CN108132842B (zh) 一种嵌入式软件内存管理系统
US11074179B2 (en) Managing objects stored in memory
JP2005108216A (ja) 客体志向プログラムの動的メモリ管理方法及び装置
US20100030994A1 (en) Methods, systems, and computer readable media for memory allocation and deallocation
CN112685333B (zh) 一种堆内存管理方法及装置
US11567940B1 (en) Cache-aware system and method for identifying matching portions of two sets of data in a multiprocessor system
US8972629B2 (en) Low-contention update buffer queuing for large systems
CN104850505A (zh) 基于链式堆叠的内存管理方法与系统
CN111291062B (zh) 数据同步写入方法、装置、计算机设备及存储介质
CN115712500A (zh) 内存释放、内存恢复方法、装置、计算机设备及存储介质
CN113867925A (zh) 内存管理方法、装置、设备和存储介质
US8274521B2 (en) System available cache color map
US20060236065A1 (en) Method and system for variable dynamic memory management
US6704851B2 (en) Method of dynamically allocating a memory
US6766336B2 (en) Garbage collection apparatus and a garbage collection method
CN111338981A (zh) 一种内存防碎片方法、系统及储存介质
CN115729702A (zh) 应用程序内存配置方法、电子设备、计算机存储介质
CN115756838A (zh) 内存释放、内存恢复方法、装置、计算机设备及存储介质
CN111722802B (zh) 一种元数据lsa卷的存储空间分配方法、装置及设备
CN113961302A (zh) 资源分配方法、装置、电子设备及存储介质
CN112000471B (zh) 内存优化方法及装置
CN112068948A (zh) 数据散列方法、可读存储介质和电子设备
CN112799711B (zh) 合并容器镜像的方法、装置、计算机设备和存储介质

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