买专利,只认龙图腾
首页 专利交易 科技果 科技人才 科技服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

【发明授权】持久性内存的数据存储访问方法、设备及装置_清华大学_201910631722.X 

申请/专利权人:清华大学

申请日:2019-07-12

公开(公告)日:2021-04-27

公开(公告)号:CN110377436B

主分类号:G06F9/54(20060101)

分类号:G06F9/54(20060101);G06F9/52(20060101)

优先权:

专利状态码:有效-授权

法律状态:2021.04.27#授权;2019.11.19#实质审查的生效;2019.10.25#公开

摘要:本发明公开了一种持久性内存的数据存储访问方法、设备及装置,该方法包括:使设备中的文件系统在内核空间接收用户库的访问请求,用户库工作在用户态,访问请求是第三方应用程序通过用户库发起的,且携带操作类型;若操作类型是读操作,则使文件系统允许第三方应用程序通过用户库直接访问设备的持久性内存空间;若操作类型不是读操作,则使文件系统允许第三方应用程序通过用户库和内核线程访问设备的持久性内存空间,内核线程工作在内核态。通过这种方式,本发明能够同时实现持久性内存的高性能和数据安全性,为在多核场景下的扩展能力提供技术支持。

主权项:1.一种持久性内存的数据存储访问方法,其特征在于,包括:使设备中的文件系统在内核空间接收用户库的访问请求,所述用户库工作在用户态,所述访问请求是第三方应用程序通过所述用户库发起的,且携带操作类型;若所述操作类型是读操作,则使所述文件系统允许所述第三方应用程序通过所述用户库直接访问所述设备的持久性内存空间;若所述操作类型是写操作,则使内核线程设置内核空间中的页表的第一页表项以将相应的第一数据页置为可写,所述第一数据页是所述持久性内存空间中固定大小的内存区域;使所述用户库对所述第一数据页完成写操作;使所述内核线程重新设置所述第一页表项以将所述第一数据页置为只读,所述内核线程工作在内核态。

全文数据:持久性内存的数据存储访问方法、设备及装置技术领域本发明涉及持久性内存存储技术领域,尤其涉及一种持久性内存的数据存储访问方法、持久性内存的数据存储访问设备及具有存储功能的装置。背景技术持久性内存PM,PersistentMemory是一种新型的具有字节寻址能力的内存级存储器件,其具有读写延迟低、带宽高、数据持久化、能耗低等特点。持久性内存不仅具有同动态随机存取存储器DRAM,DynamicRandomAccessMemory相近的读写性能,同时又能提供类似传统磁盘等外存类似的持久性。面对高性能的存储器件以及日益兴起的多核处理器架构,构建能够充分发挥持久性内存性能的高效文件系统具有重要意义。现有技术,一种是按照传统方式,将文件系统的一部分放置在内核中,可以在面对任意写操作时提供数据保护。系统调用实现内核态和用户态之间的通信,虚拟文件系统VFS,VirtualFileSystem作为一个抽象层能够屏蔽文件系统的实现细节,提供统一的文件访问接口。另一种是提出在用户态设计持久性内存文件系统,通过使用绕过操作系统的设计,达到充分利用直接访问的好处。又一种是提出使用一个可信的组件来协调对文件系统的关键更新。本申请的发明人在长期的研发过程中发现,单纯将文件系统完全放置于内核态或者用户态,使得持久性内存的高性能和写保护变得对立而难以同时实现;组件设计不可避免地限制持久性内存在多核场景下的扩展能力。发明内容本发明主要解决的技术问题是提供一种持久性内存的数据存储访问方法、持久性内存的数据存储访问设备及具有存储功能的装置,能够同时实现持久性内存的高性能和数据安全性,为在多核场景下的扩展能力提供技术支持。为解决上述技术问题,本发明采用的一个技术方案是:提供一种持久性内存的数据存储访问方法,包括:使设备中的文件系统在内核空间接收用户库的访问请求,所述用户库工作在用户态,所述访问请求是第三方应用程序通过所述用户库发起的,且携带操作类型;若所述操作类型是读操作,则使所述文件系统允许所述第三方应用程序通过所述用户库直接访问所述设备的持久性内存空间;若所述操作类型不是读操作,则使所述文件系统允许所述第三方应用程序通过所述用户库和内核线程访问所述设备的持久性内存空间,所述内核线程工作在内核态。其中,所述使设备中的文件系统在内核空间接收用户库的访问请求之前,包括:使所述设备的持久性内存空间以只读模式映射到用户空间。其中,所述若所述操作类型是读操作,则使所述文件系统允许所述第三方应用程序通过所述用户库直接访问所述设备的持久性内存空间,包括:针对所述读操作,使所述文件系统允许所述第三方应用程序通过所述用户库直接在所述用户空间索引文件系统镜像。其中,所述用户库通过共享消息池与所述内核线程通信;所述共享消息池为共享消息内存区域,所述共享消息内存区域由所述用户库和所述内核线程共同使用。其中,所述方法还包括:使多个所述用户库通过所述共享消息池向所述内核线程发送多个不同的所述访问请求;使所述内核线程采用批量方式处理多个不同的所述访问请求,并采用批量方式增加对应的日志结构的元数据修改历史,所述日志结构的元数据修改历史用于记录所修改的元数据的相关信息,其保存在所述持久性内存空间;待多个不同的所述访问请求处理完毕后,使所述内核线程采用批量方式将处理结果通过所述共享消息池返回给所述用户库。其中,所述方法还包括:使所述用户库在初始化时在所述共享消息池申请本进程的消息区,其中,不同进程的消息区相互隔离,各个进程只能访问本进程的消息区;使所述用户库将新消息复制到所述消息区,并设置请求状态字段使所述新消息生效;使所述内核线程以轮训的方式识别生效的新消息;使所述内核线程处理完生效的新消息后,将对应的返回信息复制到所述消息区,并设置消息返回值;使所述用户库以轮训的方式查询所述消息返回值进而获得所述返回信息。其中,不是读操作的操作类型是写操作和修改操作中的至少一种。其中,所述若所述操作类型不是读操作,则使所述文件系统允许所述第三方应用程序通过所述用户库和内核线程访问所述设备的持久性内存空间,包括:针对所述写操作,使所述内核线程设置内核空间中的页表的第一页表项以将相应的第一数据页置为可写,所述第一数据页是所述持久性内存空间中固定大小的内存区域;使所述用户库对所述第一数据页完成写操作;使所述内核线程重新设置所述第一页表项以将所述第一数据页置为只读。其中,所述方法还包括:使所述内核线程为所述用户库批量预留第二数据页,并设置相关的第二页表项以将所述第二数据页置为可写,所述第二数据页是所述持久性内存空间中固定大小的内存区域;其中,所述若所述操作类型不是读操作,则使所述文件系统允许所述第三方应用程序通过所述用户库和内核线程访问所述设备的持久性内存空间,包括:针对所述写操作,使所述用户库直接在预留的第二数据页中进行分配,并直接在所述用户空间获取对应的范围锁;使所述用户库对分配的第二数据页完成写操作;使所述内核线程重新将新写入的第二数据页的第二页表项设置为只读,并释放所述范围锁。其中,所述范围锁能够支持同一文件内的并发写操作;所述使所述用户库对分配的第二数据页完成写操作,包括:使所述文件系统对每个文件分配一个锁队列;使发起写同一文件请求的用户库在写操作之前向前遍历所述锁队列中所有的写操作字段;若确定之前已添加的所有的写操作字段不同于自身的写操作字段,则在所述锁队列中添加自身的写操作字段,并使所述用户库对分配的第二数据页完成写操作,其中,所述写操作字段用于记录本次写操作所涉及到的文件偏移量的范围;若确定之前已添加的所有的写操作字段与自身的写操作字段存在重叠,则使所述用户库等待之前的写操作完成后再对分配的第二数据页完成写操作。其中,所述若所述操作类型不是读操作,则使所述文件系统允许所述第三方应用程序通过所述用户库和内核线程访问所述设备的持久性内存空间,包括:针对所述修改操作,使所述用户库将修改请求发送给所述内核线程,并使所述内核线程根据所述修改请求进行对应的修改。其中,所述文件系统的数据包括可索引的结构化元数据,所述可索引的结构化元数据保存在动态随机存取存储器DRAM中;所述文件系统的数据还包括日志结构的元数据修改历史,所述日志结构的元数据修改历史用于记录所修改的元数据的相关信息,其保存在所述持久性内存空间;所述修改操作是修改所述可索引的结构化元数据,所述方法还包括:使所述内核线程在修改所述可索引的结构化元数据时,首先将所述可索引的结构化元数据的修改信息增加到所述日志结构的元数据修改历史中;待所述可索引的结构化元数据的修改信息到达所述持久性内存空间后,使所述内核线程修改所述DRAM中的可索引的结构化元数据。其中,所述可索引的结构化元数据包括名字空间元数据和数据块索引元数据,所述名字空间元数据用于管理所述文件系统的名字空间,并形成所述文件系统的目录;所述方法还包括:使所述内核线程通过跳表维护所述目录的目录项;使所述内核线程采用原子操作原子地修改所述跳表的各层节点指针。其中,所述方法还包括:使所述DRAM中保存所述可索引的结构化元数据的区域以只读模式映射到用户空间;使所述用户库在发送修改请求之前,在用户态查询所述名字空间元数据中待更新目录项对应的各个跳表的节点,并将各个跳表的节点的地址信息携带在所述修改请求中;使所述内核线程通过所述修改请求中携带的所述地址信息快速查找需要修改的跳表的节点,并完成元数据修改操作。其中,所述文件系统的数据包括可索引的结构化元数据,所述可索引的结构化元数据保存在动态随机存取存储器DRAM;所述方法还包括:使所述DRAM中保存所述可索引的结构化元数据的区域以只读模式映射到用户空间;针对所述读操作,使所述用户库以只读模式通过所述可索引的结构化元数据进行查找,并通过无锁机制将从对应数据页中读取到的数据复制到所述第三方应用程序的数据缓冲区中。为解决上述技术问题,本发明采用的另一个技术方案是:提供一种持久性内存的数据存储访问设备,包括:处理器、存储器以及通信电路,所述处理器分别耦接所述存储器和所述通信电路,所述存储器包括:持久性内存和动态随机存取存储器,所述处理器、所述存储器以及所述通信电路在工作时能够实现如上任一项所述方法中的步骤。为解决上述技术问题,本发明采用的另一个技术方案是:提供一种具有存储功能的装置,其上存储有程序数据,所述程序数据被处理器执行时实现如上任一项所述方法中的步骤。本发明的有益效果是:区别于现有技术的情况,本发明的持久性内存的数据存储访问方法中,文件系统包括工作在用户态的用户库和工作在内核态的内核线程,用户的第三方应用程序能够通过用户库发起访问请求,如果访问请求的操作类型是读操作,用户的第三方应用程序能够通过用户库直接访问设备的持久性内存空间,通过这种方式,能够保证持久性内存空间的读性能;如果访问请求的操作类型不是读操作例如写操作、修改操作,等等,用户的第三方应用程序能够通过用户库用户态和内核线程内核态访问设备的持久性内存空间,用户库和内核线程均处在各自正常的工作状态下,不需要切换工作状态,用户库和内核线程之间能够通信,通过这种方式,能够保证持久性内存空间的非读性能,同时,在保证持久性内存空间的非读性能的情况下,内核线程处于内核态,对于不安全的访问请求,内核线程能够拒绝,从而能够保障访问安全问题;用户库能够根据实际应用情况进行添加,能够为多核场景下的扩展能力提供技术支持。附图说明为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。其中:图1是本发明持久性内存的数据存储访问方法一实施例的流程示意图;图2是文件系统镜像一实施例的结构示意图;图3是本发明持久性内存的数据存储访问方法中文件系统一实施例的结构示意图;图4是本发明持久性内存的数据存储访问方法另一实施例的流程示意图;图5是本发明持久性内存的数据存储访问方法又一实施例的流程示意图;图6是本发明持久性内存的数据存储访问方法又一实施例的流程示意图;图7是本发明持久性内存的数据存储访问方法又一实施例的流程示意图;图8是本发明持久性内存的数据存储访问方法中范围锁一实施例的结构示意图;图9是本发明持久性内存的数据存储访问方法又一实施例的流程示意图;图10是本发明持久性内存的数据存储访问方法又一实施例的流程示意图;图11是本发明持久性内存的数据存储访问方法又一实施例的流程示意图;图12是本发明持久性内存的数据存储访问方法又一实施例的流程示意图;图13是本发明持久性内存的数据存储访问方法中无锁机制一实施例的示意图;图14是本发明持久性内存的数据存储访问设备一实施例的结构示意图;图15是本发明具有存储功能的装置一实施例的结构示意图。具体实施方式下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性的劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。在详细说明本发明之前,先简单介绍与本发明相关的现有技术情况。持久性内存PM,PersistentMemory是一种新型的具有字节寻址能力的内存级存储器件,如相变存储器PCM,PhaseChangeMemory、自旋矩存储器STT-RAM,Spin-TorqueTransferRAM、阻变存储器RRAM,ResistiveRAM以及最新推出的英特尔傲腾数据中心持久性内存IntelOptaneDCpersistentmemory等。持久性内存具有读写延迟低、带宽高、数据持久化、能耗低等特点,其不仅具有同DRAM相近的读写性能,同时又能提供类似传统磁盘等外存类似的持久性。面对高性能的存储器件以及日益兴起的多核处理器架构,构建能够充分发挥持久性内存性能的高效文件系统具有重要意义。长久以来,文件系统都作为操作系统的一部分被放置在内核中,这样可以在面对任意写操作时提供数据保护。通常,系统调用用来实现内核态和用户态之间的通信,虚拟文件系统VFS,VirtualFileSystem作为一个抽象层能够屏蔽文件系统的实现细节,从而提供统一的文件访问接口。然而,系统调用和VFS都带来了不可忽视的软件开销,而且虚拟文件系统并不能很好的支持多核环境。系统调用需要在内核态和用户态之间进行上下文切换,这个开销在持久性内存这样的高速存储设备面前变得不可忽视。在和DRAM相近的性能面前,VFS中的各种缓存机制变得不再高效,同时VFS本身的并发控制机制很难在多核环境下扩展。现有的一些设计提出,在用户态设计持久性内存文件系统,通过使用绕过操作系统的设计,达到充分利用直接访问的好处。然而,当持久性内存被导入到用户空间后,一个程序不加限制的访问很可能破坏掉整个文件系统。为了应对这个问题,一些设计提出,使用一个可信的组件来协调这些对文件系统的关键更新,但组件设计不可避免地限制多核场景下的扩展能力。单纯将文件系统完全放置于内核态或者用户态的设计,使得持久性内存的高性能和写保护变得对立而难以同时实现。在不改变已有的VFS架构的情况下,受限的可扩展能力使得在多核条件下充分利用持久性内存优异性能变得困难。本发明的持久性内存的数据存储访问方法中,文件系统包括工作在用户态的用户库和工作在内核态的内核线程,用户的第三方应用程序能够通过用户库发起访问请求,如果访问请求的操作类型是读操作,用户的第三方应用程序能够通过用户库直接访问设备的持久性内存空间,通过这种方式,能够保证持久性内存空间的读性能;如果访问请求的操作类型不是读操作例如写操作、修改操作,等等,用户的第三方应用程序能够通过用户库用户态和内核线程内核态访问设备的持久性内存空间,用户库和内核线程均处在各自正常的工作状态下,不需要切换工作状态,用户库和内核线程之间能够通信,通过这种方式,能够保证持久性内存空间的非读性能例如:写、修改,等等,同时,在保证持久性内存空间的非读性能的情况下,内核线程处于内核态,对于不安全的访问请求,内核线程能够拒绝,从而能够保障访问安全问题;用户库能够根据实际应用情况进行添加,能够为多核场景下的扩展能力提供技术支持。总之,本发明的数据访问方法中,将内核态内核线程与用户态用户库形成优势互补,合同协作,设计高效的文件系统针对持久性内存的文件系统,在利用用户态用户库直接访问优势的同时,利用内核态内核线程保障文件系统的安全性。下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。参见图1,图1是本发明持久性内存的数据存储访问方法一实施例的流程示意图,该方法包括:步骤S101:使设备中的文件系统在内核空间接收用户库的访问请求,用户库工作在用户态,访问请求是第三方应用程序通过用户库发起的,且携带操作类型。步骤S102:判断操作类型是否是读操作。步骤S103:若操作类型是读操作,则使文件系统允许第三方应用程序通过用户库直接访问设备的持久性内存空间。步骤S104:若操作类型不是读操作,则使文件系统允许第三方应用程序通过用户库和内核线程访问设备的持久性内存空间,内核线程工作在内核态。在本发明实施例中,文件系统包括用户库和内核线程,用户库工作在用户态,内核线程工作在内核态,用户库和内核线程之间能够通信。用户库的作用主要是为用户的第三方应用程序提供该文件系统的访问接口,用户库可以添加或建立,可以为不同用户的第三方应用程序分别添加或建立用户库,为多核场景下的扩展能力提供技术支持。内核线程的作用主要是负责处理用户的访问请求,维护文件系统的数据,管理持久性内存空间。用户库和内核线程之间能够通信,实现方式可以是通过传统的系统调用而连接内核态和用户态,实现内核线程与用户库之间相互通信,或者是绕过传统的系统调用而连接内核态和用户态,实现内核线程与用户库之间相互通信。用户的第三方应用程序能够通过用户库发起访问请求,如果访问请求的操作类型是读操作,用户的第三方应用程序能够通过用户库直接访问设备的持久性内存空间,通过这种方式,能够保证持久性内存空间的读性能;如果访问请求的操作类型不是读操作例如写操作、修改操作,等等,用户的第三方应用程序能够通过用户库用户态和内核线程内核态访问设备的持久性内存空间,用户库和内核线程均处在各自正常的工作状态下,不需要切换工作状态,用户库和内核线程之间能够通信,通过这种方式,能够保证持久性内存空间的非读性能例如:写、修改,等等,同时,在保证持久性内存空间的非读性能的情况下,内核线程处于内核态,对于不安全的访问请求,内核线程能够拒绝,从而能够保障访问安全问题。在一实际应用中,第三方应用程序通过链接到用户库的方式直接访问设备的持久性内存空间。在一实施例中,步骤S101之前,具体可以包括:使设备的持久性内存空间以只读模式映射到用户空间。此时,步骤S103可以是:针对读操作,使文件系统允许第三方应用程序通过用户库直接在用户空间索引文件系统镜像。只读模式是只能读取数据,不能对对数据进行写入、修改等其他非读操作。在本发明的一个实施例中,文件系统镜像为文件系统管理的数据和元数据的集合。参见图2,图2是文件系统镜像一实施例的结构示意图,文件系统管理的数据和元数据存在于两种介质:DRAM和持久性内存。其中,DRAM用于临时存放文件系统中可索引的结构化元数据,这些可索引的结构化元数据以只读模式映射到用户空间,用户库能够查询这些可索引的结构化元数据。持久性内存用于持久性地存储文件系统的数据和日志结构的元数据修改历史。其中,数据页为存储数据的固定大小的持久性内存区域,日志结构的元数据修改历史记录所修改的元数据的相关信息。在一实施例中,用户库通过共享消息池与内核线程通信;共享消息池能够绕过传统的系统调用而连接内核态和用户态,实现内核线程与用户库之间相互通信,为后续的多核场景下的扩展能力内核线程的批量处理、并发写入操作,等等进一步提供技术支持。其中,共享消息池为共享消息内存区域,共享消息内存区域由用户库和内核线程共同使用。在一应用中,共享消息池构建在DRAM中,可以通过mmap系统调用映射到用户空间。共享消息池可以划分为多个小消息区,每个消息区被一个进程独立使用,进程之间不共享各自消息区,形成相互隔离。内核态同用户态通信机制为:用户态发送请求,内核态接收请求并处理请求,最后将处理结果返回给用户态。参见图3,图3是本发明持久性内存的数据存储访问方法中文件系统一实施例的结构示意图。持久性内存是一种具有类似于DRAM的字节寻址能力同时又能提供数据持久性的新型存储系统。本发明实施例中的文件系统是构建于持久性内存上的文件系统,文件系统以持久性内存作为数据存储设备。持久性内存空间通过mmap系统调用以只读模式映射到用户空间。文件系统由两个组件组成:用户库和内核线程。用户库工作在用户态,内核线程工作在内核态。用户库向上为用户的第三方应用程序提供文件系统访问接口,向下通过共享消息池同内核线程通信。内核线程从共享消息池中接收用户访问请求,处理访问请求并将结果通过共享消息池返回给用户。参见图4,在一实施例中,内核线程批量处理的相关方法具体可以包括:步骤S201:使多个用户库通过共享消息池向内核线程发送多个不同的访问请求。步骤S202:使内核线程采用批量方式处理多个不同的访问请求,并采用批量方式增加对应的日志结构的元数据修改历史,日志结构的元数据修改历史用于记录所修改的元数据的相关信息,其保存在持久性内存空间。步骤S203:待多个不同的访问请求处理完毕后,使内核线程采用批量方式将处理结果通过共享消息池返回给用户库。其中,该方法还包括:使用户库在初始化时在共享消息池申请本进程的消息区,其中,不同进程的消息区相互隔离,各个进程只能访问本进程的消息区。用户库和内核线程通过该消息区实现通信,双方通过预先定义好的通信协议进行通信,通信时由用户库发起请求,内核线程处于轮询状态,当接到新的请求时,处理请求并将结果返回给用户库,用户库在发送完请求后,采用轮询的方式查看请求处理情况。具体地,在上述技术基础上,请参见图5,该方法还包括:步骤S301:使用户库将新消息复制到消息区,并设置请求状态字段使新消息生效。步骤S302:使内核线程以轮训的方式识别生效的新消息。步骤S303:使内核线程处理完生效的新消息后,将对应的返回信息复制到消息区,并设置消息返回值。步骤S304:使用户库以轮训的方式查询消息返回值进而获得返回信息。在一实施例中,不是读操作的操作类型是写操作和修改操作中的至少一种。当然,不是读操作的操作类型还可以包括复制操作、删除操作,等等。参见图6,当操作类型是写操作时,例如单次的写操作、写的内容少、写请求少等情形,步骤S104具体可以包括:子步骤S1041a、子步骤S1042a以及子步骤S1043a。子步骤S1041a:针对写操作,使内核线程设置内核空间中的页表的第一页表项以将相应的第一数据页置为可写,第一数据页是持久性内存空间中固定大小的内存区域。子步骤S1042a:使用户库对第一数据页完成写操作。子步骤S1043a:使内核线程重新设置第一页表项以将第一数据页置为只读。第一数据页是持久性内存空间中固定大小的内存区域,第一数据页被内核线程置为可写、被用户库完成写操作以及被内核线程重新置为只读,这三个步骤先后连贯被执行,即第一数据页不是被内核线程预先批量预留的可写的数据页。用户库与内核线程之间的通信可以是上述传统方式,也可以是上述通过共享消息池的方式。当写操作的时间较长、写的内容多、用户较多时,为了节省操作时间,也为了为并发写入提供技术基础,在一实施例中,在没有收到写操作的访问请求之前,内核线程可以预先批量预留第二数据页。即内核线程为用户库预先批量预留空闲的第二数据页,在写操作时,用户库可以使用其中一部分第二数据页,用户库可以保留尚未使用的第二数据页,以供下次写操作使用。内核线程在预先批量预留第二数据页时,同时设置第二数据页对应的页表项为“可写”状态,在用户库写操作完成后,内核线程再次操纵页表项,恢复用户库对相应区域的只读权限。具体地,该方法还可以包括:使内核线程为用户库批量预留第二数据页,并设置相关的第二页表项以将第二数据页置为可写,第二数据页是持久性内存空间中固定大小的内存区域;此时,步骤S104可以具体包括:1针对写操作,使用户库直接在预留的第二数据页中进行分配。2使用户库对分配的第二数据页完成写操作。3使内核线程重新将新写入的第二数据页的第二页表项设置为只读。第二数据页是指持久性内存空间中固定大小的内存区域,第二数据页在写操作之前被内核线程预先批量置为可写,即第二数据页是被内核线程预先批量预留为可写的数据页。用户库与内核线程之间的通信可以是上述传统方式,也可以是上述通过共享消息池的方式。在单次写操作时,用户往往只会更新文件的一个区域,文件其他区域并不会受到影响。然而,传统的文件粒度的锁会将整个文件锁住,即使两个线程写文件的不同部分,依旧不能实现并发写入。为了应对这个问题,提供更加细粒度的并发能力,用户库在用户态能够获取文件的范围锁用于对文件进行并发写入控制。此时,参见图7,步骤S104可以具体包括:子步骤S1041b:针对写操作,使用户库直接在预留的第二数据页中进行分配,并直接在用户空间获取对应的范围锁。子步骤S1042b:使用户库对分配的第二数据页完成写操作。子步骤S1043b:使内核线程重新将新写入的第二数据页的第二页表项设置为只读,并释放范围锁。图8是本发明持久性内存的数据存储访问方法中范围锁一实施例的结构示意图。范围锁包括锁状态对应图中的状态、文件偏移量对应图中的偏移、需要写入的数据量对应图中的大小、租约以及校验值。其中,锁状态字段用于标识该范围锁是否生效,用户库在获得范围锁时,锁状态为有效状态,当用户库完成写操作,该锁状态被置为无效;文件偏移量字段用于指示本次写操作所影响到的文件区域的起始偏移;需要写入的数据量字段用于标识本次写操作需要写入的数据量大小,该字段和文件偏移量字段一起,能够标识出本次写操作所影响到的文件偏移量范围;租约字段用于防止在用户出现终止但还没来得及释放范围锁时保护系统不会进入死锁状态;校验值由前面四个字段计算哈希值得出,校验值用于防止有恶意程序攻击范围锁结构。进一步,参见图9,子步骤S1042b还可以包括:子步骤S1042b1:使文件系统对每个文件分配一个锁队列。子步骤S1042b2:使发起写同一文件请求的用户库在写操作之前向前遍历锁队列中所有的写操作字段。子步骤S1042b3:判断之前已添加的所有的写操作字段是否与自身的写操作字段不同。子步骤S1042b4:若确定之前已添加的所有的写操作字段不同于自身的写操作字段,则在锁队列中添加自身的写操作字段,并使用户库对分配的第二数据页完成写操作,其中,写操作字段用于记录本次写操作所涉及到的文件偏移量的范围。子步骤S1042b5:若确定之前已添加的所有的写操作字段与自身的写操作字段存在重叠,则使用户库等待之前的写操作完成后再对分配的第二数据页完成写操作。文件系统对每个文件分配一个锁队列,具体地,锁队列被定义为一个环形缓冲区,每一个发起写同一文件请求的用户在写操作之前,需要在该锁队列中添加一个写操作字段,该写操作字段描述了写操作所影响到的文件偏移量的范围。如图8,写操作字段包括写操作的起始地址即文件偏移量字段,所写的空间大小即需要写入的数据量字段等信息。后续写同一文件请求的用户在添加写操作字段时,向前遍历锁队列中所有的写操作字段,确定之前已添加的所有的写操作字段并不会同自身的写操作字段冲突时,方可继续写操作的执行,如果有写操作字段即写范围的重叠,必须等待之前的写操作完成后方可执行。其中,当操作类型是修改操作时,步骤S104具体可以包括:针对修改操作,使用户库将修改请求发送给内核线程,并使内核线程根据修改请求进行对应的修改。其中,文件系统的数据包括可索引的结构化元数据,可索引的结构化元数据保存在动态随机存取存储器DRAM中;文件系统的数据还包括日志结构的元数据修改历史,日志结构的元数据修改历史用于记录所修改的元数据的相关信息,其保存在持久性内存空间。其中,修改操作是修改可索引的结构化元数据,参见图10,该方法还包括:步骤S401:使内核线程在修改可索引的结构化元数据时,首先将可索引的结构化元数据的修改信息增加到日志结构的元数据修改历史中。通过这种方式,能够保障即使在系统发生故障时,也能根据日志结构的元数据修改历史中的信息恢复出文件系统最新状态。步骤S402:待可索引的结构化元数据的修改信息达到持久性内存空间后,使内核线程修改DRAM中的可索引的结构化元数据。由于存在中央处理器高速缓存CPUcache,如果修改信息只达到cache,并未到达持久性内存空间,掉电后修改信息仍会丢失,通常需要人为通过缓存行逐出指令,确保修改信息确实到达持久性内存空间,这之后即便掉电修改信息也不会丢失。由于日志结构的元数据修改历史需持久化地存储于持久性内存中,这个操作会造成大量的持久化开销。考虑到将可索引的结构化元数据的修改信息增加到日志结构的元数据修改历史中所带来的性能瓶颈问题,在处理多个用户的修改操作的访问请求时,内核线程可以批量地处理多个用户的修改操作的访问请求,然后再批量地返回给多个用户。具体地,内核线程会将多个用户进行分组,批量地处理同一组内的用户的请求,然后再批量地返回给用户。具体地,同一组内的用户共享同一个请求状态结构并分别占有该结构中不同的位域,在发送请求时各用户分别设置自己的位域表明新消息产生,内核线程轮询该结构,并批量处理完所有用户请求后,批量的设置请求状态结构将结果返回给用户。在一实施例中,可索引的结构化元数据包括名字空间元数据和数据块索引元数据,名字空间元数据用于管理文件系统的名字空间,并形成文件系统的目录;该方法还包括:使内核线程通过跳表维护目录的目录项;使内核线程采用原子操作原子地修改跳表的各层节点指针。为了使用户库能够无锁的使用该目录的索引结构,而不会在内核线程更新该目录的索引结构时读到不一致的状态,本实施例使用跳表组织目录项:即同一个目录下的每个目录项维护成一个跳表,一个跳表的节点代表一个目录项,跳表的节点按照子文件名的哈希值进行排序。跳表的维护由内核线程负责,在修改跳表时,内核线程采用原子操作原子地修改各层节点的后继指针,这使得用户库能够在不加锁的情况下一致地索引该跳表。作为一个具体示例,数据块索引元数据可以采用类似Ext2的分级索引结构,分为一、二、三级索引。进一步,参见图11,该方法还包括:步骤S501:使DRAM中保存可索引的结构化元数据的区域以只读模式映射到用户空间。步骤S502:使用户库在发送修改请求之前,在用户态查询名字空间元数据中待更新目录项对应的各个跳表的节点,并将各个跳表的节点的地址信息携带在修改请求中。步骤S503:使内核线程通过修改请求中携带的地址信息快速查找需要修改的跳表的节点,并完成元数据修改操作。通过这种方式,能够减轻内核线程的压力,内核线程能够快速定位到需要修改的跳表的节点,完成元数据修改操作。在一实施例中,文件系统的数据包括可索引的结构化元数据,可索引的结构化元数据保存在动态随机存取存储器DRAM;参见图12,该方法还包括:步骤S601:使DRAM中保存可索引的结构化元数据的区域以只读模式映射到用户空间。步骤S602:针对读操作,使用户库以只读模式通过可索引的结构化元数据进行查找,并通过无锁机制将从对应数据页中读取到的数据复制到第三方应用程序的数据缓冲区中。本实施例中,为实现无锁机制读取数据,数据块索引元数据中每个索引表项通过位域复用的方式添加版本信息,在更新数据块索引时,相应的索引表项的版本信息被同时更新,通过检查版本信息,读用户能够识别出不一致状态而重新执行读操作进而保障数据一致性。在确定版本信息一致后,通过数据块索引元数据查找到每个数据页所在位置,再访问数据页将用户要读取的数据拷贝到用户的第三方应用程序的数据缓冲区中。无锁机制不需要加锁,这使得读操作能够更快地进行,同时能够避免加锁解锁操作和锁竞争在多核环境下带来的瓶颈问题,能够有效地提高系统可扩展性。图13示出了所述的无锁机制示意图。数据块索引元数据中的每个索引表项中通过位域复用的方式添加版本信息,每个索引表项的结构见图13,包括四个字段,分别是:开始标记位对应图中的开始、版本号、结束标记位对应图中的结束、一个指针结构对应图中的指针。其中,开始标记位用于标记本索引表项是否为修改本索引表项的写操作中修改的第一个索引表项,版本号用于记录修改本索引表项时用户的版本号,结束标记位用于标记本索引表项是否为修改本索引表项的写操作中修改的最后一个表项,指针结构指向数据页或者下级索引结构。以上版本信息由内核线程在更新索引表项时添加,同一写操作修改的索引表项中的版本号相同。当用户库索引该索引表项时,通过检查不同的索引表项之间的版本号以及标识的差异能够识别出这些索引表项是否处于不一致的状态。如果前后版本信息一致,读操作可以继续进行,如果不一致,读操作需要重新执行直到读到一个一致的状态。作为具体示例,以下结合图13对本发明实施例中四种无锁机制进行解释。以一个修改三个索引表项的写操作为例,三个索引表项中第一个索引表项的开始标记位和第三个索引表项的结束标记位被置位。一个读操作能够通过检查是否属于下列三种情况来判断当前是否处于一个一致的状态:1拥有同样版本号的索引表项被包括在一个开始标记位被置位的表项和一个结束标记位被置位的表项中间,这个版本对应的写操作已经完成了索引项的更新,这并不会导致不一样状态的发生。2当版本号增加时,读操作看到一个开始标记位被置位的索引表项,这说明有写操作已经覆盖了之前的写操作更新的索引表项的后半部分,这并不会导致不一样的状态。3当读操作在看到版本号减小之前看到一个结束标记位被置位的索引表项时,这说明有写操作覆盖了之前的写操作更新的索引表项的前半部分,这并不会导致不一样的状态。如果读操作遇到的不是上述三种情况之一,说明读操作已经看到了不一致的状态,读操作需要通过重新收集索引表项的方式来重新进读操作,重试读操作有可能发生多次,直到读操作读到一致的状态后才能继续往下进行。参见图14,图14是本发明持久性内存的数据存储访问设备一实施例的结构示意图,该设备包括:处理器1、存储器2以及通信电路3,处理器1分别耦接存储器2和通信电路3,存储器2包括:持久性内存21和动态随机存取存储器22,处理器1、存储器2以及通信电路3在工作时能够实现如上任一项方法中的步骤。相关内容的详细说明请参见上述方法部分,在此不再赘叙。参见图15,图15是本发明具有存储功能的装置一实施例的结构示意图,该装置100上存储有程序数据200,程序数据200被处理器执行时实现如上任一项方法中的步骤。相关内容的详细说明请参见上述方法部分,在此不再赘叙。需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质如ROMRAM、磁碟、光盘中,包括若干指令用以使得一台终端设备可以是手机,计算机,服务器,空调器,或者网络设备等执行本发明各个实施例所述的方法。以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

权利要求:1.一种持久性内存的数据存储访问方法,其特征在于,包括:使设备中的文件系统在内核空间接收用户库的访问请求,所述用户库工作在用户态,所述访问请求是第三方应用程序通过所述用户库发起的,且携带操作类型;若所述操作类型是读操作,则使所述文件系统允许所述第三方应用程序通过所述用户库直接访问所述设备的持久性内存空间;若所述操作类型不是读操作,则使所述文件系统允许所述第三方应用程序通过所述用户库和内核线程访问所述设备的持久性内存空间,所述内核线程工作在内核态。2.根据权利要求1所述的方法,其特征在于,所述使设备中的文件系统在内核空间接收用户库的访问请求之前,包括:使所述设备的持久性内存空间以只读模式映射到用户空间。3.根据权利要求2所述的方法,其特征在于,所述若所述操作类型是读操作,则使所述文件系统允许所述第三方应用程序通过所述用户库直接访问所述设备的持久性内存空间,包括:针对所述读操作,使所述文件系统允许所述第三方应用程序通过所述用户库直接在所述用户空间索引文件系统镜像。4.根据权利要求1所述的方法,其特征在于,所述用户库通过共享消息池与所述内核线程通信;所述共享消息池为共享消息内存区域,所述共享消息内存区域由所述用户库和所述内核线程共同使用。5.根据权利要求4所述的方法,其特征在于,所述方法还包括:使多个所述用户库通过所述共享消息池向所述内核线程发送多个不同的所述访问请求;使所述内核线程采用批量方式处理多个不同的所述访问请求,并采用批量方式增加对应的日志结构的元数据修改历史,所述日志结构的元数据修改历史用于记录所修改的元数据的相关信息,其保存在所述持久性内存空间;待多个不同的所述访问请求处理完毕后,使所述内核线程采用批量方式将处理结果通过所述共享消息池返回给所述用户库。6.根据权利要求4所述的方法,其特征在于,所述方法还包括:使所述用户库在初始化时在所述共享消息池申请本进程的消息区,其中,不同进程的消息区相互隔离,各个进程只能访问本进程的消息区;使所述用户库将新消息复制到所述消息区,并设置请求状态字段使所述新消息生效;使所述内核线程以轮训的方式识别生效的新消息;使所述内核线程处理完生效的新消息后,将对应的返回信息复制到所述消息区,并设置消息返回值;使所述用户库以轮训的方式查询所述消息返回值进而获得所述返回信息。7.根据权利要求1所述的方法,其特征在于,不是读操作的操作类型是写操作和修改操作中的至少一种。8.根据权利要求7所述的方法,其特征在于,所述若所述操作类型不是读操作,则使所述文件系统允许所述第三方应用程序通过所述用户库和内核线程访问所述设备的持久性内存空间,包括:针对所述写操作,使所述内核线程设置内核空间中的页表的第一页表项以将相应的第一数据页置为可写,所述第一数据页是所述持久性内存空间中固定大小的内存区域;使所述用户库对所述第一数据页完成写操作;使所述内核线程重新设置所述第一页表项以将所述第一数据页置为只读。9.根据权利要求7所述的方法,其特征在于,所述方法还包括:使所述内核线程为所述用户库批量预留第二数据页,并设置相关的第二页表项以将所述第二数据页置为可写,所述第二数据页是所述持久性内存空间中固定大小的内存区域;其中,所述若所述操作类型不是读操作,则使所述文件系统允许所述第三方应用程序通过所述用户库和内核线程访问所述设备的持久性内存空间,包括:针对所述写操作,使所述用户库直接在预留的第二数据页中进行分配,并直接在所述用户空间获取对应的范围锁;使所述用户库对分配的第二数据页完成写操作;使所述内核线程重新将新写入的第二数据页的第二页表项设置为只读,并释放所述范围锁。10.根据权利要求9所述的方法、其特征在于,所述范围锁能够支持同一文件内的并发写操作;所述使所述用户库对分配的第二数据页完成写操作,包括:使所述文件系统对每个文件分配一个锁队列;使发起写同一文件请求的用户库在写操作之前向前遍历所述锁队列中所有的写操作字段;若确定之前已添加的所有的写操作字段不同于自身的写操作字段,则在所述锁队列中添加自身的写操作字段,并使所述用户库对分配的第二数据页完成写操作,其中,所述写操作字段用于记录本次写操作所涉及到的文件偏移量的范围;若确定之前已添加的所有的写操作字段与自身的写操作字段存在重叠,则使所述用户库等待之前的写操作完成后再对分配的第二数据页完成写操作。11.根据权利要求5所述的方法,其特征在于,所述若所述操作类型不是读操作,则使所述文件系统允许所述第三方应用程序通过所述用户库和内核线程访问所述设备的持久性内存空间,包括:针对所述修改操作,使所述用户库将修改请求发送给所述内核线程,并使所述内核线程根据所述修改请求进行对应的修改。12.根据权利要求11所述的方法、其特征在于,所述文件系统的数据包括可索引的结构化元数据,所述可索引的结构化元数据保存在动态随机存取存储器DRAM中;所述文件系统的数据还包括日志结构的元数据修改历史,所述日志结构的元数据修改历史用于记录所修改的元数据的相关信息,其保存在所述持久性内存空间;所述修改操作是修改所述可索引的结构化元数据,所述方法还包括:使所述内核线程在修改所述可索引的结构化元数据时,首先将所述可索引的结构化元数据的修改信息增加到所述日志结构的元数据修改历史中;待所述可索引的结构化元数据的修改信息到达所述持久性内存空间后,使所述内核线程修改所述DRAM中的可索引的结构化元数据。13.根据权利要求12所述的方法,其特征在于,所述可索引的结构化元数据包括名字空间元数据和数据块索引元数据,所述名字空间元数据用于管理所述文件系统的名字空间,并形成所述文件系统的目录;所述方法还包括:使所述内核线程通过跳表维护所述目录的目录项;使所述内核线程采用原子操作原子地修改所述跳表的各层节点指针。14.根据权利要求13所述的方法,其特征在于,所述方法还包括:使所述DRAM中保存所述可索引的结构化元数据的区域以只读模式映射到用户空间;使所述用户库在发送修改请求之前,在用户态查询所述名字空间元数据中待更新目录项对应的各个跳表的节点,并将各个跳表的节点的地址信息携带在所述修改请求中;使所述内核线程通过所述修改请求中携带的所述地址信息快速查找需要修改的跳表的节点,并完成元数据修改操作。15.根据权利要求1所述的方法,其特征在于,所述文件系统的元数据包括可索引的结构化元数据,所述可索引的结构化元数据保存在动态随机存取存储器DRAM;所述方法还包括:使所述DRAM中保存所述可索引的结构化元数据的区域以只读模式映射到用户空间;针对所述读操作,使所述用户库以只读模式通过所述可索引的结构化元数据进行查找,并通过无锁机制将从对应数据页中读取到的数据复制到所述第三方应用程序的数据缓冲区中。16.一种持久性内存的数据存储访问设备,其特征在于,包括:处理器、存储器以及通信电路,所述处理器分别耦接所述存储器和所述通信电路,所述存储器包括:持久性内存和动态随机存取存储器,所述处理器、所述存储器以及所述通信电路在工作时能够实现如权利要求1-15任一项所述方法中的步骤。17.一种具有存储功能的装置,其上存储有程序数据,其特征在于,所述程序数据被处理器执行时实现权利要求1-15任一项所述方法中的步骤。

百度查询: 清华大学 持久性内存的数据存储访问方法、设备及装置

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。