CN113867947A - 一种异构内存分配方法、装置及电子设备 - Google Patents
一种异构内存分配方法、装置及电子设备 Download PDFInfo
- Publication number
- CN113867947A CN113867947A CN202111119129.0A CN202111119129A CN113867947A CN 113867947 A CN113867947 A CN 113867947A CN 202111119129 A CN202111119129 A CN 202111119129A CN 113867947 A CN113867947 A CN 113867947A
- Authority
- CN
- China
- Prior art keywords
- memory
- allocation
- cost
- nonvolatile
- distribution
- 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
Images
Classifications
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Techniques For Improving Reliability Of Storages (AREA)
Abstract
本公开涉及一种异构内存分配方法、装置及电子设备,所述异构内存包括多块非易失内存,所述方法包括:接收应用程序发起的内存分配请求,读取系统的内存资源信息,所述内存资源信息中包括所述多块非易失内存的内存大小、首地址、当前已写次数、最大可写次数、读延迟、写延迟和经济成本;基于所述内存分配请求、所述内存资源信息和预先设置的计算规则计算所述多块非易失内存中的每块非易失内存的分配代价;按照所述多块非易失内存的分配代价从小到大的顺序向所述应用程序分配内存。上述方案提供了一种更加合理的内存分配优化机制,用以平衡非易失内存的写入寿命损耗和读写延迟,使得每次内存分配的代价最低。
Description
技术领域
本公开涉及内存管理技术领域,具体地,涉及一种异构内存分配方法、装置及电子设备。
背景技术
非易失性存储器是在关闭计算机或者突然性、意外性关闭计算机的时候数据不会丢失的存储器,因此,非易失性存储器一般用来存储数据。在业界,通常按存储容量和存取速度的标准,把计算机存储划为了三级存储结构:CPU缓存、内存和外存,非易失性存储器一般对应外存,具体产品种类包括磁带、闪存、机械硬盘、固态硬盘等。
近年来,随着存储技术的高速发展,在内存层面,非易失性存储技术也开始发力。Intel于2018年正式发布第一款商用的非易失性内存产品,傲腾非易失内存。非易失内存相比外存层面的存储器,拥有着接近内存的读写速度、和内存一样的字节寻址特性、远大于内存的容量以及数据掉电不易失的特点,是存储技术的一个重大突破;同时,非易失内存也有一些缺点,比如读写不平衡、延迟普遍高于普通内存,存在写入寿命磨损等。因此,对于非易失内存需要有与之适配的内存管理机制,以充分利用这种新型硬件的性能;特别地,对于普通内存结合非易失内存的异构内存场景,合理的内存分配和管理十分重要。因此,有必要研究一种新的适配非易失内存或异构内存场景的内存分配机制。
当下大部分程序采用虚拟内存映射方式,一个程序在加载执行之前,会在虚拟内存地址空间创建一个地址映射,该程序即占有了虚拟内存的一部分空间,并且在实际使用内存时通过触发操作系统的缺页中断来获得实际的物理内存页。现代linux操作系统提供了mmap和unmap函数创建和删除虚拟内存映射,但编写成本高,可移植性差。常见做法是把内存映射的底层操作封装起来,抽象成一个动态内存分配器,屏蔽掉底层分配细节,从而提高易用性和移植性。
上述的动态内存分配器分为显式分配器和隐式分配器两种。显式分配器要求程序应用要显式地释放任何已经分配的块,比如C标准库中的malloc程序包就是一个显示分配器;隐式分配器则是由分配器本身来检测是否有不再被使用的内存并回收,检测并回收的过程一般叫做垃圾回收,因此隐式分配器一般也叫做垃圾回收器,Java,Python之类的高级语言就基于垃圾回收器来管理内存。
目前非易失内存还未在工业界大规模使用,当下成熟的显式分配器或隐式分配器都未对这种新型硬件做适配。已有的一些研究或专利,针对非易失内存和普通内存组合的异构内存场景提出了内存分配的优化,但仍存在缺点,具体表现在:在非易失内存商业可用产品面世之前,学术界对该新型硬件的预估期望是:1、读写速度接近普通内存;2、保留字节寻址的特点;3、读写不平衡,读延迟低写延迟高;4、掉电保护,实现数据不易失;5、写入寿命损耗,即写入操作会磨损硬件,最终导致不可用。
围绕以上五点特点,现有的技术方案或研究提出了一些非易失内存上的程序优化策略,基本是围绕第5点(写入寿命损耗)和第3点(读延迟低,写延迟高)来展开的。有技术方案提出尽可能将读操作放在非易失内存上进行,将需要大量频繁写入的操作移到普通内存。
针对目前唯一的一款商用非易失内存产品:傲腾非易失内存,有实验表明,傲腾非易失内存的读写不平衡表现为读延迟高,写延迟低。针对这个特点,曾经的设计就会表现出较大的缺点,具体可表现在:由于将读操作转移到非易失内存上,而实际情况下非易失内存上读延迟较高,因此这样操作虽能在一定程度上减少对硬件的损耗,但却会增加程序的延迟。由于内存分配是很底层的操作,在大型系统中,底层内存延迟产生的影响会不断地被放大到整个系统层面。因此,需要重新考量异构内存下的内存分配优化机制。
发明内容
本公开的目的是提供一种异构内存分配方法、装置及电子设备,用于缓解现有技术中存在的,由于非易失内存读写不平衡,现有异构内存下的内存分配优化机制不合理,导致系统延迟的技术问题。
为了实现上述目的,本公开第一方面提供一种异构内存分配方法,所述异构内存包括多块非易失内存,所述方法包括:
接收应用程序发起的内存分配请求,所述内存分配请求中包括待分配内存的字节长度和进程编号;
读取系统的内存资源信息,所述内存资源信息中包括所述多块非易失内存的内存大小、首地址、当前已写次数、最大可写次数、读延迟、写延迟和经济成本;
基于所述内存分配请求、所述内存资源信息和预先设置的计算规则计算所述多块非易失内存中的每块非易失内存的分配代价;
按照所述多块非易失内存的分配代价从小到大的顺序向所述应用程序分配内存。
可选的,在基于所述内存分配请求、所述内存资源信息和预先设置的计算规则计算所述多块非易失内存中的每块非易失内存的分配代价之前,所述方法还包括:
在所述应用程序发起所述内存分配请求时,获取所述应用程序指定的在当前申请的内存上所要执行的操作的类型属性;其中,所述类型属性为读操作或写操作;
若所述应用程序未指定所述操作的类型属性,则默认所述操作的类型属性为所述写操作。
可选的,所述预先设置的计算规则包括:
其中,Rcontency为读延迟,Scontency为标准内存延迟,Length为待分配内存的字节长度,MemSize为所述非易失内存的内存大小,Price为经济成本,Wcontency为写延迟,Ctimes为剩余可写次数,Wtimes为当前进程在申请的内存上的写操作次数,Wtimes根据所述当前进程的历史分配信息预估得到。
可选的,按照所述多块非易失内存的分配代价从小到大的顺序向所述应用程序分配内存,包括:
从所述多块非易失内存中选择分配代价最小的内存,得到所述分配代价最小的内存的首地址;
根据所述分配代价最小的内存的首地址,查找所述分配代价最小的内存对应的分配队列,并判断所述分配队列映射管理的内存堆的剩余空间是否满足分配;
若满足,则向所述应用程序分配内存;若不满足,则向所述系统申请所述分配代价最小的内存中的一块新的内存堆进行分配;
若所述系统没有新的内存,则从剩余非易失内存中选择分配代价最小的内存继续分配,直到内存分配成功或所有非易失内存均分配失败。
可选的,所述方法还包括:
接收所述应用程序发起的内存释放请求;其中,所述内存释放请求中包括待释放内存空间的首地址、指向内存分配队列中的某块内存的指针、待释放内存在申请时的进程号;所述内存分配队列包含多条分配队列,所述多条分配队列分别映射多块非易失内存;
根据所述指向所述内存分配队列中的某块内存的指针,确定所述内存释放请求对应的非易失内存;
根据所述待释放内存空间的首地址,查找所述内存释放请求对应的非易失内存的具体地址进行释放。
可选的,所述方法还包括:
生成内存申请记录,所述内存申请记录中包括此次分配的内存空间的首地址、分配长度、进程号和当前时间戳;若此次内存分配失败,则所述内存空间的首地址标记为内存不足,所述分配长度标记为0。
可选的,所述方法还包括:
若此次内存分配成功,则更新此次分配的内存的当前已写次数的值。
可选的,所述方法还包括:
生成内存释放记录,所述内存释放记录中包括释放结果、指向所述内存分配队列中的某块内存的指针、待释放内存在申请时的进程号。
可选的,所述方法还包括:
若内存释放失败,则抛出错误异常信息;
若内存释放成功,根据所述待释放内存在申请时的进程号和所述指向所述内存分配队列中的某块内存的指针,查找与所述释放记录对应的内存申请记录,根据时间戳差值计算并记录所述内存申请记录的用时。
可选的,所述内存资源信息存储在系统的固定位置且只存储一份。
本公开第二方面提供一种异构内存分配装置,所述异构内存包括多块非易失内存,所述装置包括:
元数据模块,用于存储系统的内存资源信息,所述内存资源信息中包括所述多块非易失内存的内存大小、首地址、当前已写次数、最大可写次数、读延迟、写延迟和经济成本;
代价计算模块,用于接收应用程序发起的内存分配请求,所述内存分配请求中包括待分配内存的字节长度和进程编号;并从所述元数据模块中读取所述系统的内存资源信息,基于所述内存分配请求、所述内存资源信息和预先设置的计算规则计算所述多块非易失内存中的每块非易失内存的分配代价;
分配管理模块,用于接收所述代价计算模块的计算结果,并按照所述多块非易失内存的分配代价从小到大的顺序向所述应用程序分配内存。
本公开第三方面提供一种非临时性计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现第一方面所述方法的步骤。
本公开第四方面提供一种电子设备,包括:
存储器,其上存储有计算机程序;
处理器,用于执行所述存储器中的所述计算机程序,以实现第一方面所述方法的步骤。
通过上述技术方案,在应用程序发起内存分配请求时,按照系统中多块非易失内存的分配代价从小到大的顺序向所述应用程序分配内存,在计算非易失内存的分配代价时,考虑了应用程序请求分配内存的字节长度、非易失内存的内存大小、当前已写次数、最大可写次数、读延迟、写延迟和经济成本,使得每次内存分配的代价最低,提供一种更加合理的内存分配优化机制,用以缓解现有技术中现有技术中存在的,由于非易失内存读写不平衡,现有异构内存下的内存分配优化机制不合理,导致系统延迟的技术问题,通过本方案中的内存分配优化机制,可以尽量平衡非易失内存的写入寿命损耗和读写延迟。
本公开的其他特征和优点将在随后的具体实施方式部分予以详细说明。
附图说明
附图是用来提供对本公开的进一步理解,并且构成说明书的一部分,与下面的具体实施方式一起用于解释本公开,但并不构成对本公开的限制。在附图中:
图1是根据一示例性实施例示出的内存分配器的结构示意图;
图2是根据一示例性实施例示出的异构内存分配方法的流程示意图;
图3为为根据一示例性实施例示出使用图1中的内存分配器实现一次内存分配过程的流程示意图;
图4是根据一示例性实施例示出的一种电子设备的框图。
具体实施方式
以下结合附图对本公开的具体实施方式进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本公开,并不用于限制本公开。
本说明书中,首先对本公开实施例中的异构内存和非易失内存进行说明。
由于非易失内存本身还处在产业化的初期,目前有许多种不同的技术手段实现该种硬件,在未来的大规模商业产品出现时,可以合理地推测不同生产商使用不同技术生产的非易失性内存,在读写延迟上势必呈现多样化,其原因在于,首先,当前实现生产投入商业使用的只有Intel一家,基于Intel自身的3Dxpoint颗粒技术,其余的技术还包括相变存储器、忆阻器、自旋扭距转换随机存储器技术等,但这些技术还没有商业产品面世。其次,就Intel自身的商用产品傲腾非易失内存,它的实际读写延迟和学界所估计的也有偏差。现有的很多研究和技术方案,大多将非易失内存当作一个统一的整体和普通内存做异构,而没有考虑到不同非易失内存技术或产品本身就形成了异构环境。
换言之,现有技术没有考虑到在异构内存场景下,非易失内存本身也是异构的。由于不同的非易失内存在读写延迟、价格和写入寿命损耗上都不尽相同,简单地把它看作一个整体来考虑是不合适的,多种硬件特性不一致的情况,将其当做一个统一的整体无法保证一个较优的分配效率,从而变相地增加使用成本。
而本方案的发明人在设计本方案时,综合考虑了以上两点原因,在内存分配时,考虑到了不同类型的非易失内存本身就是异构的。本公开实施例中,一种类型的非易失内存可以包含多块;每种内存指的是某一技术手段或品牌实现的某个型号的非易失内存,它有自己的硬件性能。每块是指具体的一块某一型号的非易失内存块。举例来讲,假设现在的主板上有四个内存插槽,可以插四块同一品牌同一型号的内存,也可以插四块同一品牌不同型号的内存,或者是插上四块不同品牌不同型号的内存。本公开对异构内存的具体实现方式不做限制。
本发明设计的内存分配器,综合考虑了异构内存场景下不同类型非易失内存的读写延迟差异和程序读写类型的特点,采用了一种以代价成本为基准的分配策略,使每次分配的代价成本趋于最低,这也是该技术方案的核心思想。
本公开实施例中的方案面向异构内存场景,提出了一种基于代价计算的内存分配方式,其主体为一个动态内存分配器。该内存分配器的结构如图1所示。
该内存分配器由以下五个部分组成。
1、元数据模块Mi
2、代价计算模块Mc
3、分配管理模块Mq
4、统计数据模块Ms
5、本地配置文件
该内存分配器的使用分为以下两个阶段。
构建阶段
构建阶段发生在该内存分配器第一次被调用时,需要获取系统的内存资源信息,内存资源信息包括每块内存大小、每块内存的读写延迟、每块内存的当前已写次数和最大可写次数、每块内存的经济成本。以上数据维护在一个全局唯一的配置文件中,保证每个进程的内存分配器都能获取到系统内非易失内存准确的配置信息。需要说明的是,以下说明书中,除非有特别说明,内存一般是指非易失内存。
根据配置文件,为程序进程初始化一个内存分配器。如图1所示,该内存分配器包括代价计算模块Mc、内存分配队列Mq、元数据模块Mi和统计数据模块Ms。内存池初始化时,对于系统内每种不同的内存,内存分配队列Mq都会在分配器中维护一个分配队列,一个分配队列映射系统中的一块内存。一种类型的内存可能包括多块内存,这样就会在内存分配队列Mq中包含多条分配队列,分别映射这多块内存。通过该指针数组记录对应的内存分配情况,内存分配队列Mq中对于系统中每块内存都维护了一个分配队列,分配队列中的指针数组(或指针链表)表明当前内存分配器对于系统中每块内存的已分配情况,后续有分配,则是对应添加新的指向内存的指针到分配队列里。
同时,元数据模块Mi会读入配置文件中的数据,会随着内存分配器的使用实时或定时更新配置文件中的数据,如表1所示,为元数据模块Mi中的数据的一种可能的形式。实时更新可以获得最准确的数据。但由于内存分配是个比较频繁的操作,在多进程下,为了保证能准确更新数据,会产生锁竞争,因此,也可以采用定时的方式,来避免锁竞争。本公开实施例中,可以根据实际情况选择实时更新或定时更新,举例来讲,如果某个服务器是某个服务的专用服务器,只运行特定的程序,就可以采用实时更新。本领域技术人员可以根据实际需要进行选择,本公开对此不做限制。
表1
使用阶段
请参考图2,图2是根据一示例性实施例示出的异构内存分配方法的流程示意图,该方法包括以下步骤。
步骤201,接收应用程序发起的内存分配请求,所述内存分配请求中包括待分配内存的字节长度和进程编号。
步骤202,读取系统的内存资源信息,所述内存资源信息中包括所述多块非易失内存的内存大小、首地址、当前已写次数、最大可写次数、读延迟、写延迟和经济成本。
步骤203,基于所述内存分配请求、所述内存资源信息和预先设置的计算规则计算所述多块非易失内存中的每块非易失内存的分配代价。
步骤204,按照所述多块非易失内存的分配代价从小到大的顺序向所述应用程序分配内存。
当内存分配器收到应用程序发起内存分配请求后,将该请求传递给代价计算模块Mc,Mc会根据元数据模块Mi的内存资源信息和内存分配请求信息,计算出内存分配队列中Mq中每个分配队列对应内存的分配代价Pcost,然后,选择最小Pcost值对应的内存进行分配。由于上述方案中,在系统维护内存资源信息,包括系统中每块非易失内存的读延迟、写延迟,已写次数,经济成本等信息,以上信息将作为内存分配时代价计算的重要参考,通过结合程序执行的特点,尽量平衡非易失内存的写入寿命损耗和读写延迟,实现每次分配结果在当前来看是经济最优的,为异构内存场景下的非易失内存分配提供新的参考思路。
接下来,请参考图3,图3为为根据一示例性实施例示出使用图1中的内存分配器实现一次内存分配过程的流程示意图。以下结合图1和图3对本公开实施例中的异构内存分配方法进行说明,该方法包括如下步骤。
步骤301,获取配置信息。
内存分配器读取配置文件,为当前进程初始化一个内存分配器实例。本公开实施例中,配置文件维护在系统的固定位置且只有一份。当系统无配置文件时,需要手动创建;配置文件中信息至少包含以下信息:每块内存的大小、读延迟、写延迟,已写次数、经济成本、内存唯一标识符以及首地址,在实际应用中,配置文件中还可以写入其他相关信息,本公开对此不做限制。
步骤302,创建内存分配器。
内存分配器程序读取配置文件中的信息,将信息存储在元数据模块Mi中,根据首地址和内存唯一标识符,在内存分配管理模块Mq中为每块内存创建跟踪分配的指针数组。以上步骤301和步骤302发生在内存分配器的创建阶段。
步骤303,在初始化结束后,等待应用程序的内存分配请求。
应用程序发起内存申请,内存分配请求以如下的五元组结构标识:[Length,Type,Pid,Tid,Pname]。
其中,Length:申请待分配内存的字节长度。
Type:申请待分配内存上想要进行的操作类型(非必选)。操作分为读操作Write和写操作Write。参数默认为写操作。
Pid:进程编号。
Tid:线程编号(非必选)。
Pname:唯一标识一个程序的字符串(非必选)。
本公开实施例中,Type属性非必选是为了对现有的程序做兼容。一个内存分配器,本质上是一个可调用的操作内存的函数。本公开实施例中的内存分配器,程序在使用时需要在调用内存申请函数(如malloc)时告诉该内存分配器,当前申请的内存主要是用来做读取操作还是写入操作的(即Type属性)。那么对于现有的程序,可以不包括Type属性,为了该技术方案能无侵入地兼容现有程序,该操作的Type属性是可选的。所以,Type属性由程序指定,若不指定,则默认是写操作,因为读操作对非易失内存的寿命不会有影响,而写操作会磨损寿命,因此在程序未提供操作类型时,采取悲观策略按写操作当作默认值,从而实现分配最优的作用。
步骤304,获取请求类型。
如步骤303中所述,在所述应用程序发起所述内存分配请求时,获取所述应用程序指定的在当前申请的内存上所要执行的操作的类型属性;其中,所述类型属性为读操作或写操作。若所述应用程序未指定所述操作的类型属性,则默认所述操作的类型属性为所述写操作。
步骤305,计算分配代价。
在步骤305中,代价计算模块Mc在接收到应用程序发起的内存分配请求后,从元数据模块Mi中读取信息,开始计算此次分配内存的代价Pcost。
首先,代价计算模块Mc从元数据模块Mi中获取每块非易失内存的读延迟、写延迟、经济成本等信息。
然后,代价计算模块Mc从统计数据模块Ms获取当前进程的历史分配信息,预估出Wtimes,计算在每块非易失内存上分配的Pcost。Wtimes预估就是从统计数据模块Ms中读取当前进程过去的分配记录中的写入次数记录,取中位数。本公开实施例中,分配代价的计算规则如下。
其中,Rcontency:内存的读延迟,由元数据模块Mi中获取。
Wcontency:内存写延迟,从元数据模块中Mi中获取。
Scontency:标准内存延迟,从元数据模块Mi中获取,由于普通内存是读写均衡(即读延迟和写延迟相等),因此普通内存的读写延迟是衡量的基准。
Memsize:每一块内存的总大小。
Wtimes:在申请的内存上的写操作次数,从统计信息模块Ms中预估。
Ctimes:内存的当前可写入次数(即剩余可写次数),由元数据模块Mi中获取,剩余可写次数可以由当前已写次数、最大可写次数计算得到。对于普通内存,Ctimes默认为无限写入次数,由于普通内存是读写平衡并不会有写入磨损的,因此不存在使用分配代价去衡量的必要。
Price:分配的内存硬件对应的经济成本,从元数据模块Mi中获取。
对于读操作的Pcost,其分配代价的值基于不同内存的读延迟Rcontency和经济价格Price决定。
对于写操作的Pcost,其分配代价的值分为两部分,一部分和读操作一样,基于写延迟Wcontency;另一部分,由于非易失内存存在写入寿命,因此还要加上写入操作带来的经济损耗成本,即CPU发生缓存缺页中断而产生的写操作的次数Wtimes、剩余可写次数Ctime和经济价格Price决定。
本公开实施例中,计算结果可以以{[内存1,Pcost1][内存2,Pcost2]…}的列表形式暂存,其中各项按Pcost的值升序排列。
步骤306,基于分配代价进行内存分配。
在步骤306中,步骤305中的Pcost计算结果传递给分配管理模块Mq,分配管理模块Mq按照Pcost从小到大的顺序尝试分配内存。
首先,Mq从{[内存1,Pcost1][内存2,Pcost2]…}列表中,得到内存1的地址,根据该地址找到自己管理的内存1指针数组,尝试分配内存。如果分配成功,当前步骤结束。如果分配失败,则向操作系统继续申请更大的空间,随后尝试重新分配,分配成功,当前步骤结束;如果分配失败,分配管理模块Mq从{[内存1,Pcost1][内存2,Pcost2]…}列表中,读取下一个分配代价最小的内存地址(即内存2)进行分配,直到分配成功或者列表中所有的内存都分配失败。
本公开实施例中,对于非易失内存来说,每一个进程的内存分配器不会占有系统某块非易失内存的全部,只是先申请一部分。这部分内存就称为堆。在内存堆被耗尽之前,所有进程内的内存都是优先从堆中分配,当堆的剩余不够时,则向操作系统再申请一块更大的内存来管理。
指针数组的作用是判断当前映射管理的那一部分内存是否还有可以分配的空间,如果空间不够的话,则由内存分配器继续向操作系统申请更大的内存空间,然后再进行分配。对于整块内存1,内存分配器是不知道有多少剩余空间可以用的,这里内存1地址指的是分配管理模块Mq中映射内存1的分配队列的首地址。通过该分配队列检查当前管理的映射了内存1的剩余空间是否满足分配,若满足就分配出来,并添加新的指针记录这块分配出去的空间,若不满足,则向操作系统继续申请内存1的更大的空间。若操作系统也无法返回新的内存,内存分配器就找下一个Pcost值最小的内存进行分配。
步骤307,分配结束后,将此次的分配信息传递给统计数据模块Ms。
在步骤306中,如果内存分配成功,将此次分配的内存空间的首地址、分配长度、进程/线程号、当前时间戳传递给统计模块Ms,保存此次内存分配的内存申请记录。
在步骤306中,如果内存分配失败,仍然传递上述的四个数据。其中,内存空间的首地址标记为内存不足,分配长度标记为0,进程/线程号和时间戳正常显示。
步骤308,内存释放。
在步骤308中,应用程序发起内存释放的请求,要求释放步骤303-步骤306中申请到的内存。
应用程序使用完一个已分配的内存空间后,发起内存释放请求,请求以如下结构标记,[Addr,Mem,Pid,Tid,Pname]。
其中,Addr:待释放内存的首地址。
Mem:指向Mq中某块内存的指针。
Pid:待释放内存在申请时的进程号。
Tid:待释放内存在申请时的线程号。
Pname:唯一标识一个程序的字符串。(非必选)
首先,内存分配模块Mq收到应用程序发起的内存释放请求后,根据Mem确认当前需要释放的内存是系统上的哪一块内存,根据Addr查找到内存分配队列中对应这块内存上的具体地址进行释放。若查找不到,抛出错误异常。
然后,内存释放的操作结果,和Mem,Pid,Tid,Pname数据,以及当前时间戳,传递给统计数据模块Ms。
步骤309,元数据模块Mi在运行过程中会定期将更新数据写回磁盘上的配置文件。
元数据模块Mi执行定时任务,将当前该内存分配器实例中的最新数据同步到磁盘上的配置文件。元数据模块Mi在将数据同步到磁盘文件后,又读取配置文件中的最新记录。
步骤310、分配管理模块Mq接受释放请求,释放内存后,将释放的信息传递给统计数据模块Ms。
步骤308中的数据,若为成功释放,则根据Pid/Tid+Mem,在统计数据模块Ms中查找到该条释放记录对应的内存申请记录,根据时间戳差值计算出当前这条分配记录的用时,并获取本次分配的内存实际发生的写入次数,存储在统计数据模块Ms中。其中,内存分配的用时可以用来做一些性能分析时使用,这些信息存储在统计数据模块Ms中,可用来对内存分配器做性能分析。
步骤308中的数据,若为内存释放失败,则统计数据模块Ms不做任何操作。
步骤311、元数据模块Mi更新信息。
本公开实施例中,若统计数据模块Ms接收到的是分配成功的信息,则通知元数据模块Mi更新当前写入次数的值。其中,写入次数是CPU发生缓存写入和内存缺页的次数总和。目前有很多方式可以做到获取应用程序运行时的内存缺页或CPU缓存写入的方法,比如cachegrind工具。这个值可以使用这些现有工具来获得,也可以在程序运行一段时间后,根据之前的记录的平均数来预估。
若统计数据模块Ms接收到的是分配失败的信息,则不通知元数据模块Mi。
基于同一发明构思,本公开实施例还提供一种异构内存分配装置,如图1所示,所述异构内存包括多块非易失内存,所述装置包括:
元数据模块,用于存储系统的内存资源信息,所述内存资源信息中包括所述多块非易失内存的内存大小、首地址、当前已写次数、最大可写次数、读延迟、写延迟和经济成本;
代价计算模块,用于接收应用程序发起的内存分配请求,所述内存分配请求中包括待分配内存的字节长度和进程编号;并从所述元数据模块中读取所述系统的内存资源信息,基于所述内存分配请求、所述内存资源信息和预先设置的计算规则计算所述多块非易失内存中的每块非易失内存的分配代价;
分配管理模块,用于接收所述代价计算模块的计算结果,并按照所述多块非易失内存的分配代价从小到大的顺序向所述应用程序分配内存。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
图4是根据一示例性实施例示出的一种电子设备400的框图。如图4所示,该电子设备400可以包括:处理器401,存储器402。该电子设备400还可以包括多媒体组件403,输入/输出(I/O)接口404,以及通信组件405中的一者或多者。
其中,处理器401用于控制该电子设备400的整体操作,以完成上述的异构内存分配方法中的全部或部分步骤。存储器402用于存储各种类型的数据以支持在该电子设备400的操作,这些数据例如可以包括用于在该电子设备400上操作的任何应用程序或方法的指令,以及应用程序相关的数据,例如联系人数据、收发的消息、图片、音频、视频等等。该存储器402可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,例如静态随机存取存储器(Static Random Access Memory,简称SRAM),电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,简称EEPROM),可擦除可编程只读存储器(Erasable Programmable Read-Only Memory,简称EPROM),可编程只读存储器(Programmable Read-Only Memory,简称PROM),只读存储器(Read-Only Memory,简称ROM),磁存储器,快闪存储器,磁盘或光盘。多媒体组件403可以包括屏幕和音频组件。其中屏幕例如可以是触摸屏,音频组件用于输出和/或输入音频信号。例如,音频组件可以包括一个麦克风,麦克风用于接收外部音频信号。所接收的音频信号可以被进一步存储在存储器402或通过通信组件405发送。音频组件还包括至少一个扬声器,用于输出音频信号。I/O接口404为处理器401和其他接口模块之间提供接口,上述其他接口模块可以是键盘,鼠标,按钮等。这些按钮可以是虚拟按钮或者实体按钮。通信组件405用于该电子设备400与其他设备之间进行有线或无线通信。无线通信,例如Wi-Fi,蓝牙,近场通信(Near FieldCommunication,简称NFC),2G、3G、4G、NB-IOT、eMTC、或其他5G等等,或它们中的一种或几种的组合,在此不做限定。因此相应的该通信组件405可以包括:Wi-Fi模块,蓝牙模块,NFC模块等等。
在一示例性实施例中,电子设备400可以被一个或多个应用专用集成电路(Application Specific Integrated Circuit,简称ASIC)、数字信号处理器(DigitalSignal Processor,简称DSP)、数字信号处理设备(Digital Signal Processing Device,简称DSPD)、可编程逻辑器件(Programmable Logic Device,简称PLD)、现场可编程门阵列(Field Programmable Gate Array,简称FPGA)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述的异构内存分配方法。
在另一示例性实施例中,还提供了一种包括程序指令的计算机可读存储介质,该程序指令被处理器执行时实现上述的异构内存分配方法的步骤。例如,该计算机可读存储介质可以为上述包括程序指令的存储器402,上述程序指令可由电子设备400的处理器401执行以完成上述的异构内存分配方法。
在另一示例性实施例中,还提供一种计算机程序产品,该计算机程序产品包含能够由可编程的装置执行的计算机程序,该计算机程序具有当由该可编程的装置执行时用于执行上述的异构内存分配方法的代码部分。
需要说明的是,本发明实施例中的异构内存分配方法可以在一台计算机中使用,也可以在一个集群中使用,一个集群可以有多台计算机,每台计算机上是一种单独的非易失内存。相比于一台计算机内同时配置多种不同非易失内存异构的场景,一个集群内包括多台不同计算机,每台计算机配置一种非易失内存,集群整体构成异构非易失内存异构场景也适用于本发明实施例中的异构内存分配方法。也就是说,在集群这种场景下,仍然符合上述内存分配方式,此时相当于,集群中选择一台计算机作为主节点,拥有一个唯一的内存管理装置(和上述的异构内存分配装置一样),集群中每台机器也拥有上述的内存分配装置。程序任务提交给集群后,由内存管理装置决定分配给某台机器A执行,那台机器A上再由自己的内存分配器来分配。
以上结合附图详细描述了本公开的优选实施方式,但是,本公开并不限于上述实施方式中的具体细节,在本公开的技术构思范围内,可以对本公开的技术方案进行多种简单变型,这些简单变型均属于本公开的保护范围。
另外需要说明的是,在上述具体实施方式中所描述的各个具体技术特征,在不矛盾的情况下,可以通过任何合适的方式进行组合,为了避免不必要的重复,本公开对各种可能的组合方式不再另行说明。
此外,本公开的各种不同的实施方式之间也可以进行任意组合,只要其不违背本公开的思想,其同样应当视为本公开所公开的内容。
Claims (13)
1.一种异构内存分配方法,其特征在于,所述异构内存包括多块非易失内存,所述方法包括:
接收应用程序发起的内存分配请求,所述内存分配请求中包括待分配内存的字节长度和进程编号;
读取系统的内存资源信息,所述内存资源信息中包括所述多块非易失内存的内存大小、首地址、当前已写次数、最大可写次数、读延迟、写延迟和经济成本;
基于所述内存分配请求、所述内存资源信息和预先设置的计算规则计算所述多块非易失内存中的每块非易失内存的分配代价;
按照所述多块非易失内存的分配代价从小到大的顺序向所述应用程序分配内存。
2.如权利要求1所述的方法,其特征在于,在基于所述内存分配请求、所述内存资源信息和预先设置的计算规则计算所述多块非易失内存中的每块非易失内存的分配代价之前,所述方法还包括:
在所述应用程序发起所述内存分配请求时,获取所述应用程序指定的在当前申请的内存上所要执行的操作的类型属性;其中,所述类型属性为读操作或写操作;
若所述应用程序未指定所述操作的类型属性,则默认所述操作的类型属性为所述写操作。
4.如权利要求1所述的方法,其特征在于,按照所述多块非易失内存的分配代价从小到大的顺序向所述应用程序分配内存,包括:
从所述多块非易失内存中选择分配代价最小的内存,得到所述分配代价最小的内存的首地址;
根据所述分配代价最小的内存的首地址,查找所述分配代价最小的内存对应的分配队列,并判断所述分配队列映射管理的内存堆的剩余空间是否满足分配;
若满足,则向所述应用程序分配内存;若不满足,则向所述系统申请所述分配代价最小的内存中的一块新的内存堆进行分配;
若所述系统没有新的内存,则从剩余非易失内存中选择分配代价最小的内存继续分配,直到内存分配成功或所有非易失内存均分配失败。
5.如权利要求4所述的方法,其特征在于,所述方法还包括:
接收所述应用程序发起的内存释放请求;其中,所述内存释放请求中包括待释放内存空间的首地址、指向内存分配队列中的某块内存的指针、待释放内存在申请时的进程号;所述内存分配队列包含多条分配队列,所述多条分配队列分别映射多块非易失内存;
根据所述指向所述内存分配队列中的某块内存的指针,确定所述内存释放请求对应的非易失内存;
根据所述待释放内存空间的首地址,查找所述内存释放请求对应的非易失内存的具体地址进行释放。
6.如权利要求4所述的方法,其特征在于,所述方法还包括:
生成内存申请记录,所述内存申请记录中包括此次分配的内存空间的首地址、分配长度、进程号和当前时间戳;若此次内存分配失败,则所述内存空间的首地址标记为内存不足,所述分配长度标记为0。
7.如权利要求4所述的方法,其特征在于,所述方法还包括:
若此次内存分配成功,则更新此次分配的内存的当前已写次数的值。
8.如权利要求5所述的方法,其特征在于,所述方法还包括:
生成内存释放记录,所述内存释放记录中包括释放结果、指向所述内存分配队列中的某块内存的指针、待释放内存在申请时的进程号。
9.如权利要求6所述的方法,其特征在于,所述方法还包括:
若内存释放失败,则抛出错误异常信息;
若内存释放成功,根据所述待释放内存在申请时的进程号和所述指向所述内存分配队列中的某块内存的指针,查找与所述释放记录对应的内存申请记录,根据时间戳差值计算并记录所述内存申请记录的用时。
10.如权利要求1所述的方法,其特征在于,所述内存资源信息存储在系统的固定位置且只存储一份。
11.一种异构内存分配装置,其特征在于,所述异构内存包括多块非易失内存,所述装置包括:
元数据模块,用于存储系统的内存资源信息,所述内存资源信息中包括所述多块非易失内存的内存大小、首地址、当前已写次数、最大可写次数、读延迟、写延迟和经济成本;
代价计算模块,用于接收应用程序发起的内存分配请求,所述内存分配请求中包括待分配内存的字节长度和进程编号;并从所述元数据模块中读取所述系统的内存资源信息,基于所述内存分配请求、所述内存资源信息和预先设置的计算规则计算所述多块非易失内存中的每块非易失内存的分配代价;
分配管理模块,用于接收所述代价计算模块的计算结果,并按照所述多块非易失内存的分配代价从小到大的顺序向所述应用程序分配内存。
12.一种非临时性计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1-10中任一项所述方法的步骤。
13.一种电子设备,其特征在于,包括:
存储器,其上存储有计算机程序;
处理器,用于执行所述存储器中的所述计算机程序,以实现权利要求1-10中任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111119129.0A CN113867947A (zh) | 2021-09-24 | 2021-09-24 | 一种异构内存分配方法、装置及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111119129.0A CN113867947A (zh) | 2021-09-24 | 2021-09-24 | 一种异构内存分配方法、装置及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113867947A true CN113867947A (zh) | 2021-12-31 |
Family
ID=78993560
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111119129.0A Pending CN113867947A (zh) | 2021-09-24 | 2021-09-24 | 一种异构内存分配方法、装置及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113867947A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023051000A1 (zh) * | 2021-09-30 | 2023-04-06 | 华为技术有限公司 | 内存管理方法、装置、处理器及计算设备 |
-
2021
- 2021-09-24 CN CN202111119129.0A patent/CN113867947A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023051000A1 (zh) * | 2021-09-30 | 2023-04-06 | 华为技术有限公司 | 内存管理方法、装置、处理器及计算设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8099548B2 (en) | Power efficient media playback on general purpose portable devices | |
US11861204B2 (en) | Storage system, memory management method, and management node | |
JP2018516409A (ja) | ファイルストレージにおけるインデックス付け実施方法及びシステム | |
WO2019061352A1 (zh) | 数据加载方法及装置 | |
US11640244B2 (en) | Intelligent block deallocation verification | |
US20190199794A1 (en) | Efficient replication of changes to a byte-addressable persistent memory over a network | |
CN111158602A (zh) | 数据分层存储方法、读取方法、存储主机及存储系统 | |
WO2024099448A1 (zh) | 内存释放、内存恢复方法、装置、计算机设备及存储介质 | |
CN102567225A (zh) | 一种管理系统内存的方法及装置 | |
CN115617542A (zh) | 内存交换方法、装置、计算机设备及存储介质 | |
CN106844491B (zh) | 一种临时数据的写入、读取方法及写入、读取装置 | |
CN113434470B (zh) | 数据分布方法、装置及电子设备 | |
CN113867947A (zh) | 一种异构内存分配方法、装置及电子设备 | |
US10073851B2 (en) | Fast new file creation cache | |
CN111475099A (zh) | 一种数据存储方法、装置及其设备 | |
CN111562883B (zh) | 固态硬盘的缓存管理系统、方法、装置 | |
CN107102898B (zh) | 一种基于numa架构的内存管理、构建数据结构的方法及装置 | |
CN114327769B (zh) | 一种操作系统事件记录方法、装置及计算机系统 | |
CN109508140B (zh) | 存储资源管理方法、装置、电子设备及电子设备、系统 | |
CN112948336B (zh) | 数据加速方法及缓存单元、电子设备及存储介质 | |
KR20220154612A (ko) | 파일 속성에 따른 캐시 관리 방법 및 파일 속성에 따라 동작하는 캐시 관리 장치 | |
CN114217982A (zh) | 一种进程间内存共享方法和装置 | |
CN102298553B (zh) | 根据用户响应时间来管理存储器的设备和方法 | |
KR20090131142A (ko) | 메모리 관리 장치 및 방법 | |
US11249646B1 (en) | Large segment management |
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 |