CN111309310A - 面向非易失性内存的JavaScript对象持久化框架 - Google Patents
面向非易失性内存的JavaScript对象持久化框架 Download PDFInfo
- Publication number
- CN111309310A CN111309310A CN202010135451.1A CN202010135451A CN111309310A CN 111309310 A CN111309310 A CN 111309310A CN 202010135451 A CN202010135451 A CN 202010135451A CN 111309310 A CN111309310 A CN 111309310A
- Authority
- CN
- China
- Prior art keywords
- persistent
- memory
- module
- javascript
- root
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
-
- 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/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- 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)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Memory System (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种面向非易失性内存的JavaScript对象持久化框架,包括:持久性对象池模块、共享内存模块、数据一致性保障模块以及垃圾回收模块;持久性对象池模块负责创建与管理JavaScript持久性对象;共享内存模块支持持久性对象池模块创建管理的JavaScript持久化对象并行访问共享持久内存;数据一致性保证模块为上层应用程序调用JavaScript持久化对象提供一致性保障机制;垃圾回收模块负责回收处理无效的JavaScript持久化对象所占用的内存。本发明所述框架能够较为便捷的添加至现有的V8网页引擎当中,所述方法也可以方便的移植到面向非易失性内存的数据库系统中,具有广泛的市场应用价值。
Description
技术领域
本发明涉及非易失性内存对象管理技术领域,具体地,涉及一种面向非易失性内存的JavaScript对象持久化框架。
背景技术
非易失性内存(Non-Volatile Memory,NVM)是指新一代存储介质,其自身接近传统DRAM内存级别访存速度,同时兼具HDD、SSD等外存设备的数据持久性以及大密度存储等特性。NVM被认为是下一代内存存储体系结构的发展方向,Intel和Micron提出的3D XPoint技术已提供了商用化的NVM解决方案。
面向对象编程及其相关思想一直都是高级编程语言中的重要组成部分。作为其中的关键,“对象”这一概念的高效实现也是高级语言设计必须考虑的因素之一。在许多应用场景下,对象还需要保证持久性:即断电之后数据恢复的能力。
基于NVM的访问速度和可按字节寻址的特性,高级语言可以直接在持久内存上创建和访问持久对象。这使得持久对象仅需要在NVM上保存一份副本,无需额外的数据传输。另外,持久对象在NVM中的结构即为对象本身的结构,所以无需再进行序列化或者反序列化。
目前,一些高级编程语言(如Python,JavaScript等)并不支持对NVM设备的访问,用户无法用语言本身编写相关的库来支持基于NVM的持久对象存储。另一方面,持久对象在内存管理和实现方面与普通对象有较大差异。
发明内容
针对现有技术中的缺陷,本发明的目的是提供一种面向非易失性内存的JavaScript对象持久化框架。
根据本发明提供的一种面向非易失性内存的JavaScript对象持久化框架,包括:持久性对象池模块、共享内存模块、数据一致性保障模块以及垃圾回收模块;
持久性对象池模块负责创建与管理JavaScript持久性对象;
共享内存模块支持持久性对象池模块创建管理的JavaScript持久化对象并行访问共享持久内存;
数据一致性保证模块为上层应用程序调用JavaScript持久化对象提供一致性保障机制;
垃圾回收模块负责回收处理无效的JavaScript持久化对象所占用的内存。
优选地,所述持久性对象池模块由以下部分组成:根、类型表、根对象以及对象缓存。
优选地,所述根是进程访问所述持久性对象池模块中的内存的入口,通过libpmemobj中的root()方法得到的固定大小的内存区域;
所述根会在持久对象池被创建时被初始化。
优选地,所述类型表记录了所述持久性对象池模块中所有持久对象的类型信息,并且提供了一个从类型码到具体类型的映射。
优选地,在所述持久性对象池模块中,根对象为程序唯一可直接通过对象池访问到的持久对象,所有其它地持久对象都必须被根对象直接或间接地引用,否则在垃圾回收的过程中,这些对象会被视为垃圾从而被清理。
优选地,在所述持久性对象池模块中,对象缓存首先会记录持久内存中被频繁读写的位置;
在所述持久性对象池模块中,对象缓存还可通过暂存持久数据来减少持久内存上的冗余数据;
所述对象缓存可暂存那些被写入持久内存中的数据在持久内存中的地址,当下次需要写入同样的数据时,即可直接返回被缓存的地址。
优选地,利用所述持久化对象池模块来创建和管理JavaScript持久化对象,步骤包括:
步骤S1:通过指定参数创建对象池;
步骤S2:对象池初始化创建根对象;
步骤S3:在对象池上创建持久对象,并让其被根对象直接或间接引用;
步骤S4:直接读写持久对象,相应数据会从持久内存中被读出或写入持久内存;
步骤S5:终止程序,此时未被根对象直接或间接引用的对象会被回收释放;
步骤S6:重启程序,打开上次创建的对象池,通过根对象找到之前写入的持久对象。
优选地,所述共享内存模块能够支持JavaScript对象访问共享持久内存。
优选地,所述共享内存模块设计实现了一个Persistent Array Buffer对象,以二进制数据缓冲区的方式访问和管理内存;
PAB可用于管理持久内存;
在使用所述共享内存模块处理并发任务时,每个进程需要在自己的地址空间中维护一个PAB对象,用以进行持久内存的分配、管理和访问;
多个进程可以通过其PAB对象映射到同一内存区域的方式实现持久内存共享,进而基于共享内存实现进程间通信;
对于并发编程中常见的一致性控制问题,所述共享内存模块进行原子化操作相关设计,避免发生写冲突、重复写以及死锁问题。
优选地,所述数据一致性保障模块通过原子操作和事务机制两个层面的保证来确保持久对象的数据一致性;
所述垃圾回收模块实现了一套结合了引用计数和可达性分析的垃圾回收算法,对持久性对象进行分代回收。
与现有技术相比,本发明具有如下的有益效果:
1、本发明所述框架为高级编程语言提供了持久化编程方案,并在对应程序软件中提高了系统整体效率。
2、本发明所述框架能够较为便捷的添加至现有的V8网页引擎当中,所述方法也可以方便的移植到面向非易失性内存的数据库系统中,具有广泛的市场应用价值。
附图说明
通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
图1是本发明提供的总体框架示意图;
图2是本发明提供的图1中持久性对象池架构图;
图3是本发明提供的图2的持久对象调用示意图;
图4是本发明提供的图1中的共享内存模块组成和原理概况示意图;
图5是本发明提供的图1中共享内存模块中多进程使用PAB分配和内存映射的示意图;
图6是本发明提供的图1中数据一致性保障模块中事务机制示意图;
图7是本发明提供的图1中的垃圾回收模块中引用计数结构图。
具体实施方式
下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。
根据本发明提供的一种面向非易失性内存的JavaScript对象持久化框架,包括:持久性对象池模块、共享内存模块、数据一致性保障模块以及垃圾回收模块;
持久性对象池模块负责创建与管理JavaScript持久性对象;
共享内存模块支持持久性对象池模块创建管理的JavaScript持久化对象并行访问共享持久内存;
数据一致性保证模块为上层应用程序调用JavaScript持久化对象提供一致性保障机制;
垃圾回收模块负责回收处理无效的JavaScript持久化对象所占用的内存。
具体地,所述持久性对象池模块由以下部分组成:根、类型表、根对象以及对象缓存。
具体地,所述根是进程访问所述持久性对象池模块中的内存的入口,通过libpmemobj中的root()方法得到的固定大小的内存区域;
所述根会在持久对象池被创建时被初始化。
具体地,所述类型表记录了所述持久性对象池模块中所有持久对象的类型信息,并且提供了一个从类型码到具体类型的映射。
具体地,在所述持久性对象池模块中,根对象为程序唯一可直接通过对象池访问到的持久对象,所有其它地持久对象都必须被根对象直接或间接地引用,否则在垃圾回收的过程中,这些对象会被视为垃圾从而被清理。
具体地,在所述持久性对象池模块中,对象缓存首先会记录持久内存中被频繁读写的位置;
在所述持久性对象池模块中,对象缓存还可通过暂存持久数据来减少持久内存上的冗余数据;
所述对象缓存可暂存那些被写入持久内存中的数据在持久内存中的地址,当下次需要写入同样的数据时,即可直接返回被缓存的地址。
具体地,利用所述持久化对象池模块来创建和管理JavaScript持久化对象,步骤包括:
步骤S1:通过指定参数创建对象池;
步骤S2:对象池初始化创建根对象;
步骤S3:在对象池上创建持久对象,并让其被根对象直接或间接引用;
步骤S4:直接读写持久对象,相应数据会从持久内存中被读出或写入持久内存;
步骤S5:终止程序,此时未被根对象直接或间接引用的对象会被回收释放;
步骤S6:重启程序,打开上次创建的对象池,通过根对象找到之前写入的持久对象。
具体地,所述共享内存模块能够支持JavaScript对象访问共享持久内存。
具体地,所述共享内存模块设计实现了一个Persistent Array Buffer对象,以二进制数据缓冲区的方式访问和管理内存;
PAB可用于管理持久内存;
在使用所述共享内存模块处理并发任务时,每个进程需要在自己的地址空间中维护一个PAB对象,用以进行持久内存的分配、管理和访问;
多个进程可以通过其PAB对象映射到同一内存区域的方式实现持久内存共享,进而基于共享内存实现进程间通信;
对于并发编程中常见的一致性控制问题,所述共享内存模块进行原子化操作相关设计,避免发生写冲突、重复写以及死锁问题。
具体地,所述数据一致性保障模块通过原子操作和事务机制两个层面的保证来确保持久对象的数据一致性;
所述垃圾回收模块实现了一套结合了引用计数和可达性分析的垃圾回收算法,对持久性对象进行分代回收。
下面通过优选例,对本发明进行更为具体地说明。
优选例1:
为了实现上述目的,本发明的实施例公开了一种面向非易失性内存的JavaScript对象持久化框架,所述框架包括持久性对象池模块、共享内存模块、数据一致性保障模块以及垃圾回收模块,所述持久性对象池模块为上层程序提供JavaScript对象持久化功能,所述共享内存模块为进程提供分配、管理和访问共享内存的服务,所述数据一致性保障模块为上层应用提供一致性保障服务,所述垃圾回收模块为上层应用提供持久对象分代回收服务。所述面向非易失性内存的JavaScript对象持久化框架能够提供以下服务以及保障:
另外,根据本发明上述实施例的面向非易失性内存的JavaScript对象持久化框架,还可以具有如下附加的技术特征:
所述持久化对象池模块,为上层程序提供了创建,访问和管理持久对象的入口。所述持久性对象池模块由以下部分组成,分别为:根、类型表、根对象以及对象缓存。
进一步地,所述根会在持久对象池被创建时被初始化,其一共包含三个持久指针:第一个指针指向的是该对象池的元数据结构,第二个指针指向的是根对象,第三个指针指向一个类型表。
进一步地,所述类型表以可扩展的字符串数组的形式保存着所有出现过的持久类型的名称,该名称与具体的类型是一一对应的关系。
进一步地,所述根对象为程序唯一可直接通过对象池访问到的持久对象,所有其它地持久对象都必须被根对象直接或间接地引用。所述垃圾回收模块会根据判断持久对象是否为根对象,来进行引用计数以及可达性分析,进而进行垃圾回收操作。
进一步地,所述对象缓存将会进一步减少数据冗余以及读写性能损耗。
所述共享内存模块包括持久内存对象、共享内存和进程间通信机制、并发控制模块,从而能够支持JavaScript对象访问共享持久内存。
进一步地,持久内存对象是所述共享模块中负责内存管理的对象,将其命名为Persistent Array Buffer(PAB)。在共享内存模块中,持久内存区域会被映射到对应的文件区域,PAB以二进制数据缓冲区的方式表示持久内存区域,并且通过视图进行内存的读写。
进一步地,在一个进程中使用所述PAB对象分配一段内存,并将其映射到持久内存文件区域的一个文件中,接着在其他进程上打开指定的文件路径,则进程的地址空间中的PAB对象将指向同一持久内存区域。该内存区域中将会存放执行某个任务的过程中需要使用到的共享变量,当共享变量被更新之后,其将会立刻被广播到所有的进程地址空间中。
进一步地,所述并发控制模块通过N-API进行语言绑定,将C语言中的原子函数暴露到Node包中,从而可以直接在JavaScript程序中使用,进而保证多进程并发访问共享内存时的原子性。
所述数据一致性保障模块,能够保证在应用程序出现故障之后,利用原子操作以及基于日志的事务机制完成数据一致性恢复。
进一步地,所述原子操作是基于所述持久性对象池模块中内存管理单元的原子分配器实现的。
进一步地,所述基于日志的事务机制是基于redo log和undo log实现的,该机制通过一个全局变量维护当前全部事务状态信息。
所述垃圾回收模块,结合了持久对象引用计数机制以及持久对象可达性分析,从而实现了对上层程序涉及到的无效持久化对象进行高效的垃圾回收,进一步保障数据一致性。
进一步地,所述持久对象引用计数机制,使得所有持久对象都在其头部保存一个元数据结构,用于保存该对象被引用次数,当引用次数变为零时,其将会被所述对象缓存进行弱引用管理,在所述持久化对象池模块的大小达到阈值时,引用计数为零的持久对象所占用的内存空间将会被释放。
进一步地,由于所述持久化对象池模块包含一个唯一的根对象,用户必须手动地让其它持久对象被该根对象直接或者间接引用,而那些未被引用的持久对象,则将会被所述垃圾回收模块认定为不再存活的对象。故进行所述可达性分析时,将会直接对无效的持久对象进行标记清除处理。
本发明的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
优选例2:
本发明的面向非易失性内存的JavaScript对象持久化框架,如附图1所示,所述装置包括持久性对象池模块、共享内存模块、数据一致性保障模块以及垃圾回收模块。
持久性对象池模块,主要是为上层应用提供基本的非易失性内存中的内存分配,寻址,释放等基本方法,并允许上层应用直接通过所述持久性对象池构建持久对象,从而为JavaScript中的持久性对象提供一套高效的管理机制。
共享内存模块,主要是为上层应用提供一个Persistent Array Buffer(PAB)对象,其功能类似Node中的Array Buffer对象,以二进制数据缓冲区的方式访问和管理内存。PAB由于访问机制的设计,可以用于管理持久内存。在使用所述模块处理并发任务时,每个进程需要在自己的地址空间中维护一个PAB对象,用以进行持久内存的分配、管理和访问。多个进程可以通过其PAB对象映射到同一内存区域的方式实现持久内存共享,进而基于共享内存实现进程间通信。
数据一致性保障模块,主要是利用原子操作以及基于日志的事务机制,保障数据在系统出现故障时,能够保障数据可以恢复到一致性状态,避免由于程序异常中断产生的数据不一致会被持久地保存在持久对象中。
垃圾回收模块,主要是根据持久对象的引用次数以及对持久对象的可达性分析,进行垃圾回收,从而使得使得持久对象能够高效地被回收。
如附图2所示,在持久性对象池模块中:
根是进程访问持久对象池中的内存的入口,它是通过libpmemobj中的root()方法得到的固定大小的内存区域。所述根会在持久对象池被创建时被初始化。
类型表记录了对象池中所有持久对象的类型信息,并且提供了一个从类型码到具体类型的映射。
根对象为程序唯一可直接通过对象池访问到的持久对象,所有其它地持久对象都必须被根对象直接或间接地引用,否则在垃圾回收的过程中,这些对象会被视为垃圾从而被清理。
对象缓存会记录持久内存中被频繁读写的位置。例如,当程序需要频繁读写持久对象的某个属性时,该属性的值以及该属性在持久内存中的地址会被记录到缓存中,所以当下一次需要对该属性进行读写时,会直接从对象缓存中取出数据或者根据缓存的地址直接修改持久内存。其次,对象缓存可通过暂存持久数据来减少持久内存上的冗余数据。例如,当需要将同样的字符串写入某持久对象的多个属性中时,若无缓存,该字符串会被写入持久内存的多个位置。这不仅造成了空间的浪费,还带来了较大性能损耗。因此,对象缓存可暂存被写入持久内存中的数据在持久内存中的地址。当下次需要写入同样的数据时,即可直接返回被缓存的地址。
如附图3所示,其展示了一个利用缓存减少冗余数据并提升性能的例子。当程序需要将字符串“str”写入持久对象obj的属性a和属性b时,若无对象缓存,该字符串会被写入持久内存的两个位置,然后分别被a和b引用;而若在第一次写字符串之后将其在持久内存中的位置缓存起来,则属性b在之后的读写访问能够直接引用它,这样既避免了空间的浪费,同时也加快了持久对象的读写速度。
本发明实施例一是在JavaScript语言中利用持久对象池来创建和管理持久对象的步骤,具体步骤如下:
步骤A.1:通过指定参数(如对象池的大小,名称等)创建对象池。
步骤A.2:对象池初始化创建根对象。
步骤A.3:在对象池上创建持久对象,并让其被根对象直接或间接引用。
步骤A.4:直接读写持久对象,相应的数据会从持久内存中被读出或者写入持久内存。
步骤A.5:终止程序,此时未被根对象直接或间接引用的对象会被回收释放。
步骤A.6:重启程序,打开上次创建的对象池,通过根对象找到之前写入的持久对象。
如附图4所示,在所述共享内存模块中,包括持久内存对象,多进程间通信以及并发控制模块。上层程序将会利用所述持久内存对象(PAB)进行持久内存的管理和操作,因此在每个进程中维护一个PAB对象。
例图5说明了Node中的进程如何使用PAB进行内存的分配和映射,进程的地址空间中存在一个PAB对象,而持久内存中分为内存区域和文件区域。所述多进程间通信机制的基本流程为:
1、主进程上通过函数new PersistentArrayBuffer(length,path,’c’)新建一个PAB对象,根据操作的数量和TypedArray的类型决定分配的内存区域的长度;
2、使用函数child_process.fork()从主进程生成多个子进程,并且将需要执行的任务脚本复制到每个子进程的地址空间;
3、在每个子进程上,通过new PersistentArrayBuffer(length,path,’o’)函数创建一个PAB对象,并且根据指定的path参数打开对应位置的映射文件及内存,,这里的length和path参数值应该与主进程中的一致,从而保证所有进程中的PAB访问的是同一内存区域。
所述并发控制模块中,引入和应用N-API进行函数封装的步骤如下:
1、获取C函数中的变量并且转换为合适的类型,比如,N-API函数napi_get_buffer_info(env,args[0],buffer,buffer_length)被定义获取一个(void*)buffer作为参数,对应到Node中,由于使用了TypedArray,参数需要被转换为(int*)类型;
2、由原来的C函数__sync_fetch_and_add()创建一个对象,并且被输出到一个Node的模块中;
3、需要新建一个binding.gyp文件描述插件文件的来源和目标模块;
4、使用Node.js的编译工具node-gyp编译各个源文件和binding.gyp,最终生成一个二进制的Node模块文件,并通过使用require()函数引入到Node文件中,其中的函数可以被JavaScript函数调用。
本发明的实例二是以一个四个进程并行处理的任务为样例,展示所述共享内存模块的基本组成部分、实现方式以及工作原理。
本发明实例二的工作流程如下:
1、进程初始化,从主进程复制生成三个新的子进程;
2、对于现有的四个进程,在每个进程中创建一个持久性内存对象(PAB),通过PAB对象访问、管理以及修改相应的持久内存区域;
3、四个进程中的PAB对象指向同一内存区域以实现共享内存的目的,并且通过内存映射到文件的方式保证数据的持久性;
4、将任务动态分配到所有的进程,保证进程间的动态负载均衡,同时,利用本发明所述数据一致性保障模块保障数据安全。
在数据一致性保障模块中,所述原子操作主要步骤如下:
1、通过内存管理单元在持久内存上分配一段持久内存空间,将操作字符串以持久字符串的结构原子地写入这段空间中;
2、将持久字符串的内容写入内存完成之后,通过8字节的原子写操作,修改持久内存中的bitmap部分,若在写字符串的途中掉电,对象池重新被加载时不会看到这段分配失败的内存空间;
3、步骤2结束后,返回一个指向这段空间的16字节(128位)持久指针,若在此时掉电,由于该持久对象未被根对象引用,因此也会被垃圾回收器清理,不会产生一致性问题;
4、将持久字符串对应的指针原子地更新为最新的16字节持久指针。
如例图6所示,所述基于日志的事务机制实现步骤如下:
1、该机制通过一个全局变量维护了事务状态信息。在事务开始之前,事务状态为NONE,上层应用可通过begin()操作开启一个事务;
2、如果事务开启成功,事务状态会变为WORK,转到步骤3;若开启失败,事务状态会变为ABORT。
3、在WORK状态下,用户可对持久对象的内容进行修改,而在被修改之前相应的部分会自动地以undo log的形式保存。同时,在事务进行的过程中也可以通过手动地调用abort()来取消事务,此时事务状态同样会变为ABORT;事务取消会使得被写入undo log的内容回滚,而写入redo log的部分重做。
4、在事务状态为WORK的状态下若调用commit()方法会尝试进行事务提交。该操作会将相应的修改写入持久对象,若该操作成功,则会使事务进入ONCOMMIT状态,转到步骤5,否则会使事务进入ABORT状态。在ONCOMMIT和ABORT状态下执行process()会使得事务进入FINALLY状态,该状态下用户可以尝试处理异常或者执行的结果。
5、在ONCOMMIT和FINALLY状态下执行end()操作会结束事务,此后事务将恢复成NONE状态。
在垃圾回收模块中,进行持久对象可达性分析时,需首先定义三个容器:containers,others和to_parse,所述三个容器保存着持久对象池中所有持久数据结构的弱引用。其中,containers保存所述容器结构的引用,others部分则保存着其余的所有的持久数据结构,to_parse保存根对象以及所有将要被遍历的对象。
所述垃圾回收模块实现了一套结合了持久对象引用计数以及可达性分析的垃圾回收算法,其步骤如下:
1、所有持久对象的头部都有一个元数据结构,该结构保存了该对象被直接引用的次数,即引用计数。如附图7所示,通过NVM的8字节原子写操作来完成持久对象引用计数的更新,若发生了不一致的情况,则转到步骤2。
2、通过一个循环对to_parse中的所有对象进行如下处理:
1)取出to_parse头部中的对象;
2)若该对象是一个容器对象,则将其从contaniers中移除,之后对其进行遍历,并将其引用的所有对象或者结构放入to_parse中;
3)否则,将该对象从others中移除;
4)转到步骤1,直至to_parse为空;
5)释放所有留在containers和others中的对象或者结构,结束垃圾回收过程。
尽管已经示出和描述了本发明的实施例,本领域的普通技术人员可以理解:在不脱离本发明的原理和宗旨的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由权利要求及其等同限定。
在本申请的描述中,需要理解的是,术语“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本申请和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本申请的限制。
本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统、装置及其各个模块以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统、装置及其各个模块以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同程序。所以,本发明提供的系统、装置及其各个模块可以被认为是一种硬件部件,而对其内包括的用于实现各种程序的模块也可以视为硬件部件内的结构;也可以将用于实现各种功能的模块视为既可以是实现方法的软件程序又可以是硬件部件内的结构。
以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相互组合。
Claims (10)
1.一种面向非易失性内存的JavaScript对象持久化框架,其特征在于,包括:持久性对象池模块、共享内存模块、数据一致性保障模块以及垃圾回收模块;
持久性对象池模块负责创建与管理JavaScript持久性对象;
共享内存模块支持持久性对象池模块创建管理的JavaScript持久化对象并行访问共享持久内存;
数据一致性保证模块为上层应用程序调用JavaScript持久化对象提供一致性保障机制;
垃圾回收模块负责回收处理无效的JavaScript持久化对象所占用的内存。
2.根据权利要求1所述的面向非易失性内存的JavaScript对象持久化框架,其特征在于,所述持久性对象池模块由以下部分组成:根、类型表、根对象以及对象缓存。
3.根据权利要求2所述的面向非易失性内存的JavaScript对象持久化框架,其特征在于,所述根是进程访问所述持久性对象池模块中的内存的入口,通过libpmemobj中的root()方法得到的固定大小的内存区域;
所述根会在持久对象池被创建时被初始化。
4.根据权利要求2所述的面向非易失性内存的JavaScript对象持久化框架,其特征在于,所述类型表记录了所述持久性对象池模块中所有持久对象的类型信息,并且提供了一个从类型码到具体类型的映射。
5.根据权利要求2所述的面向非易失性内存的JavaScript对象持久化框架,其特征还在于,在所述持久性对象池模块中,根对象为程序唯一可直接通过对象池访问到的持久对象,所有其它地持久对象都必须被根对象直接或间接地引用,否则在垃圾回收的过程中,这些对象会被视为垃圾从而被清理。
6.根据权利要求2所述的面向非易失性内存的JavaScript对象持久化框架,其特征还在于,在所述持久性对象池模块中,对象缓存首先会记录持久内存中被频繁读写的位置;
在所述持久性对象池模块中,对象缓存还可通过暂存持久数据来减少持久内存上的冗余数据;
所述对象缓存可暂存那些被写入持久内存中的数据在持久内存中的地址,当下次需要写入同样的数据时,即可直接返回被缓存的地址。
7.根据权利要求2所述的面向非易失性内存的JavaScript对象持久化框架,其特征在于,利用所述持久化对象池模块来创建和管理JavaScript持久化对象,步骤包括:
步骤S1:通过指定参数创建对象池;
步骤S2:对象池初始化创建根对象;
步骤S3:在对象池上创建持久对象,并让其被根对象直接或间接引用;
步骤S4:直接读写持久对象,相应数据会从持久内存中被读出或写入持久内存;
步骤S5:终止程序,此时未被根对象直接或间接引用的对象会被回收释放;
步骤S6:重启程序,打开上次创建的对象池,通过根对象找到之前写入的持久对象。
8.根据权利要求1所述的面向非易失性内存的JavaScript对象持久化框架,其特征在于,所述共享内存模块能够支持JavaScript对象访问共享持久内存。
9.根据权利要求8所述的面向非易失性内存的JavaScript对象持久化框架,其特征在于,所述共享内存模块设计实现了一个Persistent Array Buffer对象,以二进制数据缓冲区的方式访问和管理内存;
PAB可用于管理持久内存;
在使用所述共享内存模块处理并发任务时,每个进程需要在自己的地址空间中维护一个PAB对象,用以进行持久内存的分配、管理和访问;
多个进程可以通过其PAB对象映射到同一内存区域的方式实现持久内存共享,进而基于共享内存实现进程间通信;
对于并发编程中常见的一致性控制问题,所述共享内存模块进行原子化操作相关设计,避免发生写冲突、重复写以及死锁问题。
10.根据权利要求1所述的面向非易失性内存的JavaScript对象持久化框架,其特征在于,所述数据一致性保障模块通过原子操作和事务机制两个层面的保证来确保持久对象的数据一致性;
所述垃圾回收模块实现了一套结合了引用计数和可达性分析的垃圾回收算法,对持久性对象进行分代回收。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010135451.1A CN111309310B (zh) | 2020-03-02 | 2020-03-02 | 面向非易失性内存的JavaScript对象持久化框架 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010135451.1A CN111309310B (zh) | 2020-03-02 | 2020-03-02 | 面向非易失性内存的JavaScript对象持久化框架 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111309310A true CN111309310A (zh) | 2020-06-19 |
CN111309310B CN111309310B (zh) | 2023-04-28 |
Family
ID=71145430
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010135451.1A Active CN111309310B (zh) | 2020-03-02 | 2020-03-02 | 面向非易失性内存的JavaScript对象持久化框架 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111309310B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112084032A (zh) * | 2020-09-15 | 2020-12-15 | 电子科技大学 | 一种写优化的持久性内存堆管理方法 |
CN113608804A (zh) * | 2021-10-11 | 2021-11-05 | 北京华品博睿网络技术有限公司 | 一种可持久化的Java堆外缓存系统及方法 |
CN113986145A (zh) * | 2021-12-23 | 2022-01-28 | 南京集成电路设计服务产业创新中心有限公司 | 一种适用于大规模集成电路后端设计的内存管理方法 |
CN114911631A (zh) * | 2022-07-18 | 2022-08-16 | 深圳市泛联信息科技有限公司 | 基于持久内存技术的全局资源管理方法及系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2001015054A1 (en) * | 1999-08-25 | 2001-03-01 | Bullant Technology Pty Ltd | Computing system and programming environment therefor |
CN102521028A (zh) * | 2011-12-02 | 2012-06-27 | 华中科技大学 | 一种分布式环境下的事务内存系统 |
US20130007695A1 (en) * | 2011-06-29 | 2013-01-03 | International Business Machines Corporation | Modelling serialized object streams |
US20170109341A1 (en) * | 2012-09-13 | 2017-04-20 | Samir Issa | Method of Data Capture, Storage and Retrieval Through User Created Form Templates and Data Item Templates by Executing Computer-Executable Instructions Stored On a Non-Transitory Computer-Readable Medium |
-
2020
- 2020-03-02 CN CN202010135451.1A patent/CN111309310B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2001015054A1 (en) * | 1999-08-25 | 2001-03-01 | Bullant Technology Pty Ltd | Computing system and programming environment therefor |
US20130007695A1 (en) * | 2011-06-29 | 2013-01-03 | International Business Machines Corporation | Modelling serialized object streams |
CN102521028A (zh) * | 2011-12-02 | 2012-06-27 | 华中科技大学 | 一种分布式环境下的事务内存系统 |
US20170109341A1 (en) * | 2012-09-13 | 2017-04-20 | Samir Issa | Method of Data Capture, Storage and Retrieval Through User Created Form Templates and Data Item Templates by Executing Computer-Executable Instructions Stored On a Non-Transitory Computer-Readable Medium |
Non-Patent Citations (5)
Title |
---|
KRIS ZYP等: "Persevere的持久化对象模型", 《程序员》 * |
周相兵等: "基于iBATIS的持久性层次框架研究", 《科学技术与工程》 * |
屈志坚;刘明光;陈秋琳;刘靖;薛福成;: "基于SVG和持久框架的SCADA图库一体化配置系统" * |
薛冰,曹作良: "设计模式和数据持久层框架在Web系统中的应用" * |
赵少卡: "基于Struts+Spring+Hibernate框架的信息交流平台的设计与实现", 《计算机与现代化》 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112084032A (zh) * | 2020-09-15 | 2020-12-15 | 电子科技大学 | 一种写优化的持久性内存堆管理方法 |
CN113608804A (zh) * | 2021-10-11 | 2021-11-05 | 北京华品博睿网络技术有限公司 | 一种可持久化的Java堆外缓存系统及方法 |
CN113986145A (zh) * | 2021-12-23 | 2022-01-28 | 南京集成电路设计服务产业创新中心有限公司 | 一种适用于大规模集成电路后端设计的内存管理方法 |
CN114911631A (zh) * | 2022-07-18 | 2022-08-16 | 深圳市泛联信息科技有限公司 | 基于持久内存技术的全局资源管理方法及系统 |
CN114911631B (zh) * | 2022-07-18 | 2022-10-21 | 深圳市泛联信息科技有限公司 | 基于持久内存技术的全局资源管理方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN111309310B (zh) | 2023-04-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111309310B (zh) | 面向非易失性内存的JavaScript对象持久化框架 | |
Schwalb et al. | nvm malloc: Memory Allocation for NVRAM. | |
US7512745B2 (en) | Method for garbage collection in heterogeneous multiprocessor systems | |
EP0969377B1 (en) | Method of replication-based garbage collection in a multiprocessor system | |
US6779001B1 (en) | Transactional file system for realizing atomic update of plural files by transactions | |
US7533138B1 (en) | Practical lock-free doubly-linked list | |
US7673105B2 (en) | Managing memory pages | |
US20040085849A1 (en) | Flash memory, and flash memory access method and apparatus | |
US20150261463A1 (en) | Asynchronous consistent snapshots in persistent memory stores | |
US11620215B2 (en) | Multi-threaded pause-less replicating garbage collection | |
US7451434B1 (en) | Programming with shared objects in a shared memory | |
Correia et al. | Persistent memory and the rise of universal constructions | |
CN101878472A (zh) | 存储器管理 | |
CN107111548A (zh) | 硬件辅助的对象存储器迁移 | |
CN111414134A (zh) | 面向持久内存文件系统的事务写优化框架的方法及系统 | |
JPH11259285A (ja) | オペレーティングシステムのモジュール入れ替え方法及びモジュールの入れ替えを作う処理装置 | |
Keeton et al. | The OpenFAM API: a programming model for disaggregated persistent memory | |
US6711657B1 (en) | Methods for managing memory in a run-time environment including registration of a deallocation routine at explicit, lazy initialization | |
EP3467671B1 (en) | Cache memory structure and method | |
US20140359201A1 (en) | Persistent memory garbage collection | |
US7237085B2 (en) | Architecture for a scalable heap analysis tool | |
US8756193B2 (en) | System and method for persisting object pointers | |
Attiya et al. | Tracking in order to recover: Recoverable lock-free data structures | |
US20180293164A1 (en) | Automatic persistent memory management | |
CN110471626A (zh) | 应用于Java Card的Nor Flash管理层及方法 |
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 |