CN116661690A - 记录内存状态的方法、装置、计算机设备及存储介质 - Google Patents
记录内存状态的方法、装置、计算机设备及存储介质 Download PDFInfo
- Publication number
- CN116661690A CN116661690A CN202310595047.6A CN202310595047A CN116661690A CN 116661690 A CN116661690 A CN 116661690A CN 202310595047 A CN202310595047 A CN 202310595047A CN 116661690 A CN116661690 A CN 116661690A
- Authority
- CN
- China
- Prior art keywords
- array
- recorded
- memory
- basic element
- level
- 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
Links
- 230000015654 memory Effects 0.000 title claims abstract description 437
- 238000000034 method Methods 0.000 title claims abstract description 78
- 239000002585 base Substances 0.000 claims description 49
- 239000012458 free base Substances 0.000 claims description 15
- 238000004590 computer program Methods 0.000 claims description 11
- 239000003990 capacitor Substances 0.000 claims description 5
- 230000008859 change Effects 0.000 claims description 4
- 230000009467 reduction Effects 0.000 claims description 4
- 238000007726 management method Methods 0.000 description 34
- 230000008569 process Effects 0.000 description 27
- 230000006870 function Effects 0.000 description 25
- 238000012217 deletion Methods 0.000 description 11
- 238000003491 array Methods 0.000 description 10
- 230000037430 deletion Effects 0.000 description 10
- 238000010586 diagram Methods 0.000 description 10
- 238000003780 insertion Methods 0.000 description 7
- 230000037431 insertion Effects 0.000 description 7
- 235000019580 granularity Nutrition 0.000 description 6
- 238000013461 design Methods 0.000 description 4
- 238000012545 processing Methods 0.000 description 4
- 238000012986 modification Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 238000004422 calculation algorithm Methods 0.000 description 2
- 239000000463 material Substances 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 1
- 230000032683 aging Effects 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 238000013475 authorization Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000013144 data compression Methods 0.000 description 1
- 235000019800 disodium phosphate Nutrition 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 239000004744 fabric Substances 0.000 description 1
- 230000010365 information processing Effects 0.000 description 1
- 230000002452 interceptive effect Effects 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/0604—Improving or facilitating administration, e.g. storage management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0638—Organizing or formatting or addressing of data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0646—Horizontal data movement in storage systems, i.e. moving data in between storage devices or systems
- G06F3/065—Replication mechanisms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0668—Interfaces specially adapted for storage systems adopting a particular infrastructure
- G06F3/0671—In-line storage system
- G06F3/0673—Single storage device
- G06F3/0679—Non-volatile semiconductor memory device, e.g. flash memory, one time programmable memory [OTP]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation 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/5016—Allocation 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation 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/5022—Mechanisms to release resources
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- Software Systems (AREA)
- Techniques For Improving Reliability Of Storages (AREA)
Abstract
本公开提供记录内存状态的方法、装置、计算机设备及存储介质,方法中数组包括一级数组和二级数组,一级数组包括一级元素,一级元素记录二级数组的内存地址信息,二级数组包括基本元素,基本元素用于记录内存块信息;当需要将目标内存块信息记录至数组的空闲基本元素中时,若确定所述数组中不存在空闲基本元素,创建新的一级数组,将当前一级数组中各一级元素记录的内存地址信息复制至新的一级数组的一级元素中,并释放当前一级数组;新的一级数组的一级元素个数,大于当前一级数组的一级元素个数;创建新的二级数组,将新的二级数组的内存地址信息记录至新的一级数组的空闲一级元素中;将目标内存块信息记录至新的二级数组的空闲基本元素中。
Description
技术领域
本公开涉及内存管理技术领域,尤其涉及记录内存状态的方法、装置、计算机设备及存储介质。
背景技术
在内存管理领域,操作系统的内存管理模块会有内存块的冷热状态扫描功能,该功能会扫描各已分配内存块的冷热状态等信息并进行记录;例如,将冷状态的各内存块的信息记录于一冷状态集合中,将热状态的各内存块的信息记录于一热状态集合中。这些集合可被后续的内存交换等流程所使用到
相关技术中,针对每种状态,通常是创建一固定大小的数组,数组中的每个元素用于记录该种状态的一个或多个连续内存块信息。上述方案的局限在于,内存块的冷热状态是在变动的,固定大小的数组可能会变得不够用,也可能变得很空闲。在不够用的情况下,需要重新创建一个更大的数组,并将旧数组中各元素记录的信息都复制到新数组中,复制过程的开销较大。
发明内容
为克服相关技术中存在的问题,本公开提供了记录内存状态的方法、装置、计算机设备及存储介质。
根据本说明书实施例的第一方面,提供一种记录内存状态的方法,所述方法用于通过数组记录处于所述数组对应状态的内存块信息;
其中,所述数组包括一级数组和至少一个二级数组,所述一级数组包括至少一个一级元素,所述一级元素记录二级数组的内存地址信息,所述二级数组包括至少一个基本元素,所述基本元素用于记录内存块信息;
所述方法包括:
当需要将目标内存块信息记录至所述数组的空闲基本元素中时,若确定所述数组中不存在空闲基本元素,执行如下扩容步骤:
创建新的一级数组,将所述数组的当前一级数组中各一级元素记录的内存地址信息复制至所述新的一级数组的一级元素中,并释放所述当前一级数组;其中,所述新的一级数组的一级元素个数,大于所述当前一级数组的一级元素个数;
创建新的二级数组,将所述新的二级数组的内存地址信息记录至所述新的一级数组的空闲一级元素中;
将所述目标内存块信息记录至所述新的二级数组的空闲基本元素中。
根据本说明书实施例的第二方面,提供一种记录内存状态的装置,所述装置用于通过数组记录处于所述数组对应状态的内存块信息;
其中,所述数组包括一级数组和至少一个二级数组,所述一级数组包括至少一个一级元素,所述一级元素记录二级数组的内存地址信息,所述二级数组包括至少一个基本元素,所述基本元素用于记录内存块信息;
所述装置包括:
确定模块,用于当需要将目标内存块信息记录至所述数组的空闲基本元素中时,若确定所述数组中不存在空闲基本元素,触发扩容模块;
扩容模块,用于:
创建新的一级数组,将所述数组的当前一级数组中各一级元素记录的内存地址信息复制至所述新的一级数组的一级元素中,并释放所述当前一级数组;其中,所述新的一级数组的一级元素个数,大于所述当前一级数组的一级元素个数;
创建新的二级数组,将所述新的二级数组的内存地址信息记录至所述新的一级数组的空闲一级元素中;
将所述目标内存块信息记录至所述新的二级数组的空闲基本元素中。
根据本说明书实施例的第三方面,提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,所述处理器执行所述计算机程序时实现前述第一方面所述方法实施例的步骤。
根据本说明书实施例的第四方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现前述第一方面所述方法实施例的步骤。
本说明书的实施例提供的技术方案可以包括以下有益效果:
本说明书实施例中,设计了多层级的数组结构,最上层的是一级数组,包括至少一个一级元素,每个一级元素用于存放该元素对应的二级数组的内存地址信息,即每个一级元素指向一个二级数组;每个二级数组包括至少一个基本元素,每个二级数组可以理解为其包括的基本元素的集合,最底层的基本元素用于记录内存块信息。因此,利用本实施例的方案可以实现一不固定大小的数组,当数组中的基本元素用完后进行扩容。扩容时创建新的一级数组,基于本实施例所设计的数组结构,由于旧的一级数组中一级元素存储的是二级数组的地址信息,因此可以只需要复制一级元素中存储的地址信息至新的一级数组即可,无需复制基本元素中存储的内存块信息,避免了大量数据的拷贝,可以显著地减少开销。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本说明书的实施例,并与说明书一起用于解释本公开的原理。
图1A是本说明书根据一示例性实施例示出的一种预留内存场景的示意图。
图1B是本说明书根据一示例性实施例示出的另一种预留内存场景的示意图。
图2A是本说明书根据一示例性实施例示出的一种记录内存状态的方法的流程图。
图2B是本说明书根据一示例性实施例示出的一种NUMA架构的示意图。
图2C是本说明书根据一示例性实施例示出的数组扩容示意图。
图3是本说明书根据一示例性实施例示出的一种记录内存状态的装置所在设备的框图。
图4是本说明书根据一示例性实施例示出的一种记录内存状态的装置的框图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书的一些方面相一致的装置和方法的例子。
在本说明书使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书。在本说明书和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
本公开所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,并且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准,并提供有相应的操作入口,供用户选择授权或者拒绝。
操作系统的内存管理模块会将内存按设定的管理粒度进行划分,其中,每一管理粒度可称为页(page),或者也可称为块。在一些例子中,计算机设备可以采用传统的内存管理架构,即由操作系统管理整个内存。在另一些场景中,例如虚拟机场景下,计算机设备可以采用预留内存的内存分配架构,如图1A所示,是本说明书根据一示例性示出的预留内存场景的示意图,在该架构中,宿主机的内存可以包括多种存储空间,如图1A中采用不同填充方式示出了内存的其中两个存储空间,包括供内核使用的非预留存储空间a(图中采用斜线填充),以及供虚拟机使用的预留存储空间b(图中采用网格线填充)。也即是,非预留存储空间a用于供图中的内核使用,内核对该存储空间的划分粒度通常较小,例如4KB(Kilobyte,千字节)等;运行于操作系统上的应用(如图中示例的应用1至应用3)可使用该非预留存储空间a。而预留存储空间b则可供虚拟机(VM,Virtual Machine)使用,如图中示出的VM1至VMn共n个虚拟机。两个存储空间可以采用不同的管理粒度,即对内存的划分方式可以是不同的。图1A中为了示例方便,两个存储空间在图中是以连续的方式进行示意的。可以理解,实际应用中,两个存储空间可以是非连续的。实际应用中,内存中还可以划分更多的存储空间以实现更多不同的功能。
预留存储空间占据内存的大部分,且对于宿主机内核不可用,可以在操作系统的内核中插入一模块专门用于对预留存储空间进行管理。为了方便管理这一系列的内存同时避免大量元数据对内存的占用,以及考虑到为虚拟机分配内存时往往最少也是数百MB(MByte,兆字节)起,因此预留存储空间采用以较大的粒度划分,例如将预留存储空间划分为2MB等大小的内存块(Memory Section,MS)进行管理;在一些场景中,大粒度也普遍被使用,如1GB(GigaByte,吉字节)等都是可选的,本实施例对此不进行限定。
操作系统中的内存管理模块用于管理内存,在应用于预留内存场景时,操作系统可以采用不同的内存管理模块分别管理预留存储空间与非预留存储空间,例如,操作系统的预留内存管理模块管理预留存储空间,内核内存管理模块管理非预留存储空间。
由于计算机的物理内存是有限的,而进程对内存的使用是不确定的,所以物理内存总有用完的可能性。操作系统采用内存交换解决物理内存不足的问题。内核会选取出处于冷状态的内存块进行释放,将该内存块存储的数据进行内存块合并、数据压缩至其他内存块或换出至磁盘等。然后把内存块分配给更紧急的其他进程使用,当原进程用到时再将数据换入至新的内存块并还给原进程。
内存管理模块会扫描已分配内存块的冷热状态。具体的,内存管理模块可以持续获取各个内存块被进程访问的时间或频率等信息,确定内存块的冷热状态。热状态(active)表示内存块最近被进程访问,冷状态(inactive)表示内存块最近未被进程访问,内存管理模块会通过热页集合记录各个处于热状态的内存块,通过冷页集合记录各个处于冷状态的内存块。冷页集合中记录了最近没有被访问的内存块集合。这部分内存块在内存紧张的情况下,是可以被迁移到二级存储上,以便腾出更多的内存给活跃的虚拟机使用。
如图1B所示,是本说明书根据一示例性示出的预留内存场景的示意图,该图中示出了内存中存储的各种数据,例如可以包括用户空间的区域,其中的用户空间是指操作系统为每个用户程序分配的内存区域,用于存放用户程序(如图中示出的n个虚拟机)在执行过程中所需的数据和代码。图中还示出供内核使用的区域,在该内核空间内可以包括用于管理虚拟机的KVM(Kernel-based Virtual Machine,即基于内核的虚拟机)和至少一个NUMA(Non Uniform Memory Access Architecture,非一致内存访问)节点,图中以两个节点(Node 0和Node 1)为例。
图中还示出了内存中预留内存区域,本实施例以Linux(一种操作系统)为例,其中“vem.ko”是一个Linux内核中的一个模块,该模块用于管理虚拟机。该模块还包括“/dev/vmem”模块,和“vmem_mm_x.ko”模块,均表示Linux中的虚拟内存模块。“/dev/vmem”模块指向“cdev.ops”,“cdev.ops”是Linux中字符设备驱动中的一个结构体变量,它包含了该字符设备操作的函数地址。“/dev/vmem”模块下连接有元数据,例如图中示出的“**mm”和“nobjs”等字段。该元数据下链接有管理各个node节点的元数据,该元数据下包括“**ms”、“mmap”和“Lru”等字段。其中,“mmap”字段用于链接用于记录预留内存区域中各内存块的分配情况的元数据,“Lru”字段所连接的元数据包含总的老化功能的各种控制字段,以及每节点的冷热node结构。
每个node节点的元数据,例如图中node0节点的元数据和node1节点的元数据。每个节点下还包括用于记录内存块的各种状态的元数据,例如图中包括活跃(active)状态和非活跃(inactive)状态两种状态的元数据。以活跃状态为例,其元数据中的字段包括起始内存块编号idx、大小size、进程标识和用于指向下一个内存范围的next字段。非活跃状态的元数据也同理。
针对内存块的每种状态,内存管理模块可以创建一固定大小的数组,数组中的每个元素用于记录该种状态的一个或多个连续内存块信息。上述方案的局限在于,内存块的冷热状态是在变动的,固定大小的数组可能会变得不够用,也可能变得很空闲。在不够用的情况下,需要重新创建一个更大的数组,并将旧数组中各元素记录的信息都复制到新数组中,复制过程的开销较大。
基于此,本说明书实施例提供一种记录内存状态信息的方案,如图2A所示,图2A是本说明书根据一示例性实施例示出的一种记录内存状态方法的流程图,本实施例方法用于通过数组记录处于所述数组对应状态的内存块信息。其中,所述数组包括一级数组和至少一个二级数组,所述一级数组包括至少一个一级元素,每个所述一级元素记录一个二级数组的内存地址信息,所述二级数组包括至少一个基本元素,所述基本元素用于记录内存块信息。
所述方法可以包括以下步骤:
在步骤202中、当需要将目标内存块信息记录至所述数组的空闲基本元素中时,若确定所述数组中不存在空闲基本元素,执行扩容步骤:
在步骤204中、创建新的一级数组,将所述数组的当前一级数组中各一级元素记录的内存地址信息复制至所述新的一级数组的一级元素中,并释放所述当前一级数组。
其中,所述新的一级数组的一级元素个数,大于所述当前一级数组的一级元素个数。
在步骤206中、创建新的二级数组,将所述新的二级数组的内存地址信息记录至所述新的一级数组的空闲一级元素中。
在步骤208中、将所述目标内存块信息记录至所述新的二级数组的空闲基本元素中。
本实施例的方案可以应用于任一计算机设备中,计算机设备可以是单核CPU(Central Processing Unit,中央处理器)设备,也可以包括多个物理CPU的设备,根据需要可以采用非一致内存访问(Non Uniform Memory Access Architecture,NUMA)架构,NUMA架构包括至少两个NUMA节点(NUMA node),如图2B所示,以两个NUMA节点作为示例,宿主机可以包括NUMA节点1和NUMA节点2。在NUMA架构下,宿主机的多个物理CPU以及多个内存从属于不同的NUMA节点。每个NUMA节点均包括至少一个物理CPU与至少一个物理内存,图2B以NUMA节点包括一个物理CPU和一个物理内存为例。在NUMA节点内部,物理CPU与物理内存之间使用集成内存控制器总线(Integrated Memory Controller Bus,IMC Bus)进行通信,而NUMA节点之间则使用快速通道互联(Quick Path Interconnect,QPI)进行通信。由于QPI的延迟高于IMC Bus的延迟,因此宿主机上物理CPU对内存的访问就有了远近之别(remote/local)。物理CPU访问本节点的物理内存速度较快,物理CPU访问其他NUMA节点的物理内存速度较慢。
在NUMA架构场景中,本实施例的内存可以包括上述任一物理内存。可选的,NUMA架构中任一物理内存还可以采用预留内存架构。基于此,本实施例所管理的存储空间还可以是指NUMA架构中任一物理内存中的预留存储空间。
可以理解,实际应用中,计算机设备还可以采用其他架构,根据实际需要,本实施例所指的内存根据实际应用场景可以有多种实现方式,在此不再一一列举。
本实施例方法可以应用于任意计算机设备的操作系统的任意内存管理模块中。如前述的预留内存场景中,可以应用于操作系统的预留内存管理模块中。
实际应用中,内存管理模块可以创建多个不同类型的数组,不同状态的内存块信息记录于不同类型的数组中。此处的状态可以根据实际需要进行配置,作为例子可以包括:活跃(active)状态、非活跃(inactive)状态、暂停(paused)状态或固定(pinned)状态等等。可选的,每种状态还可以根据需要进行分级,每个级别对应一个数组。每个数组下记录的内存块信息形成一个集合set。每个数组均可以采用本实施例方法进行管理。
在应用于NUMA场景下,每个NUMA节点下的内存均有对应的数组。上述不同类型的数组也会是每个节点都会有一系列的不同集合set。每个节点node可以创建一个结构体node,用于管理该节点下各个数组,这些内存集组成一个node结构。还可以采用更上一层的结构体lru管理各个NUMA节点下的结构体node。
本实施例设计了多层级的数组结构,最上层的是一级数组,包括至少一个一级元素(个数可以根据需要进行配置),每个一级元素用于存放该元素对应的二级数组的地址指针(即二级数组的内存地址信息),即每个一级元素指向一个二级数组。每个二级数组包括至少一个基本元素,每个二级数组可以理解为其包括的基本元素的集合,最底层的基本元素用于记录内存块信息。利用本实施例的方案可以实现一不固定大小的数组,当数组中的基本元素用完后进行扩容。扩容时创建新的一级数组,基于本实施例所设计的数组结构,由于旧的一级数组中一级元素存储的是二级数组的地址信息,因此可以只需要复制一级元素中存储的地址信息至新的一级数组即可,无需复制基本元素中存储的内存块信息,避免了大量数据的拷贝,可以显著地减少开销。一级数组扩容后,新的一级数组中一级元素个数增加,因此可以创建出新的二级数组,可从新的二级数组中获取空闲基本元素,将目标内存块信息记录至空闲基本元素中。
如图2C所示,图中一级数组包括3个一级元素,分别存放三个地址:地址A、地址B和地址C,分别表示三个已创建的二级数组(二级数组A、二级数组B和二级数组C)在内存中的地址,各二级数组均以包括10个基本元素oarr_item为例,实际应用中各二级数组的基本元素的个数可以不同,本实施例对此不进行限定。若各个基本元素均已记录,一级数组已满,未有空闲基本元素。可以利用本实施例的方案进行扩容,扩容后的一级数组如图所示,此处扩容后的新的一级数组相对于旧一级数组,其一级元素增加了1个,实际应用中可以根据需要灵活配置新的一级数组相对于旧一级数组所增加的一级元素的个数,本实施例对此不进行限定。由于一级元素存储的是二级数组的地址信息,因此,只需要复制旧一级数组中的存放的三个地址至新一级数组中即可,而无需复制各基本元素中存储的内存块信息,避免了大量数据的拷贝,可以显著地减少开销。而新一级数组增加了一级元素,因此可以创建更多的二级数组,从而得到更多的基本元素,即图中所示,创建了新的二级数组D,二级数组D在内存中的地址信息(即图中的地址D)可以写入至一级数组中的增加的一级元素中。
在一些例子中,所述方法还包括:若确定所述数组中存在空闲基本元素,将所述目标内存块信息记录至所述空闲基本元素中。通过该实施例可以在数组中还有空闲基本元素的情况下,利用空闲基本元素记录目标内存块信息。
在一些例子中,所述数组中是否存在空闲基本元素,是通过如下方式确定的:
确定所述数组中的二级数组是否有空闲基本元素;
若有,确定所述数组中存在空闲基本元素;若无,确定所述数组的一级数组中是否有空闲一级元素;
若有空闲一级元素,创建新的二级数组,将内存地址信息记录于所述空闲一级元素后,确定存在空闲的基本元素;
若未有空闲的一级元素,确定所述数组中未有空闲的基本元素。
通过本实施例中可以先确定一级数组的一级元素是否已满,若未满可以先扩容二级数组,在一级元素已满的情况下再扩容一级数组。
在一些例子中,内存管理模块可以通过创建数组元数据(也即是结构体)管理整个数组,建数组元数据可以根据需要设计一种或多种字段,用于记录数组的各种信息。此处的字段可以根据需要进行配置。本实施例中,基本元素用于记录内存块信息,本实施例将未记录信息的基本元素称为空闲基本元素,记录信息的称为已记录基本元素。数组是一种线性表数据结构,在内存中占用连续的内存空间,数组中各元素按顺序存储,并对各元素进行编号,编号顺序与元素的存储顺序相同;例如,创建包括5个元素的数组,各元素在内存中顺序存储,编号依次是0至4。本实施例中,所述内存管理模块在初始化时创建用于记录所述数组信息的数组元数据,所述数组元数据中包括:用于指向首个已记录基本元素的头部字段head;所述基本元素的字段包括:next字段,所述next字段的初始值为表示该基本元素是空闲基本元素的空闲标记;在所述基本元素从空闲基本元素变更为已记录基本元素的情况下,所述next字段用于指向所述基本元素的下一已记录基本元素或者指向自身。通过上述实施例,可以使数组中可以记录各已记录基本元素之间的链接关系,便于后续的基本元素的更新。例如,在将目标内存块信息记录至空闲基本元素中后,所述方法还可包括:更新被记录的空闲基本元素的next字段。基于此,可以通过上述方式可以将已记录基本元素链接起来,方便后续的使用。
可选的,可以对所有二级数组里面所有的基本元素进行编号,从而整个数组中所有基本元素都有自己的编号,字段head和next字段均可以记录基本元素的编号。
在冷热状态场景下,记录所述目标内存块信息的目标基本元素的next字段可以通过如下方式进行更新:
若所述头部字段未指向首个已记录基本元素,将所述头部字段更新为指向所述目标基本元素,将所述目标基本元素的next字段更新为指向自身;
若所述头部字段指向首个已记录基本元素,根据所述头部字段查找最后一个指向自身的已记录基本元素,将所述最后一个指向自身的已记录基本元素的next字段更新为指向所述目标基本元素,并将所述目标基本元素的next字段更新为指向自身。
本实施例中数组用于记录内存块状态,本实施例可以采用乱序方式管理各已记录基本元素,即数组下各已记录基本元素是乱序的,此处的乱序是指基本元素中包括一next字段,对于已记录基本元素,该next字段用于指向下一已记录基本元素,从而各个已记录基本元素采用特定的顺序连接。其中,数组结构体中的head字段用于指向首个已记录基本元素。基于此,可以实现冷热内存块的记录,新插入数据的基本元素会从尾部位置插入,使得较旧的内存块在头部,较新的内存块在尾部。从而对于冷状态集合,越头部的内存块越冷;对于热状态集合,越尾部的内存块越热。而要进行内存换出操作时,则只需要从冷状态集合的头部取出内存块信息并释放对应的基本元素。
例如,内存管理模块初始化时可以创建用于管理数组的数组结构体,其中head字段暂未指向任何基本元素,例如,head字段的初始值可以为空或空闲标记等,以表示其未指向基本元素。其他字段的初始化值可进行相应的配置。并创建一个一级数组(包括olen个一级元素)和一个二级数组(包括len个基本元素,例如基本元素[0]至基本元素[len-1]),实际应用中多个二级数组也是可选的,本实施例对此不进行限定。首个一级元素存储二级数组的地址指针,其他一级元素是空闲元素。每个基本元素的next字段初始值为表示该基本元素是空闲元素的空闲标记,此时所有基本元素都是空闲元素。完成初始化后,内存管理模块可以在需要的时候往数组中的空闲基本元素写入内存块信息。通过上述实施例,可以在初始化时创建较小的数组,减少对内存空间的占用。
以冷状态集合为例,内存管理模块扫描到一段内存范围属于冷状态,该段内存范围是指从内存块idx_A至内存块idx_C共3个内存块。在一些例子中,基本元素记录的内存块信息包括:以起始内存块编号和内存块数量表示的内存范围信息;基于此,可以将内存范围信息range(起始内存块编号idx_A和内存块数量size3)写入至其中一个空闲基本元素。在一些例子中,若确定所述数组中存在空闲基本元素,将所述目标内存块信息记录至所述空闲基本元素中。本实施例不限定空闲基本元素的选取方式,例如选取基本元素[0]记录上述内存范围信息,可选的,还可以记录这些内存块所属进程pid_p。由于基本元素[0]写入信息后变更为已记录基本元素,数组结构体的head字段更新为指向基本元素[0]。由于目前只有一个已记录基本元素,基本元素[0]的next字段此时从空闲标记更新为指向自身,例如更新为自身基本元素的编号,从而表示基本元素[0]并非空闲,也表示自身是数组当前的最后一个已记录基本元素。
内存管理模块继续扫描,得到下一个冷状态的内存范围,并利用空闲基本元素[1]记录它,记录后基本元素[1]插入至数组的尾部(本实施例简称为基本元素的插入,即新得到一个已记录基本元素,并将其插入至数组中已记录基本元素的链接中);具体的,可以是从数组结构体的head字段开始遍历,由于head指向基本元素[0],而基本元素[0]的next指向自身,因此可以确定到达数组尾部,修改基本元素[0]的next字段指向基本元素[1],将基本元素[1]的next字段修改为指向自身。
假设内存管理模块持续扫描冷状态的内存块,并持续地在数组中写入内存块信息,并且假设在这个阶段未发生已记录基本元素的释放,当前数组的记录R1可以如下表示,用于表征已记录基本元素形成的链接:
head→基本元素[0]的next→基本元素[1]的next→……基本元素[len-1];基本元素[len-1]的next指向自身;其中,此处基本元素之间的链接关系恰好是与基本元素的编号顺序相同,此处仅为示例,实际应用中是如前述实施例所言,各已记录基本元素的链接关系中“编号”可以是乱序的。
此时空闲基本元素已经使用完,内存管理模块继续扫描,还需要使用空闲基本元素存储内存块信息。由于一级数组中的空闲一级元素还有olen-1个,可以创建第二个二级数组,并将地址信息存储于一级数组中的第二个一级元素中。以此类推。以基本元素有2*len个为例,假设当前数组的记录R2是:
head→基本元素[0]的next→基本元素[1]的next→……基本元素[len-1]→基本元素[len]→……基本元素[2len];基本元素[2len]的next指向自身。
实际应用中,还会发生已记录基本元素的释放,可选的,所述方法还包括:确定第一已记录基本元素需变更为空闲基本元素,执行如下步骤:
若所述头部字段未指向第一已记录基本元素,且所述第一已记录基本元素的next字段未指向自身,将指向所述第一已记录基本元素的上一基本元素的next字段,更新为所述第一已记录基本元素的next字段所指向的基本元素;
若所述头部字段未指向第一已记录基本元素,且所述第一已记录基本元素的next字段指向自身,将指向所述第一已记录基本元素的上一基本元素的next字段更新为指向自身;
若所述头部字段指向所述第一已记录基本元素,且所述第一已记录基本元素的next字段未指向自身,将所述头部字段更新为指向所述第一已记录基本元素的next字段所指向的基本元素;
若所述头部字段指向所述第一已记录基本元素,且所述第一已记录基本元素的next字段指向自身,在当前一级数组是经过扩容的情况下,执行如下缩容流程:创建缩容一级数组以替换所述当前一级数组;其中,所述缩容一级数组中一级元素的个数小于当前一级数组的一级元素个数。
其中,创建缩容一级数组以替换所述当前一级数组可以有多种方式,例如可以是创建新的缩容一级数组后,释放当前一级数组;也可以是在当前一级数组中直接删除一级元素,删除后得到的新的一级数组用于替代未删除前的一级数组。
针对前述的数组记录R2,若此时内存管理模块的内存换出功能确定需要取出一个冷状态的内存块进行换出,可利用数组结构体的head字段取出,因为最冷的内存块位于数组的头部。根据head指向的基本元素[0],利用基本元素[0]中记录的内存范围信息(起始内存块编号idx_A和内存块数量size3)即可。假设每次只取出一个内存块,例如只取出内存块idx_A,则更新基本元素[0]中记录的内存范围信息为起始内存块编号idx_B和内存块数量size2。假设3个内存块均取出,则基本元素[0]被释放,变更为空闲基本元素,需要将其从已记录基本元素的链接中删除,具体的,将head字段更新为基本元素[0]的next的指向,即head更新为指向基本元素[1],也即是数组中的记录更新为如下的记录R3:
head→基本元素[1]的next→……基本元素[len-1]→基本元素[len]→……基本元素[2len];基本元素[2len]的next指向自身。
上述已记录基本元素被释放是在内存换出场景下被触发的,实际应用中还有其他时机触发已记录基本元素的释放。例如,原本记录于数组中的冷状态内存块,由于进程的访问变更为热状态,因此需要从冷状态集合从删除记录。或者,进程被结束,分配给进程的内存块被回收,记录于数组中的冷状态内存块需要从数组中删除记录。热状态数组也同理。
当确定目标内存块信息需要写入至数组中时,有可能可以通过更新数组中的已记录基本元素来覆盖目标内存块信息,而无需分配一个新的空闲基本元素来进行记录。例如,在一些例子中,所述确定目标内存块信息需要写入至数组中的空闲基本元素,可以包括:
遍历所述数组中各已记录基本元素记录的内存范围信息;
若所述目标内存块的编号未与已记录的各内存范围信息相邻,确定所述目标内存块的信息需要记录至所述数组的空闲基本元素。
例如,假设目标内存块信息是idxK,数组中任一已记录基本元素记录的内存范围均未与idxK相邻,因此需要利用一空闲基本元素来对其进行记录。本实施例中,是在目标内存块的编号未与已记录的各内存范围信息相邻的情况下,才分配一个新的空闲基本元素来进行记录,可以减少对内存的占用。
在另一些例子中,所述方法还可包括:若所述目标内存块的编号与所述目标内存范围信息相邻,修改记录所述目标内存范围信息的基本元素中记录的内存块数量,以使修改后的所述目标内存范围信息覆盖所述目标内存块。
例如,假设目标内存块信息是idxK,数组中某个已记录基本元素的内存范围是(idxI,2),即从idxI开始的2个内存块大小的范围,由于idxK与该范围相邻(在该范围之后),因此,更新该已记录基本元素的内存范围信息,使其覆盖idxK即可。例如,将该基本元素的内存范围信息更新为(idxI,3)。通过本实施例,可以利用已记录基本元素来记录当前所需要记录的内存块信息,可以减少对内存的占用。可选的,已记录基本元素还可以额外包括进程标识字段pid,用于表示该段内存范围所属的进程,一个基本元素中记录的该段内存范围,若覆盖到多个内存块,则这多个内存块属于同一个进程;在将目标内存块的编号记录于数组中时,若所述目标内存块的编号与所述目标内存范围信息相邻,还可以是目标内存块与该目标内存范围信息属于同一个进程,若不属于同一个进程,目标内存块还可以采用新的基本元素进行记录,而不与目标内存范围记录于同一个基本元素中;也即是,不同进程的内存块不记录于同一个基本元素中,从而可以区分不同进程的内存块。
实际应用中,还会发生内存块信息的删除。例如,内存块冷热状态发生变化,或者内存块所在进程被释放,或者是冷状态内存块被换出等。基于此,确定需删除内存范围,遍历所述数组的各已记录基本元素,确定与所述需删除内存范围对应的第二已记录基本元素。例如,需要删除的内存范围是idxK至idxL两个连续的内存块。可以确定数组中哪个已记录基本元素覆盖到该需删除内存范围,且根据不同情况确定不同的删除方式。
(1)在所述需删除内存范围与所述第二已记录基本元素记录的已记录内存范围相同的情况下,确定将所述第二已记录基本元素变更为空闲基本元素,也即是直接删除该第二已记录基本元素即可;删除后头部字段和next字段的更新可见前述实施例。
(2)在所述需删除内存范围与所述已记录内存范围不同的情况下:
①若所述需删除内存范围位于所述已记录内存范围中间,根据所述需删除内存范围将所述已记录内存范围切分为在所述需删除内存范围之前的之前部分、所述需删除内存范围部分和在所述需删除内存范围之后的之后部分,将所述第二已记录基本元素记录的内存范围信息更新为表示所述之前部分,并获取空闲基本元素记录用于表示所述之后部分的内存范围信息后,链接至所述第二已记录基本元素之后。例如,需删除范围是idxK至idxL,而已记录内存范围是idxH至idxN,则切分为idxH至idxK,idxK至idxL,以及idxL至idxN;其中idxK至idxL删除,而第二已记录基本元素更新为记录idxH至idxK,再分配一个新的空闲基本元素用于记录idxL至idxN,并将其链接至第二已记录基本元素。
②若所述需删除内存范围的其中一个边界与所述已记录内存范围的边界相同,将所述第二已记录基本元素记录的内存范围信息更新为:所述需删除内存范围与所述已记录内存范围的不同部分。例如,需删除范围是idxK至idxL,而已记录内存范围是idxK至idxN,则第二已记录基本元素更新为记录idxL至idxN。
接下来再通过如下实施例进行说明。
(一)可动态伸缩容的乱序数组实施例
本实施例可应用于内存管理模块,具体可以是应用于冷热扫描功能中;该冷热扫描功能模块可以创建一个或多个结构体oarray,用于记录各种状态下的内存块集合;例如,
1、本实施例中将数组的元素称为oarr_item,该元素的字段包括:
next字段,该字段用于指向下一个元素在整个数组中的位置;
内存范围信息字段,该字段可以包括idx信息和size信息,即用于记录该段内存范围的起始内存块的编号idx,以及记录该段内存范围所包含的内存块的数量size;通过idx和size可以确定一段内存范围;
预留字段data,该字段可有可无,实际应用中根据需要进行配置。该字段可用于进行后续需要的扩展;也即是后续扩展时,可从data位置开始扩展新的字段,可以记录前述的pid等信息。
2、在oarr_item上一层,是一个预设大小的数组oarr_items,每个数组包含ilen个oarr_item,本实施例称为二级数组;
如果一个oarr_items满了之后,可以再申请新的oarr_items,并挂载到后面提到的一级数组中。
3、在二级数组oarr_items之上是一级数组oarr_array;
一级数组是一个指向各个二级数组oarr_items的指针数组;也即是,一级数组中每个元素用于存放该元素对应的二级数组的地址指针;
一级数组大小为alen(最原始未扩容长度为olen),即一级数组中一级元素的个数;其中已经使用个数为anum;使用部分是指该数组元素已经被赋值一个指向二级数组oarr_items的地址;
如果一级数组满了之后,可以扩容oarr_array(比如扩大为两倍等倍数,本实施例对此不进行限定),并将旧的第一级数组内容顺序拷贝至新数组;这样就避免了大量乱序数组数据的拷贝;
数组中所有oarr_items中的oarr_item,都会按顺序排序,数组中基本元素总个数为len,已使用个数为num;每个oarr_item的next会被初始化为ITEM_FREE的特殊值,即空闲标记;如果是这个值表示该item是空闲的,否则已经被使用。
结构体oarray,可以记录数组的任意信息,例如结构体可以包括上述的一级数组字段、最原始未扩容长度olen、一级元素已使用个数anum、基本元素总个数len、已使用基本元素个数num等。另外,该结构体还有一个head字段,该head字段用于指向整个数组中的首个oarr_item的序号。
4、本实施例提供了如下insert函数,用于在数组插入已记录基本元素:
a)首先,检查整个数组,若数组检查的时候已经满了,则进入扩容流程,否则进入下一步骤b;扩容流程如下:
i.乱序数组满了,可以先尝试分配新的二级数组oarr_items,但是在此之前会先检查一级数组oarr_array是否满了;例如,通过判断结构体oarray中的anum和alen是否相同即可;
ii.如果oarr_array满了则先创建一个新的oarr_array,然后拷贝旧的oarr_array数据至新的oarr_array,再释放旧的oarr_array;
iii.此时oarr_array存在足够的空间用于记录新的oarr_items,则分配一个新的oarr_items;然后记录在oarr_array中;
iv.新创建的扩容的数组的新总长度len为:旧数组的长度len+新分配一级数组中的一级元素个数ilen;
b)从数组中选取一个空闲的元素位置,结构体oarray中会有一个记录空闲位置的字段cur,其初始值为0,分配空闲基本元素用于记录内存块信息时,该字段cur可以指向下一个空闲基本元素的序号,释放的时候会更新为释放位置,即被释放的基本元素的编号,如果都满了可以对字段cur设置为一个特定标记,如果是特定标记,则会依次遍历oarr去寻找一个空闲基本元素。
c)获取到空闲基本元素item2,更新数组的下个空闲位置cur,如果item2的下一个元素是空闲基本元素,则直接指向该元素,否则cur会从头遍历查找;
d)根据数组指定的插入位置pos,决定如何插入新元素item2;
i.如果插入位置为开头,则结构体oarray的起始位置head会指向新元素item2;并且如果head原来存在值(即指向某个已记录基本元素),则item2的next要指向head中的值,即指向head所指向的基本元素;
ii.如果插入位置不是开头,pos对应的基本元素item1,若item1指向下一个基本元素post_next,则将item2的next指向post_next,而pos所在元素item1的next指向item2;
iii.如果不存在下一个元素,则item2的next会指向自己,表明item2是数组中已记录基本元素的尾部。
5、本实施例提供了如下删除函数del,用于将数组的已记录基本元素进行删除:
此处的删除元素,是将一个已写有信息的元素进行清空使其变更为空闲元素,并且将其与其他已写有信息的元素之间的关联关系清除。
a)删除时可以当前要删除元素pos,以及前一个元素位置prev;
b)如果删除的不是oarr的头部,且不是尾部,则prev的next指向pos的next;否则prev的next指向自身;
c)如果删除的是oarr的头部,则oarr的head要指向pos的next;并且如果同时是尾部(即最后一个元素),那oarr的下一空闲位置cur更新为0,否则会更新为pos;
d)如果删除后oarr的数组全部为空,则会触发缩容流程,第一级数组会释放掉除原始长度olen以外的oarr_items第二级数组;当然也可以给按需把第一级数组也缩小到原始大小。
6、本实施例提供了如下遍历函数,用于遍历数组中的已记录基本元素;
其中,触发遍历可以有多种情况;例如,一个冷状态数组或热状态数组,需要周期性扫描各已记录基本元素中的内存块是否仍保持该状态,例如冷状态数组中的内存块是否还是冷状态,热状态数组中的内存块是否还是热状态,此时需要进行全部遍历。另外,在删除一个特定内存范围的时候,也需要从数组中遍历查找。其他查找情况也可能触发遍历。
a)从乱序数组oarr记录的头head指向的地方开始,将head所指向的基本元素作为第一个元素cur;
b)寻找遍历的下一个元素item_next,则先记录判断当前位置cur是否是尾部,如果不是则prev记录为cur,cur更新为cur的下一个元素next,而next则更新为更新后cur所指向的下一个元素(提前记录是因为遍历过程中可能进行元素删除操作);
例如,head所指向的第一个元素itemA,记录为cur;
itemA中next字段指向的是itemB,itemB中next字段指向的是itemC;当前cur所记录的itemA并非是尾部;因此,将cur中的prev记录为itemA,cur更新为itemB,然后cur的next指向itemC。
c)判断遍历是否结束,可以根据cur是否为空闲元素,或cur是尾部并且prev是同一个元素确定。
(二)利用数组记录一段内存范围
1、基本元素oarr_item中包括内存范围信息字段,用于记录内存范围的起始内存块序号和长度(即内存块数量)。
2、确定已记录基本元素pos的位置要插入一段新内存范围range;
对应插入函数range_add函数有两种情况:
a)如果插入位置刚好和pos所记录内存范围range0相邻,则直接向前或向后扩大pos记录的内存范围即可;
b)否则,调用前述的插入函数insert,插入一基本元素,以将rid和rlen赋值到插入的item中;
3、本实施例还提供用于删除内存范围的range_del函数,当在pos位置需要删除一个范围数据range时,range_del函数需要分情况处理;
a)如果删除范围range的起始位置和pos记录的起始地址相同,且结束位置大于等于pos结束地址,则直接调用前述的删除函数del删除已记录基本元素即可;否则,如果小于结束地址,则需要向后缩小pos中记录的范围;
b)如果删除范围起始地址位置不同,而结束位置等于或等于原范围,则需要向前缩小pos中记录的范围;
c)如果删除范围再原范围中间,则需要把原范围切为三份,第一部分pos直接向前缩小范围,第二部分为删除部分,第三部分为删除剩余部分需要插入到pos之后;
4、由于oarr类似于单向链表,因此如果要删除一个范围数据range时,往往需要调用基础oarr的遍历函数,同时结合是否可以删除的判断函数check_del来确定是否是要删除的位置,从而确定上一步中的prev和pos位置,并执行具体操作;
5、当然查找元素也和上一步类似,同样一般也要遍历,然后通过判断函数check_find来判断是否是自己要查找的函数。
(三)利用数组记录冷热数据
1、冷热数据的特点除了利用上述记录范围数据外,还有一个特点就是,比较旧的数据再头部,而比较新的数据在尾部,既越头部越冷,越尾部越热;
2、因此对于冷热数据,新插入数据都会从oarr的尾部位置插入,可以直接调用上述range_add函数;
3、对于要交给交换介质进行换出操作的冷热数据,也比较单一,只需要直接从oarr的头部删除数据,直接调用range_del函数,将删除位置设为oarr的头部;
4、但是对于要退出lru冷热扫描的数据(比如数据被释放已经空闲),则比较麻烦,其删除的一段数据可能位于oarr的任何位置,则需要通过遍历oarr的方法确定位置后,再调用range_del函数来操作。
与前述记录内存状态的方法的实施例相对应,本说明书还提供了记录内存状态的装置及其所应用的计算机设备的实施例。
本说明书记录内存状态的装置的实施例可以应用在计算机设备上,例如服务器或终端设备。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在文件处理的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图3所示,为本说明书实施例记录内存状态的装置所在计算机设备的一种硬件结构图,除了图3所示的处理器310、内存330、网络接口320、以及非易失性存储器340之外,实施例中记录内存状态的装置331所在的计算机设备,通常根据该计算机设备的实际功能,还可以包括其他硬件,对此不再赘述。
如图4所示,图4是本说明书根据一示例性实施例示出的一种记录内存状态的装置的框图,所述装置用于通过数组记录处于所述数组对应状态的内存块信息;
其中,所述数组包括一级数组和至少一个二级数组,所述一级数组包括至少一个一级元素,所述一级元素记录二级数组的内存地址信息,所述二级数组包括至少一个基本元素,所述基本元素用于记录内存块信息;
所述装置包括:
确定模块41,用于:当需要将目标内存块信息记录至所述数组的空闲基本元素中时,若确定所述数组中不存在空闲基本元素,触发扩容模块;
扩容模块42,用于:
创建新的一级数组,将所述数组的当前一级数组中各一级元素记录的内存地址信息复制至所述新的一级数组的一级元素中,并释放所述当前一级数组;其中,所述新的一级数组的一级元素个数,大于所述当前一级数组的一级元素个数;
创建新的二级数组,将所述新的二级数组的内存地址信息记录至所述新的一级数组的空闲一级元素中;
将所述目标内存块信息记录至所述新的二级数组的空闲基本元素中。
在一些例子中,所述装置应用于操作系统的内存管理模块,所述内存管理模块在初始化时创建的数组为:一个一级数组和一个二级数组,所述二级数组的地址信息记录于所述一级数组的其中一个一级元素中。
在一些例子中,所述装置还包括记录模块,用于:
若确定所述数组中存在空闲基本元素,将所述目标内存块信息记录至所述空闲基本元素中。
在一些例子中,所述数组中是否存在空闲基本元素,是通过如下方式确定的:
确定所述数组中的二级数组是否有空闲基本元素;
若有,确定所述数组中存在空闲基本元素;若无,确定所述数组的一级数组中是否有空闲一级元素;
若有空闲一级元素,创建新的二级数组,将内存地址信息记录于所述空闲一级元素后,确定存在空闲的基本元素;
若未有空闲的一级元素,确定所述数组中未有空闲的基本元素。
在一些例子中,所述内存管理模块在初始化时创建用于记录所述数组信息的数组元数据,所述数组元数据中包括:用于指向首个已记录基本元素的头部字段;
所述基本元素的字段包括:next字段,所述next字段的初始值为表示该基本元素是空闲基本元素的空闲标记;在所述基本元素从空闲基本元素变更为已记录基本元素的情况下,所述next字段用于指向所述基本元素的下一已记录基本元素或者指向自身;
在所述将所述目标内存块信息记录至所述新的二级数组的空闲基本元素中后,所述方法还包括:
更新被记录的空闲基本元素的next字段。
在一些例子中,所述更新被记录的空闲基本元素的next字段,包括:
若所述头部字段未指向首个已记录基本元素,将所述头部字段更新为指向所述目标基本元素,将所述目标基本元素的next字段更新为指向自身;
若所述头部字段指向首个已记录基本元素,根据所述头部字段查找最后一个指向自身的已记录基本元素,将所述最后一个指向自身的已记录基本元素的next字段更新为指向所述目标基本元素,并将所述目标基本元素的next字段更新为指向自身。
在一些例子中,所述装置还包括更新模块,用于:
确定第一已记录基本元素需变更为空闲基本元素,执行如下步骤:
若所述头部字段未指向第一已记录基本元素,且所述第一已记录基本元素的next字段未指向自身,将指向所述第一已记录基本元素的上一基本元素的next字段,更新为所述第一已记录基本元素的next字段所指向的基本元素;
若所述头部字段未指向第一已记录基本元素,且所述第一已记录基本元素的next字段指向自身,将指向所述第一已记录基本元素的上一基本元素的next字段更新为指向自身;
若所述头部字段指向所述第一已记录基本元素,且所述第一已记录基本元素的next字段未指向自身,将所述头部字段更新为指向所述第一已记录基本元素的next字段所指向的基本元素;
若所述头部字段指向所述第一已记录基本元素,且所述第一已记录基本元素的next字段指向自身,在当前一级数组是经过扩容的情况下,执行如下缩容流程:创建缩容一级数组以替换所述当前一级数组;其中,所述缩容一级数组中一级元素的个数小于当前一级数组的一级元素个数。
在一些例子中,所述基本元素记录的内存块信息包括:以起始内存块编号和内存块数量表示的内存范围信息;
所述确定模块,还用于:
遍历所述数组中各已记录基本元素记录的内存范围信息;
若所述目标内存块的编号未与已记录的各内存范围信息相邻,确定所述目标内存块的信息需要记录至所述数组的空闲基本元素。
在一些例子中,所述确定模块,还用于:
若所述目标内存块的编号与所述目标内存范围信息相邻,修改记录所述目标内存范围信息的基本元素中记录的内存块数量,以使修改后的所述目标内存范围信息覆盖所述目标内存块。
在一些例子中,所述装置还包括删除模块,用于:
确定需删除内存范围,遍历所述数组的各已记录基本元素,确定与所述需删除内存范围对应的第二已记录基本元素后,执行如下步骤:
在所述需删除内存范围与所述第二已记录基本元素记录的已记录内存范围相同的情况下,确定将所述第二已记录基本元素变更为空闲基本元素;
在所述需删除内存范围与所述已记录内存范围不同的情况下:
若所述需删除内存范围位于所述已记录内存范围中间,根据所述需删除内存范围将所述已记录内存范围切分为在所述需删除内存范围之前的之前部分、所述需删除内存范围部分和在所述需删除内存范围之后的之后部分,将所述第二已记录基本元素记录的内存范围信息更新为表示所述之前部分,并获取空闲基本元素记录用于表示所述之后部分的内存范围信息后,链接至所述第二已记录基本元素之后;
若所述需删除内存范围的其中一个边界与所述已记录内存范围的边界相同,将所述第二已记录基本元素记录的内存范围信息更新为:所述需删除内存范围与所述已记录内存范围的不同部分。
上述记录内存状态的装置中各个模块的功能和作用的实现过程具体详见上述记录内存状态的方法中对应步骤的实现过程,在此不再赘述。
相应的,本说明书实施例还提供了一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现前述记录内存状态的方法实施例的步骤。
相应的,本说明书实施例还提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,所述处理器执行所述程序时实现记录内存状态的方法实施例的步骤。
相应的,本说明书实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现记录内存状态的方法实施例的步骤。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
上述实施例可以应用于一个或者多个计算机设备中,所述计算机设备是一种能够按照事先设定或存储的指令,自动进行数值计算和/或信息处理的设备,所述计算机设备的硬件包括但不限于微处理器、专用集成电路(Application Specific IntegratedCircuit,ASIC)、可编程门阵列(Field-Programmable Gate Array,FPGA)、数字处理器(Digital Signal Processor,DSP)、嵌入式设备等。
所述计算机设备可以是任何一种可与用户进行人机交互的电子产品,例如,个人计算机、平板电脑、智能手机、个人数字助理(Personal Digital Assistant,PDA)、游戏机、交互式网络电视(Internet Protocol Television,IPTV)、智能式穿戴式设备等。
所述计算机设备还可以包括网络设备和/或用户设备。其中,所述网络设备包括,但不限于单个网络服务器、多个网络服务器组成的服务器组或基于云计算(CloudComputing)的由大量主机或网络服务器构成的云。
所述计算机设备所处的网络包括但不限于互联网、广域网、城域网、局域网、虚拟专用网络(Virtual Private Network,VPN)等。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
上面各种方法的步骤划分,只是为了描述清楚,实现时可以合并为一个步骤或者对某些步骤进行拆分,分解为多个步骤,只要包括相同的逻辑关系,都在本专利的保护范围内;对算法中或者流程中添加无关紧要的修改或者引入无关紧要的设计,但不改变其算法和流程的核心设计都在该申请的保护范围内。
其中,“具体示例”、或“一些示例”等的描述意指结合所述实施例或示例描述的具体特征、结构、材料或者特点包含于本说明书的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
本领域技术人员在考虑说明书及实践这里申请的发明后,将容易想到本说明书的其它实施方案。本说明书旨在涵盖本说明书的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本说明书的一般性原理并包括本说明书未申请的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本说明书的真正范围和精神由下面的权利要求指出。
应当理解的是,本说明书并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本说明书的范围仅由所附的权利要求来限制。
以上所述仅为本说明书的较佳实施例而已,并不用以限制本说明书,凡在本说明书的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书保护的范围之内。
Claims (13)
1.一种记录内存状态的方法,所述方法用于通过数组记录处于所述数组对应状态的内存块信息;
其中,所述数组包括一级数组和至少一个二级数组,所述一级数组包括至少一个一级元素,所述一级元素记录二级数组的内存地址信息,所述二级数组包括至少一个基本元素,所述基本元素用于记录内存块信息;所述方法包括:
当需要将目标内存块信息记录至所述数组的空闲基本元素中时,若确定所述数组中不存在空闲基本元素,执行如下扩容步骤:
创建新的一级数组,将所述数组的当前一级数组中各一级元素记录的内存地址信息复制至所述新的一级数组的一级元素中,并释放所述当前一级数组;其中,所述新的一级数组的一级元素个数,大于所述当前一级数组的一级元素个数;
创建新的二级数组,将所述新的二级数组的内存地址信息记录至所述新的一级数组的空闲一级元素中;
将所述目标内存块信息记录至所述新的二级数组的空闲基本元素中。
2.根据权利要求1所述的方法,所述方法应用于操作系统的内存管理模块,所述内存管理模块在初始化时创建的数组为:一个一级数组和一个二级数组,所述二级数组的地址信息记录于所述一级数组的其中一个一级元素中。
3.根据权利要求1所述的方法,所述方法还包括:
若确定所述数组中存在空闲基本元素,将所述目标内存块信息记录至所述空闲基本元素中。
4.根据权利要求1至3任一所述的方法,所述数组中是否存在空闲基本元素,是通过如下方式确定的:
确定所述数组中的二级数组是否有空闲基本元素;
若有,确定所述数组中存在空闲基本元素;若无,确定所述数组的一级数组中是否有空闲一级元素;
若有空闲一级元素,创建新的二级数组,将所述新的二级数组的内存地址信息记录于所述空闲一级元素后,确定存在空闲基本元素;
若未有空闲的一级元素,确定所述数组中未有空闲基本元素。
5.根据权利要求1至3任一所述的方法,所述内存管理模块在初始化时创建用于记录所述数组信息的数组元数据,所述数组元数据中包括:用于指向首个已记录基本元素的头部字段;
所述基本元素的字段包括:next字段,所述next字段的初始值为表示该基本元素是空闲基本元素的空闲标记;在所述基本元素从空闲基本元素变更为已记录基本元素的情况下,所述next字段用于指向所述基本元素的下一已记录基本元素或者指向自身;
在所述将所述目标内存块信息记录至所述新的二级数组的空闲基本元素中后,所述方法还包括:
更新被记录的空闲基本元素的next字段。
6.根据权利要求5所述的方法,所述更新被记录的空闲基本元素的next字段,包括:
若所述头部字段未指向首个已记录基本元素,将所述头部字段更新为指向所述目标基本元素,将所述目标基本元素的next字段更新为指向自身;
若所述头部字段指向首个已记录基本元素,根据所述头部字段查找最后一个指向自身的已记录基本元素,将所述最后一个指向自身的已记录基本元素的next字段更新为指向所述目标基本元素,并将所述目标基本元素的next字段更新为指向自身。
7.根据权利要求5所述的方法,所述方法还包括:
确定第一已记录基本元素需变更为空闲基本元素,执行如下步骤:
若所述头部字段未指向第一已记录基本元素,且所述第一已记录基本元素的next字段未指向自身,将指向所述第一已记录基本元素的上一基本元素的next字段,更新为所述第一已记录基本元素的next字段所指向的基本元素;
若所述头部字段未指向第一已记录基本元素,且所述第一已记录基本元素的next字段指向自身,将指向所述第一已记录基本元素的上一基本元素的next字段更新为指向自身;
若所述头部字段指向所述第一已记录基本元素,且所述第一已记录基本元素的next字段未指向自身,将所述头部字段更新为指向所述第一已记录基本元素的next字段所指向的基本元素;
若所述头部字段指向所述第一已记录基本元素,且所述第一已记录基本元素的next字段指向自身,在当前一级数组是经过扩容的情况下,执行如下缩容流程:创建缩容一级数组以替换所述当前一级数组;其中,所述缩容一级数组中一级元素的个数小于当前一级数组的一级元素个数。
8.根据权利要求1所述的方法,所述基本元素记录的内存块信息包括:以起始内存块编号和内存块数量表示的内存范围信息;
所述确定目标内存块信息需要写入至所述数组中的空闲基本元素,包括:
遍历所述数组中各已记录基本元素记录的内存范围信息;
若所述目标内存块的编号未与已记录的各内存范围信息相邻,确定所述目标内存块的信息需要记录至所述数组的空闲基本元素。
9.根据权利要求8所述的方法,所述方法还包括:
若所述目标内存块的编号与所述目标内存范围信息相邻,修改记录所述目标内存范围信息的基本元素中记录的内存块数量,以使修改后的所述目标内存范围信息覆盖所述目标内存块。
10.根据权利要求8所述的方法,所述方法还包括:
确定需删除内存范围,遍历所述数组的各已记录基本元素,确定与所述需删除内存范围对应的第二已记录基本元素后,执行如下步骤:
在所述需删除内存范围与所述第二已记录基本元素记录的已记录内存范围相同的情况下,确定将所述第二已记录基本元素变更为空闲基本元素;
在所述需删除内存范围与所述已记录内存范围不同的情况下:
若所述需删除内存范围位于所述已记录内存范围中间,根据所述需删除内存范围将所述已记录内存范围切分为在所述需删除内存范围之前的之前部分、所述需删除内存范围部分和在所述需删除内存范围之后的之后部分,将所述第二已记录基本元素记录的内存范围信息更新为表示所述之前部分,并获取空闲基本元素记录用于表示所述之后部分的内存范围信息后,链接至所述第二已记录基本元素之后;
若所述需删除内存范围的其中一个边界与所述已记录内存范围的边界相同,将所述第二已记录基本元素记录的内存范围信息更新为:所述需删除内存范围与所述已记录内存范围的不同部分。
11.一种记录内存状态的装置,所述装置用于通过数组记录处于所述数组对应状态的内存块信息;
其中,所述数组包括一级数组和至少一个二级数组,所述一级数组包括至少一个一级元素,所述一级元素记录二级数组的内存地址信息,所述二级数组包括至少一个基本元素,所述基本元素用于记录内存块信息;
所述装置包括:
确定模块,用于当需要将目标内存块信息记录至所述数组的空闲基本元素中时,若确定所述数组中不存在空闲基本元素,触发扩容模块;
扩容模块,用于:
创建新的一级数组,将所述数组的当前一级数组中各一级元素记录的内存地址信息复制至所述新的一级数组的一级元素中,并释放所述当前一级数组;其中,所述新的一级数组的一级元素个数,大于所述当前一级数组的一级元素个数;
创建新的二级数组,将所述新的二级数组的内存地址信息记录至所述新的一级数组的空闲一级元素中;
将所述目标内存块信息记录至所述新的二级数组的空闲基本元素中。
12.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,所述处理器执行所述计算机程序时实现权利要求1至10任一所述方法的步骤。
13.一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现权利要求1至10任一所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310595047.6A CN116661690A (zh) | 2023-05-23 | 2023-05-23 | 记录内存状态的方法、装置、计算机设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310595047.6A CN116661690A (zh) | 2023-05-23 | 2023-05-23 | 记录内存状态的方法、装置、计算机设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116661690A true CN116661690A (zh) | 2023-08-29 |
Family
ID=87720000
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310595047.6A Pending CN116661690A (zh) | 2023-05-23 | 2023-05-23 | 记录内存状态的方法、装置、计算机设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116661690A (zh) |
-
2023
- 2023-05-23 CN CN202310595047.6A patent/CN116661690A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101367450B1 (ko) | 멀티 스레드 어플리케이션을 위한 해시 테이블의 동시 리해싱의 수행 | |
CN109726139B (zh) | 存储器系统及控制方法 | |
KR100389867B1 (ko) | 플래시 메모리 관리방법 | |
CN102819497B (zh) | 一种内存分配方法、装置及系统 | |
US20070016719A1 (en) | Memory device including nonvolatile memory and memory controller | |
CN110555001B (zh) | 数据处理方法、装置、终端及介质 | |
CN110096221B (zh) | 存储器系统及其控制方法 | |
US20060294330A1 (en) | Managing memory pages | |
CN115328820B (zh) | 多级缓存系统的访问方法、数据存储方法及装置 | |
CN115168248B (zh) | 支持simt架构的高速缓冲存储器及相应处理器 | |
WO2024099448A1 (zh) | 内存释放、内存恢复方法、装置、计算机设备及存储介质 | |
CN116466879B (zh) | 一种cxl内存模组、内存数据的置换方法及计算机系统 | |
CN115617542A (zh) | 内存交换方法、装置、计算机设备及存储介质 | |
CN115599544A (zh) | 内存管理方法、装置、计算机设备及存储介质 | |
CN115168247A (zh) | 用于并行处理器中动态共享存储空间的方法及相应处理器 | |
CN116302491A (zh) | 内存管理方法、装置、计算机设备及存储介质 | |
CN109213423A (zh) | 基于地址屏障无锁处理并发io命令 | |
CN115756838A (zh) | 内存释放、内存恢复方法、装置、计算机设备及存储介质 | |
CN116302598A (zh) | 共享内存的处理方法、装置、计算机设备及存储介质 | |
CN116225693A (zh) | 元数据管理方法、装置、计算机设备及存储介质 | |
CN116661690A (zh) | 记录内存状态的方法、装置、计算机设备及存储介质 | |
KR20200126155A (ko) | 명령 머지 동작을 수행하는 반도체 메모리 장치 및 그 동작 방법 | |
US20090100243A1 (en) | High Performance, Lock-Free Virtual Storage Manager | |
CN115237819A (zh) | 一种数据存储、数据读取方法及装置 | |
JP2004206369A (ja) | 共通資源へのアクセス方式及びアクセスプログラム |
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 |