CN112084032B - 一种写优化的持久性内存堆管理方法 - Google Patents
一种写优化的持久性内存堆管理方法 Download PDFInfo
- Publication number
- CN112084032B CN112084032B CN202010967533.2A CN202010967533A CN112084032B CN 112084032 B CN112084032 B CN 112084032B CN 202010967533 A CN202010967533 A CN 202010967533A CN 112084032 B CN112084032 B CN 112084032B
- Authority
- CN
- China
- Prior art keywords
- space
- persistent
- memory
- root
- heap
- 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.)
- Active
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
-
- 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)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种写优化的持久性内存管理方法,包括S1、在持久性内存中进行根信息注册;S2、构建堆管理内存的数据结构,并将其存储于DRAM中;S3、在系统故障恢复阶段时,基于注册的根信息回收持久性内存空间中的剩余空闲空间,并重建DRAM中存储的堆管理内存的数据结构,实现持久性内存的堆管理。本方法可以把所有管理内存分配的元数据结构都保存到DRAM中,任何持久性内存空间的分配或释放操作,都不会造成对持久性内存的额外写操作;故障恢复过程在搜索已分配空间的同时,还能通过搜索到同一对象的次数,准确还原对象的引用计数,因此可以把对象的引用计数保存在DRAM中,无需担心因为故障导致的引用计数错误或丢失。
Description
技术领域
本发明属于持久性堆管理技术领域,具体涉及一种写优化的持久性内存堆管理方法。
背景技术
随着互联网应用的蓬勃发展,海量数据存储和访问给云计算和大数据处理平台带来了巨大的挑战,在目前的计算机系统中,通常实用DRAM作为内存,使用固态硬盘或者机械硬盘作为外存,外存容量大,但是访问延迟高,并且不只是按字节寻址,只能以“块”为单位访问,所以无法直接在外存中处理数据,只能将数据读入内存之后再进行处理。内存访问速度快,但是容量小,并且在断电时会丢失数据,所以计算机系统经常需要在内存和外存之间交换数据,这成为了性能瓶颈点之一。今年来,诸如RRAM、PCM、STTRAM和3D XPoint等持久性内存技术虽然稍逊于DRAM,但已经处于同一数量级,与此同时,持久性内存的容量与存储密度远远高于DRAM。Inte推出的持久性内存产品Optane DC Persistent Memory,单条内存容量可达TB级别,已经可以和固态硬盘等外存相媲美。持久性内存还支持按字节寻址,通过访问指令直接操作,因此可以直接在原地处理持久性内存中的数据,无需再将数据读入DRAM。有理由相应,持久性内存的上述特性,能解决内外存之间数据交换导致的性能瓶颈,推动存储系统的性能产生巨大的飞跃。
在目前的计算机系统中,有多种使用持久性内存的方式,从硬件层面看,可以将其直接连入到处理器内存系统中,完全或部分替换DRAM,也可以将它封装为普通外部存储设备,使用PCI-E总线与CPU相连,但这种使用方式不利于发挥持久性内存支持按字节寻址和低延迟的性能特点;从软件层面看,目前应用程序有两种方式使用持久性内存,一是将持久性内存映射到应用程序地址空间中,通过访存指令直接操作,二是通过使用文件操作接口进入内核态,由文件系统或块设备驱动程序等访问持久性内存。这两种使用方法各有优劣,前者的优点是能充分挖掘持久性内存硬件本身带来的性能提升,缺点则是需要对已有的应用程序进行重新设计和大量的修改;后者的优点是保持了接口不变,因此应用程序在使用持久性内存时,无需进行特殊的设计和修改,缺点则是会产生陷入内核、存储I/O栈逻辑处理等所带来的额外开销,不利于充分发挥持久性内存访问延迟低带宽大的性能优势。
持久性堆管理满足的是第一种使用方式对内存管理的需求。持久性堆管理负责管理整个持久性内存空间,响应上层应用程序分配、释放持久性内存的请求,跟踪持久性内存的使用状况。持久性堆管理还需要提供故障恢复功能,以避免因为系统故障导致的内存泄漏、空悬指针以及堆管理元数据损坏等问题。除此之外,持久性堆管理还可以为上层应用提供自动垃圾回收支持,减轻应用开发者手动管理内存的负担。
和针对普通DRAM内存的堆管理相比,持久性堆管理面临着一系列的新挑战。第一个挑战是需要提供故障恢复功能。故障恢复功能用于保证内存分配和释放操作的事务性,以及堆管理元数据的一致性。缺乏故障恢复功能将导致内存泄漏、空悬指针、重复释放等一系列严重的问题。第二个挑战是需要尽量减少堆管理工作为持久性内存带来的额外写操作。持久性内存允许的最大擦写次数大概为107-109次,而DRAM的最大擦写次数则为1016次,近乎于无限。因此如果完全像使用DRAM一样使用持久性内存,会大大降低持久性内存的使用寿命。即使有底层的磨损均衡机制支持,也只有3年左右的寿命。第三个挑战是,在尽量减少对持久性内存的写操作的前提下,难以实现基于引用计数的自动垃圾回收。
目前已有的持久性堆管理方案根据故障恢复机制不同,总体上可以分为两类。第一类方案在每次执行分配或释放操作时,都需要同步修改记录在持久性内存中的分配状态信息,确保分配状态信息不因故障而丢失或损坏。第二类方案则是依靠垃圾回收算法,在故障恢复阶段扫描并识别出持久性内存空间的使用情况,据此重建分配状态信息。第一类方案的一个代表是nvm_malloc。它把记录分配状态的数据结构,诸如小对象分配位图、内存块头部、内存块链表等数据结构都保存于持久性内存中,其在DRAM中保存的元数据结构常常是一些辅助性的数据结构。此类方案的另一个代表,NV-Heaps,除了基本的持久性堆管理功能之外,还提供了对基于引用计数的垃圾回收的支持,把引用计数保存在持久性内存中,在引用关系变动时都同步更新引用计数,并用记录日志的方式保证引用计数更新操作的事务性,随之而来的问题则是,为了维护引用计数的正确性,不得不频繁地对持久性内存进行写操作。
第二类方案的代表是Makalu,它虽然有效地减少了分配和释放操作给持久性内存带来的写入,但在分配和释放操作涉及对关键性元数据的修改时,还是无法完全避免对持久性内存的写入。并且Makalu使用的无侵入式垃圾回收算法存在回收不准确的问题,可能造成内存泄漏,因此也无法用于准确地重建引用计数。
如前所述,目前已有的持久性堆管理技术方案,主要有三方面的问题:第一是,持久性内存的分配和释放会带来大量对持久性内存的写操作。第二是,基于无侵入式垃圾回收算法的故障恢复,无法准确识别出已分配空间,有造成内存泄漏的可能。第三是,实现引用计数的开销大,需要在持久性内存中保存并跟踪引用计数的修改,导致对持久性内存的频繁写入。因此,目前尚没有一种针对持久性内存的堆管理方案,在内存分配和释放操作不对持久性内存产生任何写操作的情况下,还能保证分配和释放操作的事务性,并提供对基于引用计数的自动垃圾回收的支持。
发明内容
针对现有技术中的上述不足,本发明提供的写优化的持久性内存堆管理方法解决了上述背景技术中的问题。
为了达到上述发明目的,本发明采用的技术方案为:一种写优化的持久性内存堆管理方法,包括以下步骤:
S1、在持久性内存中创建一个持久性数据结构根节点,并进行根信息注册;
S2、构建堆管理内存的数据结构,并将其存储于DRAM中;
S3、在系统故障恢复阶段时,基于注册的根信息回收持久性内存空间中的剩余空闲空间,并重建DRAM中存储的堆管理内存的数据结构,进而实现持久性内存的堆管理。
进一步地,所述步骤S1具体为:
S11、对持久性内存空间进行根空间和堆空间的划分,并对根空间进行初始化;
S12、向系统的堆管理注册包括根节点名字、根节点地址及根节点数据类型在内的根信息;
S13、判断根节点数据类型是否已存在于配置文件中;
若是,则进入步骤S14;
若否,则进入步骤S16;
S14、判断根节点名字是否已存在于持久性内存空间中;
若是,则进入步骤S16;
若否,则进入步骤S15;
S15、将根信息记录到当前划分出根空间中,进入步骤S17;
S16、向用户反馈注册失败信息,并提供根信息修改意见,结束管理流程;
S17、在当前划分的根空间中,按照根节点地址-根节点名字-根节点数据类型的顺序,在根空间的低地址到高地址依次存放根信息,完成根信息注册。
进一步地,所述步骤S11中使用内存分配接口对持久性内存空间进行根空间和堆空间的划分的方法具体为:
将持久性内存空间的第一个大小为64KB的块作为第一个根空间,之后的持久性内存空间作为堆空间,当前一个根空间随用户注册空间耗尽时,从与其相邻的后一个堆空间中分配一个新的大小为64KB的块作为新的根空间,并将新的根空间和前一个根空间以链表的形式串联起来,完成根空间和堆空间的划分;
所述根空间用于保存包括根节点名字、根节点地址及根节点数据类型在内的根信息;
所述堆空间作为满足用户内存分配请求持久性内存空间。
进一步地,所述配置文件为保存于堆管理系统中用于存储用户提供的持久性对象类型信息的文件;
所述配置文件中的内容包括name字段、size字段和ptrs字段;
所述name字段用于表示持久性对象的类型名字;
所述size字段用于表示持久性对象的大小;
所述ptrs字段用于表示持久性对象内的持久性指针相对持久性对象起始地址的偏移量及指针类型。
进一步地,所述步骤S13中的堆管理内存的堆结构包括中心堆和线程堆;
所述中心堆为所有线程共享,并用于维护空闲segment链表;
所述线程堆为以segment为单位从中心堆中分配的持久性内存,用于维护红黑树;
所述堆管理内存的数据结构包括空闲segment链表、红黑树、内存池和基数树;
所述空闲segment链表用于管理segment的分配;
所述红黑树用于管理大对象和内存池的空间分配;
所述内存池用于管理小对象的分配;
所述基数树用于根据持久性对象地址查询对应持久性对象的元数据;
所述大对象为大小大于等于64KB且按16KB对齐的空闲空间,小对象为大小小于32KB的持久性对象,当用户申请分配的持久性对象在32~64KB之间时,堆管理直接为其分配64KB大小的对象即大对象。
进一步地,
所述空闲segment链表的每个节点分别对应一个位于DRAM中的数组项,每个数组项都线性地对应到持久性内存的一个segment;当有segment处于空闲状态时,其对应的数组项中记录下一个空闲segment对应的数组项的地址;当有segment处于已分配给线程堆状态时,其对应的数组项中记录其所属的线程堆;
所述红黑树的每个节点表示一段大小大于等于64KB且按16KB对齐的大块空闲空间即大对象;所述红黑树以按空间大小和空间地址排序,且先比较空间大小再比较空间地址为原则构建;
当需要分配大对象或内存池时,分配方法为:以logN为时间复杂度在红黑树中找到满足分配要求的最小空闲空间,当找到的最小空闲空间大于当前分配要求所需的空间时,将多余空闲空间用一个新的节点表示,并重新插入到红黑树中;
当需要释放大对象或内存池时,释放方法为:当需要释放的大对象或内存池存在空闲的相邻空间时,将其与相邻空间合并,并在红黑树中移除代表相邻空间的节点,重新插入合并后的空间节点;当需要释放的大对象或内存池不存在空闲的相邻空间时,直接向红黑树中插入需释放的大对象或内存池所占的空间节点;
所述内存池的大小为128KB,且DRAM中设置有与之对应的RUN管理结构,所述RUN管理结构保存了每个小对象的分配状态位图及内存池在持久性内存上的地址信息;所述大小相同的RUN管理结构以链表的形式连接起来并通过SLAB结构进行管理,当一种类型的内存池耗尽时,通过SLAB结构在红黑树中查找空闲空间,分配新的内存池,当存在内存池完全空闲时,通过SLAB结构向红黑树归还该内存池占据的空间;
所述基数树以持久性对象地址为key进行构建,所述基数树的查询方法为:在常数时间复杂度内根据持久性对象地址查询其对应的元数据,对于小对象,其元数据为它所在的RUN管理结构的地址,对于大对象,其元数据为其大小信息。
进一步地,所述步骤S3中,每个故障恢复线程进行深度优先搜索的方法具体为:
S31、初始化DRAM中的堆管理内存的数据结构,将持久性内存中的整个堆空间全部视为空闲,设定故障恢复线程数量为n,并初始化编号为0~n-1的n个空闲的线程堆;
S32、从持久性内存空间的第一个块开始,扫描持久性内存的整个根空间,对于扫描找到的根空间中的根信息,在DRAM中为其建立以根节点名字为key的哈希索引,并将配置文件读入到DRAM中,以持久性对象的类型名字为key,建立哈希索引;
S33、将所有扫描找到的根空间视为已分配对象,将已分配对象按照round-robin顺序,并将其所属的segment分配给对应编号的线程堆;
S34、统计各root所在的segment,按照将属于同一个segment的root分配给同一个故障恢复线程的原则,为n个故障恢复线程分配任务;
S35、启动n个故障恢复线程,并使每个故障恢复线程从root出发进行深度优先搜索,根据注册的根信息和建立的哈希索引识别出所有已分配对象并在DRAM中修改对应的元数据,完成DRAM中存储的堆管理数据结构的重建;
S36、通过应用程序的线程认领并使用完成堆管理数据结构重建的线程堆,进行持久性内存的分配和释放,进而完成持久性内存的堆管理。
进一步地,所述步骤S33中,对于每个分配给线程堆的segment,以segment的起始地址为key,以该segment所属线程堆的编号为value构建哈希表并存储在DRAM中。
进一步地,所述步骤S35具体为:
A1、将根信息中的根节点地址和根节点数据类型信息入栈;
A2、判断栈中是否还存在未处理的元素;
若是,则进入步骤A3;
若否,则进入步骤A8;
A3、弹出栈顶元素,得到持久性对象的地址和类型信息,进而得到持久性对象中持久性指针的值及类型信息,进入步骤A4;
A4、将持久性指针的值及类型信息入栈,并递增其对应的持久性对象的引用计数,判断该引用计数是否为1;
若是,则进入步骤A5;
若否,则返回步骤A2;
A5、判断当前持久性对象所在的segment是否属于当前故障恢复线程的线程堆;
若是,则进入步骤A6;
若否,则进入步骤A7;
A6、更新当前线程堆中的元数据,并将其对应的持久性对象标记为已分配,并返回步骤A2;
A7、基于建立的哈希索引查询该持久性对象所属的线程堆,并将指向该持久性对象的持久性指针放入相应的消息队列,并返回步骤A2;
A8、为当前故障恢复线程设置搜索结束标记,进入步骤A9;
A9、判断当前消息队列中是否还存在未处理的元素;
若是,则进入步骤A10;
若否,则进入步骤A12;
A10、从当前消息队列中任取一个元素,得到持久性对象的地址和数据类型,进而得到持久性对象的大小,进入步骤A11;
A11、更新当前持久性对象对应的线程堆的元数据,并将该持久性对象标记为已分配,返回步骤A9;
A12、判断是否所有故障恢复线程均已设置搜索结束标记;
若是,则进入步骤A13;
若否,则返回步骤A9;
A13、完成所有故障恢复线程搜索,即识别出所有已分配对象并完成元数据的修改,完成DRAM中存储的堆管理内存的数据结构的重建;
其中,栈及消息队列中的每个元素包含了一个持久性对象的地址及其对应的类型信息。
本发明的有益效果为:
(1)分配和释放操作不给持久性内存带来任何写入,大幅减少了对持久性内存的写操作,具体体现在:本发明将管理内存分配的元数据全部存放于DRAM中,而不是持久性内存中,在持久性内存中存储的元数据只有根信息。因此,在分配和释放内存时,只需要修改位于DRAM中的元数据信息,不产生任何对持久性内存的写操作。唯一需要写持久性内存的场景是注册根信息,但这些操作都是极少进行的,因为每个持久性数据结构只需要注册一条根信息。结合前文给出的持久性内存的写延迟、寿命和能耗等数据,可以说明本发明不仅有助于减少对持久性内存的磨损,提升持久性内存的寿命,还能有效提升堆管理操作的性能,降低系统能耗。
(2)故障恢复只需要持久性数据结构根信息和对象类型信息,不依赖任何其他元数据,即可准确地找回所有已分配空间,具体体现在:本发明在故障恢复时,只用到了类型信息配置文件和持久性内存中记录的根信息,除此之外,不需要任何其它的元数据。而现有技术中,除了根信息,还需要依赖保存在持久性内存上的块头部等核心元数据,并且现有技术采用的无侵入式“标记——清除”垃圾回收算法,存在回收不准确、速度慢等问题。本发明通过使用对象类型信息,可以无需搜索整个对象,直接准确地定位出对象内部的指针信息。因此,本发明可以完全准确地识别出已分配空间,不会造成内存泄漏,恢复速度也更快。
(3)免去了引用计数的管理复杂性和维护引用计数给持久性内存带来的写操作,具体体现在:现有的技术方案中虽然支持了基于引用计数的自动垃圾回收,但是为了避免故障导致的引用计数丢失或是计数错误,需要在持久性内存上保存引用计数,并使用日志、clflush和fence指令,保证对内存分配、释放和引用计数修改的事务性。由于本发明使用的故障恢复方法,不仅可以准确识别出已分配的持久性内存空间,还可以通过恢复过程中搜索到同一对象的次数,准确地恢复对象的引用计数。因此,本发明可以将引用计数保存在DRAM中,修改引用计数时无需对持久性内存进行写入,也不需要提供事务性保证。
(4)持久性内存的空间利用率高:本发明无需在持久性内存上保存除了根信息之外的任何元数据,所以剩下的空间都可以用来满足上层应用的内存分配请求,存放上层应用的数据,元数据占比小,空间利用率高。
(5)保持了符合传统习惯的内存分配、释放接口:本发明在分配内存时无需分为reserve和activate两步,释放内存时也只需要传递被释放对象的地址,无需传递指向被释放对象的指针的地址。
附图说明
图1为本发明提供的写优化的持久性内存堆管理方法流程图。
图2为本发明提供的根信息注册方法流程图。
图3为本发明提供的持久性内存空间布局示意图。
图4为本发明提供的配置文件内容示意图。
图5为本发明提供的根信息写入根空间示意图。
图6为本发明提供的堆管理数据结构示意图。
图7为本发明提供的利用根信息和类型信息搜索持久性对象过程示意图。
图8为本发明提供的故障恢复线程搜索流程图。
具体实施方式
下面对本发明的具体实施方式进行描述,以便于本技术领域的技术人员理解本发明,但应该清楚,本发明不限于具体实施方式的范围,对本技术领域的普通技术人员来讲,只要各种变化在所附的权利要求限定和确定的本发明的精神和范围内,这些变化是显而易见的,一切利用本发明构思的发明创造均在保护之列。
如前所述,目前已有的持久性堆管理技术方案,主要有三方面的问题。第一是,持久性内存的分配和释放会带来大量对持久性内存的写操作。第二是,基于无侵入式垃圾回收算法的故障恢复,无法准确识别出已分配空间,有造成内存泄漏的可能。第三是,实现引用计数的开销大,需要在持久性内存中保存并跟踪引用计数的修改,导致对持久性内存的频繁写入。具体而言,本发明主要解决以下几方面问题:
(1)持久性内存的分配和释放操作,需要在持久性内存上记录日志,或是更新位于持久性内存中的元数据,给持久性内存带来大量写操作,加剧磨损,影响程序执行效率,增加系统能耗。
(2)基于无侵入式“标记——清除”垃圾回收算法进行故障恢复的技术方案,无法准确识别出指针,存在将未使用空间错误识别为已使用空间,造成内存泄漏的可能。并且此方法需要扫描全部已使用的堆空间,故障恢复的效率不佳。
(3)实现基于引用计数的垃圾回收的代价高昂,需要将引用计数保存在持久性内存中,每次引用关系的变动,都需要修改位于持久性内存中的引用计数,进而造成对持久性内存的频繁写入。还需要通过记录日志来保证分配、释放内存和修改引用计数的事务性。这些因素同样对持久性内存的寿命、程序执行效率和系统能耗带来了负面影响。
为了解决上述问题,本发明提供了如图1所示的种写优化的持久性内存堆管理方法,包括以下步骤:
S1、在持久性内存中创建一个持久性数据结构根节点,并进行根信息注册;
S2、构建堆管理内存的数据结构,并将其存储于DRAM中;
S3、在系统故障恢复阶段时,基于注册的根信息回收持久性内存空间中的剩余空闲空间,并重建DRAM中存储的堆管理内存的数据结构,进而实现持久性内存的堆管理。
如图2所示,本实施例的步骤S1具体为:
S11、对持久性内存空间进行根空间和堆空间的划分,并对根空间进行初始化;
S12、向系统的堆管理注册包括根节点名字、根节点地址及根节点数据类型在内的根信息;
S13、判断根节点数据类型是否已存在于配置文件中;
若是,则进入步骤S14;
若否,则进入步骤S16;
S14、判断根节点名字是否已存在于持久性内存空间中;
若是,则进入步骤S16;
若否,则进入步骤S15;
S15、将根信息记录到当前划分出根空间中,进入步骤S17;
S16、向用户反馈注册失败信息,并提供根信息修改意见,结束管理流程;
其中,若根节点数据类型不存在,则需要用户确认提供的类型信息配置文件和类型名是否正确;若根节点名字已存在,则用户需要更换一个根节点名字;
S17、在当前划分的根空间中,按照根节点地址-根节点名字-根节点数据类型的顺序,在根空间的低地址到高地址依次存放根信息,完成根信息注册。
本实施例中将持久性内存分为两部分,一部分是根空间,另一部分是堆空间,“根”指的是持久性数据结构的根,通常为用户自定义的,位于持久性内存的复杂数据结构入口,例如链表头,或是二叉树的根节点。“根空间”中保存了用户注册的根信息,包含了持久性数据结构的根节点名字、地址和节点的数据类型名字。根信息是本发明唯一需要保存在持久性内存上的元数据。因此,除了根信息的注册操作,本发明不会对持久性内存造成任何额外写入。“堆空间”则是被用来满足用户的内存分配请求的持久性内存空间。如图3所示,是整个持久性内存空间布局和根信息内容的示意,基于此,上述步骤S11中使用内存分配接口对持久性内存空间进行根空间和堆空间的划分的方法具体为:
将持久性内存空间的第一个大小为64KB的块作为第一个根空间,之后的持久性内存空间作为堆空间,当前一个根空间随用户注册空间耗尽时,从与其相邻的后一个堆空间中分配一个新的大小为64KB的块作为新的根空间,并将新的根空间和前一个根空间以链表的形式串联起来,完成根空间和堆空间的划分;
根空间用于保存包括根节点名字、根节点地址及根节点数据类型在内的根信息;堆空间作为满足用户内存分配请求持久性内存空间。
本实施例中上述步骤S13中的配置文件为保存于堆管理系统中用于存储用户提供的持久性对象类型信息的文件;,图4是该配置文件内容的示意;
配置文件中的内容包括name字段、size字段和ptrs字段;name字段用于表示持久性对象的类型名字;size字段用于表示持久性对象的大小;ptrs字段用于表示持久性对象内的持久性指针相对持久性对象起始地址的偏移量及指针类型。
对于上述配置文件,在堆管理初始化时,同样将该配置文件中的类型信息读入DRAM中,并以类型名称为key,建立索引结构。
在本实施例中,如果上述步骤S11-S16执行完成后发生系统发生故障,故障恢复时,因为没有任何指针性内存操作,或已注册过的根信息指向这块内存,所以它会被认为是未分配的,不会引起内存泄漏;如果上述步骤S17的根信息完成记录后,系统发生故障,故障恢复时,可以从根信息找到根节点的地址和类型名称,再通过类型名称找到类型信息,从而知道根节点的大小,由此识别出这一块空间已被使用,保证不会用它满足其他的分配请求,用户也可以通过根的名字查询到根节点的地址,进而重新访问根节点。
从上述过程中可以看出,即使在持久性内存空间分配及根信息填写两个过程之间发生故障,也不会破坏堆管理元数据的一致性,不会造成内存泄漏或者空悬指针。除此之外,还需要保证根信息注册过程的事务性,即确保在根信息注册过程中,系统发生故障不会破坏相关元数据信息的一致性。本发明可以在不记录任何日志,不额外增加任何对持久性内存的写操作的情况下,保证注册过程的事务性。图5是本发明步骤S17中写入一条根信息记录的过程示意。本发明按照“根节点地址-根名字-根节点类型名字”,从低地址到高地址的顺序,存放一条根信息。新记录占据的头8字节空间的值,在格式化操作或上一条记录的添加过程中被赋值为0。在添加一条根信息记录的过程中,本发明先写根名字和类型名字,再通过一个8字节的原子写操作写入根节点地址。因为0x0000000000000000和0xffffffffffffffff两个值显然不可能是合法地址,所以本发明用它们分别标记根信息结束的位置和此条根信息已被删除。如果在写入过程中系统发生故障,那根节点地址还未被写入,对应的8字节位置的值还是0,因此在故障恢复时,这条记录将被视为不存在,已经写入持久性内存的不完整内容将被忽略。
在完成上述步骤的根信息注册后,应用程序就可以像使用普通DRAM堆管理工具一样,分配持久性内存,创建新的持久性数据结构节点,并将它们连接到现有的持久性数据结构。应用程序开发者无需使用任何的额外操作来保证分配或释放操作的事务性,只要确保将新节点连入由根可达的数据结构即可。
在本实施例步骤S2中,如图6所示,上述步骤S13中的堆管理内存的堆结构包括中心堆和线程堆;
中心堆为所有线程共享,并用于维护空闲segment链表;
线程堆为以segment为单位从中心堆中分配的持久性内存,用于维护红黑树,一个segment的大小为8GB;
图6中的堆管理内存的数据结构包括空闲segment链表、红黑树、内存池和基数树;
空闲segment链表用于管理segment的分配;
红黑树用于管理大对象和内存池的空间分配;
内存池用于管理小对象的分配;
基数树用于根据持久性对象地址查询持久性对象的元数据;
大对象为大小大于等于64KB且按16KB对齐的持久性对象;
小对象为大小小于32KB的持久性对象;
其中,当用户申请分配的持久性对象在32~64KB之间时,堆管理直接为其分配64KB大小的对象即大对象。
具体地,空闲segment链表的每个节点分别对应一个位于DRAM中的数组项,每个数组项都线性地对应到持久性内存的一个segment,第一项对应第一个segment,第二项对应第二个segment,以此类推;当有segment处于空闲状态时,其对应的数组项中记录下一个空闲segment对应的数组项的地址;当有segment处于已分配给线程堆状态时,其对应的数组项中记录其所属的线程堆;
所述红黑树的每个节点表示一段大小大于等于64KB且按16KB对齐的大块空闲空间即大对象;所述红黑树以按空间大小和空间地址排序,且先比较空间大小再比较空间地址为原则构建;
当需要分配大对象或内存池时,分配方法为:以logN为时间复杂度在红黑树中找到满足分配要求的最小空闲空间,当找到的最小空闲空间大于当前分配要求所需的空间时,将多余空闲空间用一个新的节点表示,并重新插入到红黑树中;
当需要释放大对象或内存池时,释放方法为:当需要释放的大对象或内存池存在空闲的相邻空间时,将其与相邻空间合并,并在红黑树中移除代表相邻空间的节点,重新插入合并后的空间节点;当需要释放的大对象或内存池不存在空闲的相邻空间时,直接向红黑树中插入需释放的大对象或内存池所占的空间节点;
内存池的大小为128KB,负责小对象的分配管理,内存池在DRAM中设置有与之对应的RUN管理结构,RUN管理结构保存了每个小对象的分配状态位图及内存池在持久性内存上的地址信息;大小相同的RUN管理结构以链表的形式连接起来并通过SLAB结构进行管理,当一种类型的内存池耗尽时,通过SLAB结构在红黑树中查找空闲空间,分配新的内存池,当存在内存池完全空闲时,通过SLAB结构向红黑树归还该内存池占据的空间;其中,每个小对象的分配状态位图的大小只有4个cache line,因此对于被频繁使用的内存池,访问位图发生缓存未命中的概率很小,保证了小对象分配和释放的效率;
基数树以持久性对象地址为key进行构建,基数树的查询方法为:在常数时间复杂度内根据持久性对象地址查询其对应的元数据;对于小对象,其元数据为它所在的RUN管理结构的地址,对于大对象,其元数据为其大小信息;通过基数树还能快速查询到某个地址是否空闲,这对合并相邻空闲空间至关重要。
由于管理内存分配的数据结构全部保存于DRAM中,如果系统发生故障,这些数据结构都将丢失;在故障恢复阶段,本发明将通过前文提到的根信息,和用户提供的对象类型信息,从根节点出发进行深度优先搜索,找到所有被引用的对象,回收剩余的空闲空间,并重建所有DRAM中的内存分配数据结构。要使用本发明进行故障恢复,需要对用户构造的持久性对象和数据结构稍作限制。持久性对象中不能包含指向DRAM的指针(包括虚表指针),也不能包含void*类型的指针。持久性对象互相引用形成的拓扑结构中也不允许有环存在。这些限制在绝大多数使用场景下,例如构建持久性链表、哈希表、二叉树、B+树等,不会对上层应用造成任何影响。基于此,上述步骤S3具体为:
S31、初始化DRAM中的堆管理内存的数据结构,将持久性内存中的整个堆空间全部视为空闲,设定故障恢复线程数量为n,并初始化编号为0~n-1的n个空闲的线程堆;
S32、从持久性内存空间的第一个块开始,扫描持久性内存的整个根空间,对于扫描找到的根空间中的根信息,在DRAM中为其建立以根节点名字为key的哈希索引,并将配置文件读入到DRAM中,以持久性对象的类型名字为key,建立哈希索引;
S33、将所有扫描找到的根空间视为已分配对象,将已分配对象按照round-robin顺序,并将其所属的segment分配给对应编号的线程堆;
S34、统计各root所在的segment,按照将属于同一个segment的root分配给同一个故障恢复线程的原则,为n个故障恢复线程分配任务;
S35、启动n个故障恢复线程,并使每个故障恢复线程从root出发进行深度优先搜索,根据注册的根信息和建立的哈希索引识别出所有已分配对象并在DRAM中修改对应的元数据,完成DRAM中存储的堆管理数据结构的重建;
S36、应用程序的线程认领并使用完成堆管理数据结构重建的线程堆,进行持久性内存的分配和释放,进而完成持久性内存的堆管理。
在上述步骤S33中,对于上一步骤找到属于根空间的块,由于这些块不属于堆空间,不能用于满足用户的内存分配请求,因此可以直接将它们视为已分配的对象。对于每一个这样的块,找到它所属的segment,记为S,如果此时S还是完全空闲的,则将S按照round-robin的顺序分配给0号到n-1号线程堆的其中一个;在该步骤中,对于每个分配给线程堆的segment,以segment的起始地址为key,以该segment所属线程堆的编号为value构建哈希表并存储在DRAM中。
在上述步骤S34中,具体地,对于有n个故障恢复线程,这n个线程各自负责一部分root的搜索。一般来讲,如果上层应用有x个线程会执行分配操作,那么n就应该等于x。首先统计一遍每个root所在的segment,然后将属于同一个segment S的root分配给同一个线程进行搜索,并且将S分配给该线程的线程堆,这是因为在大多数情况下,同一个root引出的所有节点都由同一个线程分配,那么这些节点和root就同属一个线程堆,又因为同一个segment不会被不同的线程堆共享,所以处于同一个segment的root,在故障之前必然由同一个线程堆分配。因此这些root引出的所有节点也大概率同属于此线程堆,基于上述理由,这样的任务分配方式,能够最大程度上减少恢复过程中的线程间通信,并尽可能地还原发生故障之前各线程堆的状态;
在上述步骤S35中,每一个故障恢复线程从root出发执行深度优先搜索。通过根信息中保存的类型名字,去DRAM中的类型信息哈希表查询,可以得到根节点的类型信息,包括对象的大小,对象中是否包含指向其它持久性对象的指针,以及指针的位置和类型,如果找到的对象中包含指向其它持久性对象的指针,则沿着指针继续搜索。图7是此过程的示意;基于此,如图8所示,上述步骤S35中每个故障恢复线程执行搜索的方法具体为:
A1、将根信息中的根节点地址和根节点数据类型信息入栈;
A2、判断栈中是否还存在未处理的元素;
若是,则进入步骤A3;
若否,则进入步骤A8;
A3、弹出栈顶元素,得到持久性对象的地址和类型信息,进而得到持久性对象中持久性指针的值及类型信息,进入步骤A4;
A4、将持久性指针的值及类型信息入栈,并递增其对应的持久性对象的引用计数,判断该引用计数是否为1;
若是,则进入步骤A5;
若否,则返回步骤A2;
其中,引用计数用来记录某个对象被其它对象引用的次数,当引用计数变为0时,即说明该对象不可能再被应用程序使用,可以回收它占据的内存空间;
A5、判断当前持久性对象所在的segment是否属于当前故障恢复线程的线程堆;
若是,则进入步骤A6;
若否,则进入步骤A7;
A6、更新当前线程堆中的元数据,并将其对应的持久性对象标记为已分配,并返回步骤A2;
A7、基于建立的哈希索引查询该持久性对象所属的线程堆,并将指向该持久性对象的持久性指针放入相应的消息队列,并返回步骤A2;
A8、为当前故障恢复线程设置搜索结束标记,进入步骤A9;
A9、判断当前消息队列中是否还存在未处理的元素;
若是,则进入步骤A10;
若否,则进入步骤A12;
A10、从当前消息队列中任取一个元素,得到持久性对象的地址和数据类型,进而得到持久性对象的大小,进入步骤A11;
A11、更新当前持久性对象对应的线程堆的元数据,并将该持久性对象标记为已分配,返回步骤A9;
A12、判断是否所有故障恢复线程均已设置搜索结束标记;
若是,则进入步骤A13;
若否,则返回步骤A9;
A13、完成所有故障恢复线程搜索,即识别出所有已分配对象并完成元数据的修改,完成DRAM中存储的堆管理内存的数据结构的重建;
其中,栈及消息队列中的每个元素包含了一个持久性对象的地址及其对应的类型信息。
Claims (5)
1.一种写优化的持久性内存堆管理方法,其特征在于,包括以下步骤:
S1、在持久性内存中创建一个持久性数据结构根节点,并进行根信息注册;
S2、构建堆管理内存的数据结构,并将其存储于DRAM中;
S3、在系统故障恢复阶段时,基于注册的根信息回收持久性内存空间中的剩余空闲空间,并重建DRAM中存储的堆管理内存的数据结构,进而实现持久性内存的堆管理;
所述步骤S1具体为:
S11、对持久性内存空间进行根空间和堆空间的划分,并对根空间进行初始化;
S12、向系统的堆管理注册包括根节点名字、根节点地址及根节点数据类型在内的根信息;
S13、判断根节点数据类型是否已存在于配置文件中;
若是,则进入步骤S14;
若否,则进入步骤S16;
S14、判断根节点名字是否已存在于持久性内存空间中;
若是,则进入步骤S16;
若否,则进入步骤S15;
S15、将根信息记录到当前划分出根空间中,进入步骤S17;
S16、向用户反馈注册失败信息,并提供根信息修改意见,结束管理流程;
S17、在当前划分的根空间中,按照根节点地址-根节点名字-根节点数据类型的顺序,在根空间的低地址到高地址依次存放根信息,完成根信息注册;
所述步骤S13中的堆管理内存的堆结构包括中心堆和线程堆;
所述中心堆为所有线程共享,并用于维护空闲segment链表;
所述线程堆为以segment为单位从中心堆中分配的持久性内存,用于维护红黑树;
所述堆管理内存的数据结构包括空闲segment链表、红黑树、内存池和基数树;
所述空闲segment链表用于管理segment的分配;
所述红黑树用于管理大对象和内存池的空间分配;
所述内存池用于管理小对象的分配;
所述基数树用于根据持久性对象地址查询对应持久性对象的元数据;
所述大对象为大小大于等于64KB且按16KB对齐的空闲空间,小对象为大小小于32KB的持久性对象,当用户申请分配的持久性对象在32~64KB之间时,堆管理直接为其分配64KB大小的对象即大对象;
所述空闲segment链表的每个节点分别对应一个位于DRAM中的数组项,每个数组项都线性地对应到持久性内存的一个segment;当有segment处于空闲状态时,其对应的数组项中记录下一个空闲segment对应的数组项的地址;当有segment处于已分配给线程堆状态时,其对应的数组项中记录其所属的线程堆;
所述红黑树的每个节点表示一段大小大于等于64KB且按16KB对齐的大块空闲空间即大对象;所述红黑树以按空间大小和空间地址排序,且先比较空间大小再比较空间地址为原则构建;
当需要分配大对象或内存池时,分配方法为:以logN为时间复杂度在红黑树中找到满足分配要求的最小空闲空间,当找到的最小空闲空间大于当前分配要求所需的空间时,将多余空闲空间用一个新的节点表示,并重新插入到红黑树中;
当需要释放大对象或内存池时,释放方法为:当需要释放的大对象或内存池存在空闲的相邻空间时,将其与相邻空间合并,并在红黑树中移除代表相邻空间的节点,重新插入合并后的空间节点;当需要释放的大对象或内存池不存在空闲的相邻空间时,直接向红黑树中插入需释放的大对象或内存池所占的空间节点;
所述内存池的大小为128KB,且DRAM中设置有与之对应的RUN管理结构,所述RUN管理结构保存了每个小对象的分配状态位图及内存池在持久性内存上的地址信息;所述大小相同的RUN管理结构以链表的形式连接起来并通过SLAB结构进行管理,当一种类型的内存池耗尽时,通过SLAB结构在红黑树中查找空闲空间,分配新的内存池,当存在内存池完全空闲时,通过SLAB结构向红黑树归还该内存池占据的空间;
所述基数树以持久性对象地址为key进行构建,所述基数树的查询方法为:在常数时间复杂度内根据持久性对象地址查询其对应的元数据,对于小对象,其元数据为它所在的RUN管理结构的地址,对于大对象,其元数据为其大小信息;
所述步骤S3具体为:
S31、初始化DRAM中的堆管理内存的数据结构,将持久性内存中的整个堆空间全部视为空闲,设定故障恢复线程数量为n,并初始化编号为0~n-1的n个空闲的线程堆;
S32、从持久性内存空间的第一个块开始,扫描持久性内存的整个根空间,对于扫描找到的根空间中的根信息,在DRAM中为其建立以根节点名字为key的哈希索引,并将配置文件读入到DRAM中,以持久性对象的类型名字为key,建立哈希索引;
S33、将所有扫描找到的根空间视为已分配对象,将已分配对象按照round-robin顺序,并将其所属的segment分配给对应编号的线程堆;
S34、统计各root所在的segment,按照将属于同一个segment的root分配给同一个故障恢复线程的原则,为n个故障恢复线程分配任务;
S35、启动n个故障恢复线程,并使每个故障恢复线程从root出发进行深度优先搜索,根据注册的根信息和建立的哈希索引识别出所有已分配对象并在DRAM中修改对应的元数据,完成DRAM中存储的堆管理数据结构的重建;
S36、通过应用程序的线程认领并使用完成堆管理数据结构重建的线程堆,进行持久性内存的分配和释放,进而完成持久性内存的堆管理。
2.根据权利要求1所述的写优化的持久性内存堆管理方法,其特征在于,所述步骤S11中对持久性内存空间进行根空间和堆空间的划分的方法具体为:
将持久性内存空间的第一个大小为64KB的块作为第一个根空间,之后的持久性内存空间作为堆空间,当前一个根空间随用户注册空间耗尽时,从与其相邻的后一个堆空间中分配一个新的大小为64KB的块作为新的根空间,并将新的根空间和前一个根空间以链表的形式串联起来,完成根空间和堆空间的划分;
所述根空间用于保存包括根节点名字、根节点地址及根节点数据类型在内的根信息;
所述堆空间作为满足用户内存分配请求的持久性内存空间。
3.根据权利要求1所述的写优化的持久性内存堆管理方法,其特征在于,所述配置文件为保存于堆管理系统中用于存储用户提供的持久性对象类型信息的文件;
所述配置文件中的内容包括name字段、size字段和ptrs字段;
所述name字段用于表示持久性对象的类型名字;
所述size字段用于表示持久性对象的大小;
所述ptrs字段用于表示持久性对象内的持久性指针相对持久性对象起始地址的偏移量及指针类型。
4.根据权利要求1所述的写优化的持久性内存堆管理方法,其特征在于,所述步骤S33中,对于每个分配给线程堆的segment,以segment的起始地址为key,以该segment所属线程堆的编号为value构建哈希表并存储在DRAM中。
5.根据权利要求4所述的写优化的持久性内存堆管理方法,其特征在于,所述步骤S35中,每个故障恢复线程进行深度优先搜索的方法具体为:
A1、将根信息中的根节点地址和根节点数据类型信息入栈;
A2、判断栈中是否还存在未处理的元素;
若是,则进入步骤A3;
若否,则进入步骤A8;
A3、弹出栈顶元素,得到持久性对象的地址和类型信息,进而得到持久性对象中持久性指针的值及类型信息,进入步骤A4;
A4、将持久性指针的值及类型信息入栈,并递增其对应的持久性对象的引用计数,判断该引用计数是否为1;
若是,则进入步骤A5;
若否,则返回步骤A2;
A5、判断当前持久性对象所在的segment是否属于当前故障恢复线程的线程堆;
若是,则进入步骤A6;
若否,则进入步骤A7;
A6、更新当前线程堆中的元数据,并将其对应的持久性对象标记为已分配,并返回步骤A2;
A7、基于建立的哈希索引查询该持久性对象所属的线程堆,并将指向该持久性对象的持久性指针放入相应的消息队列,并返回步骤A2;
A8、为当前故障恢复线程设置搜索结束标记,进入步骤A9;
A9、判断当前消息队列中是否还存在未处理的元素;
若是,则进入步骤A10;
若否,则进入步骤A12;
A10、从当前消息队列中任取一个元素,得到持久性对象的地址和数据类型,进而得到持久性对象的大小,进入步骤A11;
A11、更新当前持久性对象对应的线程堆的元数据,并将该持久性对象标记为已分配,返回步骤A9;
A12、判断是否所有故障恢复线程均已设置搜索结束标记;
若是,则进入步骤A13;
若否,则返回步骤A9;
A13、完成所有故障恢复线程搜索,即识别出所有已分配对象并完成元数据的修改,完成DRAM中存储的堆管理内存的数据结构的重建;
其中,栈及消息队列中的每个元素包含了一个持久性对象的地址及其对应的类型信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010967533.2A CN112084032B (zh) | 2020-09-15 | 2020-09-15 | 一种写优化的持久性内存堆管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010967533.2A CN112084032B (zh) | 2020-09-15 | 2020-09-15 | 一种写优化的持久性内存堆管理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112084032A CN112084032A (zh) | 2020-12-15 |
CN112084032B true CN112084032B (zh) | 2023-04-11 |
Family
ID=73737106
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010967533.2A Active CN112084032B (zh) | 2020-09-15 | 2020-09-15 | 一种写优化的持久性内存堆管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112084032B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112596908B (zh) * | 2020-12-28 | 2022-09-16 | 中孚安全技术有限公司 | 一种基于完全二叉树的内存管理方法及系统 |
CN113515501B (zh) * | 2021-06-21 | 2022-10-25 | 清华大学 | 非易失性内存数据库管理系统恢复方法、装置和电子设备 |
CN115033378B (zh) * | 2022-06-06 | 2023-01-06 | 北京熵核科技有限公司 | 一种关于易失性内存的管理方法 |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9003223B2 (en) * | 2012-09-27 | 2015-04-07 | International Business Machines Corporation | Physical memory fault mitigation in a computing environment |
WO2016111702A1 (en) * | 2015-01-09 | 2016-07-14 | Hewlett Packard Enterprise Development Lp | Persistent memory garbage collection |
US10120655B2 (en) * | 2016-06-03 | 2018-11-06 | Microsoft Technology Licensing, Llc. | Seamless high performance interoperability between different type graphs that share a garbage collector |
CN110309137A (zh) * | 2018-02-28 | 2019-10-08 | 贵州白山云科技股份有限公司 | 一种数据管理方法及装置 |
CN109298935B (zh) * | 2018-09-06 | 2023-02-03 | 华泰证券股份有限公司 | 一种多进程单写多读无锁共享内存的方法及应用 |
CN110134514B (zh) * | 2019-04-18 | 2021-04-13 | 华中科技大学 | 基于异构内存的可扩展内存对象存储系统 |
CN110096234A (zh) * | 2019-04-30 | 2019-08-06 | 深圳忆联信息系统有限公司 | 一种提高固态硬盘中写性能的方法及其系统 |
CN111309310B (zh) * | 2020-03-02 | 2023-04-28 | 上海交通大学 | 面向非易失性内存的JavaScript对象持久化框架 |
CN111611246B (zh) * | 2020-05-25 | 2023-04-25 | 华中科技大学 | 一种基于持久性存储器优化b+树索引性能的方法和系统 |
-
2020
- 2020-09-15 CN CN202010967533.2A patent/CN112084032B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN112084032A (zh) | 2020-12-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112084032B (zh) | 一种写优化的持久性内存堆管理方法 | |
US10649661B2 (en) | Dynamically resizing logical storage blocks | |
JP3708047B2 (ja) | フラッシュメモリの管理方法 | |
CN109643275B (zh) | 存储级存储器的磨损均衡设备和方法 | |
US10176190B2 (en) | Data integrity and loss resistance in high performance and high capacity storage deduplication | |
US10324851B2 (en) | Facilitating recording a trace file of code execution using way-locking in a set-associative processor cache | |
US20200117368A1 (en) | Method for achieving data copying in ftl of solid state drive, system and solid state drive | |
CN101515276B (zh) | 一种文件数据写操作的方法、文件数据恢复方法及系统 | |
CN106775476A (zh) | 混合内存系统及其管理方法 | |
CN110018790B (zh) | 一种保证持久性内存中数据崩溃一致性的方法及系统 | |
US20190272122A1 (en) | Memory Access Technology | |
US20150324281A1 (en) | System and method of implementing an object storage device on a computer main memory system | |
US11449430B2 (en) | Key-value store architecture for key-value devices | |
CN112860594B (zh) | 一种固态盘地址重映射方法、设备及固态盘 | |
CN107544859B (zh) | 在混合内存系统上用来保证数据一致性的检查点方法 | |
Hu et al. | Halo: A hybrid PMem-DRAM persistent hash index with fast recovery | |
CN111414134A (zh) | 面向持久内存文件系统的事务写优化框架的方法及系统 | |
US7222117B1 (en) | Segmented global area database | |
WO2024099448A1 (zh) | 内存释放、内存恢复方法、装置、计算机设备及存储介质 | |
CN105335220A (zh) | 一种存储设备的事务恢复方法,及装置 | |
CN113704217A (zh) | 一种分布式持久性内存文件系统中元数据及数据组织架构方法 | |
Xiang et al. | A reliable B-tree implementation over flash memory | |
Chen et al. | A unified framework for designing high performance in-memory and hybrid memory file systems | |
Pan et al. | Hart: A concurrent hash-assisted radix tree for dram-pm hybrid memory systems | |
CN111338569A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |