CN113282407B - 基于持久性内存的用户层异步io方法与系统 - Google Patents
基于持久性内存的用户层异步io方法与系统 Download PDFInfo
- Publication number
- CN113282407B CN113282407B CN202110494879.XA CN202110494879A CN113282407B CN 113282407 B CN113282407 B CN 113282407B CN 202110494879 A CN202110494879 A CN 202110494879A CN 113282407 B CN113282407 B CN 113282407B
- Authority
- CN
- China
- Prior art keywords
- request
- read
- fiber
- layer
- user
- 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/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/505—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the load
-
- 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
本发明公开了基于持久性内存的用户层异步IO方法与系统,方法包括:应用程序发起读I/O请求;通过用户级ucontext纤程对所述读I/O请求进行第一处理后,将所述读I/O请求传入内核层进行第二处理;由所述内核层对所述读I/O请求进行第三处理后,将所述读I/O请求发送至硬件层进行第四处理;根据所述读I/O请求,通过所述硬件层的读操作获取文件数据。本发明能够降低开销成本并提高吞吐量,兼容性好且延迟低,可广泛应用于计算机技术领域。
Description
技术领域
本发明涉及计算机技术领域,尤其是基于持久性内存的用户层异步IO方法与系统。
背景技术
新型硬件技术持久性内存(PM,Persistent Memory)是近十年来研究者的研究热点,例如相变存储器(PCM,phase change memory)、自旋转移转矩磁阻存储器(STT-MRAM)、非易失性双列直插式内存模块(NVDIMM,Non-volatile dual in-line memory module)、傲腾内存(Intel Optane Memory)等。持久性内存技术凭借独特的字节可寻址特性、接近DRAM的延迟、非易失性等特点对传统操作系统的I/O子系统产生了巨大的影响。传统的文件系统不再适合持久性内存设备,而如何为持久性内存设备提供定制型文件系统,充分发挥其字节可寻址特性,减缓文件系统带来的软件开销成为当下研究的重点及难点。
在持久性内存的浪潮下,应用程序可以直接通过CPU的load/store指令直接访问非易失性数据,绕过Page Cache和块层,减少软件层面的开销。通过将PM与传统DRAM一起置于内存总线上,形成混合内存架构,可以缓解当前DRAM无法满足高性能系统对存储性能、能耗等方面的需求。在混合架构的应用程序直接访问(APP Direct)模式下,特殊的应用程序以及操作系统可以精准识别持久性内存以及传统DRAM,在合适的场景选择恰当的内存访问方式。当系统有数据持久性和内存扩充需求时,可以显式地选择持久性内存,保证数据的非易失性;当系统需要低延迟访问数据以及数据仅具有暂时性存储需求时,即可利用传统的DRAM内存设备进行存储。
在PM系统上,访问其内部的非易失性数据通常有两种方式:非文件系统方式以及文件系统方式。常见的非文件系统访问方式,即PMDK机制。PMDK通过利用libpmem等用户库在PM设备上进行数据操作,比如:创建、读写、访问控制和删除等。此方式性能显著,因为其不仅避免了传统文件系统读写数据时需要进行的多次内核态和用户态之间的切换,还可以通过单指令多数据拷贝方式代替传统DMA拷贝,不经过CPU Cache中转。虽然PMDK技术建立在用户层,但是其基于外部程序库的访问方式却是其设计缺点:因为在用户使用过程中,程序需要调用其特有的接口以达到访问PM数据的效果,所以,需要修改现有的应用程序,存在技术门槛。而且,PMDK需要建立在支持DAX(Direct Access)特性的文件系统中。其虽然搭建在用户层,但适用场景却依然离不开特定文件系统,因此可移植性能差。
与非文件系统访问方式相反,当用户使用文件系统方式进行文件读写操作时,应用程序直接通过标准的POSIX接口就可以访问PM设备,不需要修改应用程序的原有接口。并且,和传统基于外存设备的文件系统相比,优化了读写粒度(字节可寻址,而不是传统的块寻址),显著提升了读写性能。
基于文件系统访问PM设备的方式可分为同步与异步两种。在同步方式中,进程在对文件进行读写操作后,就会进入到等待状态,直到相应的内存拷贝操作完成之后才能够继续执行,要么从PM拷贝至DRAM,要么从DRAM拷贝至PM。例如,得克萨斯大学奥斯汀分校提出的名为SplitFS的系统,即可以通过将数据流和控制流进行分割的方式为持久性内存提供高性能的服务。在读写操作中,SplitFS拦截read()、write()系统调用,并利用mmap内存映射机制进行优化,来实现读写PM设备的基本操作并提升其性能。SplitFS同步访问PM设备的方式也存在着一些缺陷:(1)读写操作的数据量受到内存映射机制限制。当数据量远远小于内存映射区域,就会造成内存空间浪费。同时,由于建立的内存映射区域不能改变大小,此同步方式对变长文件不适合。(2)利用Pthread线程库,虽然也可以实现异步效果,但是当多个进程对同一文件进行映射进行共享访问时,存在安全隐患,而且每次的修改操作也会带来不小的CPU开销。
在异步方式中,基于文件系统访问PM设备的方法大致分为两类:一是搭建在用户层的异步I/O,例如Glibc库的Glibc AIO;二是搭建在内核层的异步I/O,例如异步I/O与直接I/O相结合的Linux Kernel AIO、基于PMFS设计的搭建了真正异步路径的PM-AIO以及Linux Kernel在v5.1版本引入的IO_uring。在以上的异步I/O中,仅有PM-AIO是针对PM设备设计的访问方式,专门用于PM文件系统的异步方式。Glibc AIO、Linux Kernel AIO以及IO_uring此三种异步I/O虽然都可以在PM设备上正常运行,但是由于其设计针对的是常见文件系统,例如Ext4,因此存在不适用性,无法发挥应用性能水平。后面,将进行具体分析和介绍。
在用户层搭建的异步I/O有以下两个优势:(1)兼容性好,性能稳定。在用户层支持POSIX标准,可以实现跨文件系统兼容,移植性强。因此,此方式可以较好的兼容PM文件系统。同时,此方式对编程开发人员具有友好性。基于此类异步I/O,开发人员可以通过调用库函数进行二次开发,以此适应不同的应用场景;(2)设计简洁。相比较在内核层搭建的PM-AIO、Linux Kernel AIO、IO_uring来说,内核I/O栈会带来大量系统软件开销、内核线程负责I/O请求会使整体设计过于复杂化,也给内核线程的维护带来严峻挑战。但是用户层的实现却可以保持内核的简洁,避免复杂I/O栈,同时不占用内核资源。用户层的线程I/O可以和其他进程、线程进行统一调度,不会对系统的其他部分造成影响,保证内核层的数据安全性。但是搭建在用户层的Glibc AIO(又名POSIX-AIO)也存在不少缺陷。例如,其通过Pthread线程库(遵照POSIX标准的一套线程接口)多线程的异步方式实现。在主流操作系统中,用户态线程和内核态线程往往采用一对一的映射关系,因此,当Pthread线程库创建大量线程时,线程间切换的开销增大会导致程序和系统的性能严重降低。而且,还存在着创建、切换、销毁线程的CPU开销。此外,提交I/O操作时需要频繁地切换到内核并返回,带来不小的性能损耗和切换开销。最后,多线程之间的同步和加锁控制也为编程开发带来了不小的挑战。一个线程的崩溃也可能会影响到整个程序的稳定性。
另外一个方面,在内核层搭建异步I/O的优势在于用户持有底层细节,可以充分利用内核资源设计高性能、拓展性强的I/O接口。通过利用内存映射区域还可以进一步帮助用户与底层进行数据交互。其中IO_uring的批量提交接口设计简洁,传递参数结构更为精简,系统调用次数也大幅度减少。但是便利的数据交互背后却带来较为严重的安全、隐私问题。其中,PM-AIO是针对PM文件系统PMFS设计,仅可以使用O_DIRECT无缓冲方式访问文件。当用户不使用此标志位时,将会通过同步方式进行数据访问,性能大幅度降低。另外,此方式大量使用了内核线程,对内核资源的利用存在不合理问题。当Linux Kernel AIO、IO_uring运行在PM文件系统时,异步I/O路径是伪异步方式,实质上却为同步方式。此设计缺陷较为严重地影响PM文件读写性能。
总而言之,在用户层建立异步机制虽然可以较好地兼容PM文件系统。但是会加重用户层负担,带来一定的性能损耗,也无法更好地与底层交互利用资源。例如,用户层异步机制通常使用线程来实现异步方式。而线程模型在主流系统里,用户线程与内核线程都是一比一的映射关系。当用户层创建了一个线程,内核层也要创建内核线程与之相对应。内核线程的过度使用会对内核施加不利影响,开销较大。除此以外,现有的用户层异步方式POSIX-AIO无法批量提交I/O请求,因而会频繁地在用户态与内核态之间产生切换,带来大量CPU开销。而在内核层建立异步机制需要针对特定的PM文件系统进行一定程度的修改,以便充分发挥PM设备应有性能。但是这种完全基于内核层的设计,会给内核I/O栈带来不容忽视的软件开销和工程开销,亦无法保证安全性、隐私性,也即用户持有更多底层细节,操作不当就会对内核造成无法修复性的破坏。
发明内容
有鉴于此,本发明实施例提供基于一种兼容性好、开销低、低延迟且高吞吐量的持久性内存的用户层异步IO方法与系统。
本发明的一方面提供了一种基于持久性内存的用户层异步IO方法,包括:
应用程序发起读I/O请求;
通过用户级ucontext纤程对所述读I/O请求进行第一处理后,将所述读I/O请求传入内核层进行第二处理;
由所述内核层对所述读I/O请求进行第三处理后,将所述读I/O请求发送至硬件层进行第四处理;
根据所述读I/O请求,通过所述硬件层的读操作获取文件数据;
其中,所述读I/O请求包括单个I/O请求或批量I/O请求。
可选地,所述应用程序发起读I/O请求,包括:
应用程序发起读I/O请求;
在用户层中计算所述读I/O请求的优先级,并为所述读I/O请求分配I/O请求结构体;
根据I/O请求表确定所述读I/O请求的插入位置以及所述读I/O请求的待分配纤程;
根据所述读I/O请求的优先级,将所述读I/O请求插入到所述I/O请求表中;
确定所述I/O请求表的待处理纤程。
可选地,所述通过用户级ucontext纤程对所述读I/O请求进行第一处理后,将所述读I/O请求传入内核层进行第二处理,包括:
通过用户级ucontext纤程对所述读I/O请求进行处理;
将所述I/O请求结构体从aiocb结构体转换为iov结构体;
在SQ提交队列中填充所述读I/O请求,并确定地址引用机制;
等待预设时长并确定完成所有I/O请求的接收后,通过IO_uring系统调用函数io_uring_enter将所述读I/O请求传入内核层进行处理。
可选地,所述由所述内核层对所述读I/O请求进行第三处理后,将所述读I/O请求发送至硬件层进行第四处理,包括:
所述IO_uring系统通过mmap函数设置环形缓冲区,所述内核层将所述SQ提交队列中的读I/O请求提交至硬件层;所述mmap函数用于实现用户层与内核层之间的数据共享。
可选地,所述根据所述读I/O请求,通过所述硬件层的读操作获取文件数据,包括:
所述硬件层通过读操作获取文件数据;
对所述文件数据进行内存拷贝后,将所述文件数据填充至CQ队列;
根据所述地址引用机制,将所述CQ队列中的返回数据刷新至aiocb结构体。
可选地,所述方法还包括配置API接口的步骤,其中所述API接口包括:
aio_read(),用于请求异步I/O读操作;
aio_write(),用于请求异步I/O写操作;
aio_error(),用于检查异步I/O请求的状态;
aio_return(),用于将获得完成的异步I/O请求的返回状态;
lio_listio(),用于发起一系列I/O操作;
所述aio_read()和aio_write()用于对单个I/O请求进行处理;
所述lio_listio()用于对批量I/O请求进行处理。
可选地,所述方法还包括组织I/O请求表的步骤,该步骤包括:
在用户层设置资源池,所述资源池用于供I/O请求使用;
从所述资源池中提取多个节点,并根据双向链表将所述多个节点组成I/O请求表;
计算每个I/O请求的优先级;
在所述I/O请求表中查询目标插入列,通过I/O请求的文件描述符来判断I/O请求是否被执行,对于未被执行的I/O请求,在所述I/O请求表中新建待处理列来处理所述文件描述符对应的I/O请求。
可选地,所述方法还包括:
根据纤程搭建用户级纤程库和纤程池;
其中,所述纤程池的架构包括纤程池状态信息、任务队列信息、多纤程互斥锁以及函数指针;
所述纤程池状态信息用于描述当前纤程池的基本信息,所述基本信息包括是否开启纤程、开启纤程数量、最大纤程数、最小纤程数、存活纤程数、忙纤程数以及待销毁纤程数;
所述任务队列信息,用于描述当前任务队列的基本信息、任务最大数量以及队列是否为空条件变量;
所述多纤程互斥锁,用于保证在同一时间点上只有一个纤程在任务队列中取任务并修改任务队列信息或修改纤程池信息;
所述函数指针,用于在打包消息阶段,将分类后的消息处理函数放在类型参数中,以传递消息处理函数需要的信息。
可选地,所述方法还包括以下至少之一:
用户程序可通过aio_error()函数判断I/O请求运行的阶段;
I/O请求提交处理步骤;
I/O请求返回步骤;
批量I/O请求处理步骤;
崩溃恢复一致性保证步骤。
本发明实施例的另一方面提供了一种基于持久性内存的用户层异步IO系统,包括应用程序、用户层、内核层、硬件层;
其中,所述应用程序,用于发起读I/O请求;
所述用户层,用于通过用户级ucontext纤程对所述读I/O请求进行第一处理后,将所述读I/O请求传入内核层进行第二处理;
所述内核层,用于对所述读I/O请求进行第三处理后,将所述读I/O请求发送至硬件层进行第四处理;
所述硬件层,用于根据所述读I/O请求,通过所述硬件层的读操作获取文件数据;
其中,所述读I/O请求包括单个I/O请求或批量I/O请求。
本发明实施例还公开了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器可以从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行前面的方法。
本发明的实施例由应用程序发起读I/O请求;通过用户级ucontext纤程对所述读I/O请求进行第一处理后,将所述读I/O请求传入内核层进行第二处理;由所述内核层对所述读I/O请求进行第三处理后,将所述读I/O请求发送至硬件层进行第四处理;根据所述读I/O请求,通过所述硬件层的读操作获取文件数据;其中,所述读I/O请求包括单个I/O请求或批量I/O请求。本发明能够降低开销成本并提高吞吐量,兼容性好且延迟低。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的I/O组织表的示意图;
图2为本发明实施例提供的I/O请求表的具体组织过程示意图;
图3为本发明实施例提供的用户层准备I/O请求的流程图;
图4为本发明实施例提供的用户层处理I/O请求的流程图;
图5为本发明实施例提供的内核层处理I/O请求的流程图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
针对现有技术存在的问题,本发明实施例提供了一种基于持久性内存的用户层异步IO方法,包括:
应用程序发起读I/O请求;
通过用户级ucontext纤程对所述读I/O请求进行第一处理后,将所述读I/O请求传入内核层进行第二处理;
由所述内核层对所述读I/O请求进行第三处理后,将所述读I/O请求发送至硬件层进行第四处理;
根据所述读I/O请求,通过所述硬件层的读操作获取文件数据;
其中,所述读I/O请求包括单个I/O请求或批量I/O请求。
可选地,所述应用程序发起读I/O请求,包括:
应用程序发起读I/O请求;
在用户层中计算所述读I/O请求的优先级,并为所述读I/O请求分配I/O请求结构体;
根据I/O请求表确定所述读I/O请求的插入位置以及所述读I/O请求的待分配纤程;
根据所述读I/O请求的优先级,将所述读I/O请求插入到所述I/O请求表中;
确定所述I/O请求表的待处理纤程。
可选地,所述通过用户级ucontext纤程对所述读I/O请求进行第一处理后,将所述读I/O请求传入内核层进行第二处理,包括:
通过用户级ucontext纤程对所述读I/O请求进行处理;
将所述I/O请求结构体从aiocb结构体转换为iov结构体;
在SQ提交队列中填充所述读I/O请求,并确定地址引用机制;
等待预设时长并确定完成所有I/O请求的接收后,通过IO_uring系统调用函数io_uring_enter将所述读I/O请求传入内核层进行处理。
可选地,所述由所述内核层对所述读I/O请求进行第三处理后,将所述读I/O请求发送至硬件层进行第四处理,包括:
所述IO_uring系统通过mmap函数设置环形缓冲区,所述内核层将所述SQ提交队列中的读I/O请求提交至硬件层;所述mmap函数用于实现用户层与内核层之间的数据共享。
可选地,所述根据所述读I/O请求,通过所述硬件层的读操作获取文件数据,包括:
所述硬件层通过读操作获取文件数据;
对所述文件数据进行内存拷贝后,将所述文件数据填充至CQ队列;
根据所述地址引用机制,将所述CQ队列中的返回数据刷新至aiocb结构体。
可选地,所述方法还包括配置API接口的步骤,其中所述API接口包括:
aio_read(),用于请求异步I/O读操作;
aio_write(),用于请求异步I/O写操作;
aio_error(),用于检查异步I/O请求的状态;
aio_return(),用于将获得完成的异步I/O请求的返回状态;
lio_listio(),用于发起一系列I/O操作;
所述aio_read()和aio_write()用于对单个I/O请求进行处理;
所述lio_listio()用于对批量I/O请求进行处理。
可选地,所述方法还包括组织I/O请求表的步骤,该步骤包括:
在用户层设置资源池,所述资源池用于供I/O请求使用;
从所述资源池中提取多个节点,并根据双向链表将所述多个节点组成I/O请求表;
计算每个I/O请求的优先级;
在所述I/O请求表中查询目标插入列,通过I/O请求的文件描述符来判断I/O请求是否被执行,对于未被执行的I/O请求,在所述I/O请求表中新建待处理列来处理所述文件描述符对应的I/O请求。
可选地,所述方法还包括:
根据纤程搭建用户级纤程库和纤程池;
其中,所述纤程池的架构包括纤程池状态信息、任务队列信息、多纤程互斥锁以及函数指针;
所述纤程池状态信息用于描述当前纤程池的基本信息,所述基本信息包括是否开启纤程、开启纤程数量、最大纤程数、最小纤程数、存活纤程数、忙纤程数以及待销毁纤程数;
所述任务队列信息,用于描述当前任务队列的基本信息、任务最大数量以及队列是否为空条件变量;
所述多纤程互斥锁,用于保证在同一时间点上只有一个纤程在任务队列中取任务并修改任务队列信息或修改纤程池信息;
所述函数指针,用于在打包消息阶段,将分类后的消息处理函数放在类型参数中,以传递消息处理函数需要的信息。
可选地,所述方法还包括以下至少之一:
用户程序可通过aio_error()函数判断I/O请求运行的阶段;
I/O请求提交处理步骤;
I/O请求返回步骤;
批量I/O请求处理步骤;
崩溃恢复一致性保证步骤。
本发明实施例的另一方面提供了一种基于持久性内存的用户层异步IO系统,包括应用程序、用户层、内核层、硬件层;
其中,所述应用程序,用于发起读I/O请求;
所述用户层,用于通过用户级ucontext纤程对所述读I/O请求进行第一处理后,将所述读I/O请求传入内核层进行第二处理;
所述内核层,用于对所述读I/O请求进行第三处理后,将所述读I/O请求发送至硬件层进行第四处理;
所述硬件层,用于根据所述读I/O请求,通过所述硬件层的读操作获取文件数据;
其中,所述读I/O请求包括单个I/O请求或批量I/O请求。
本发明实施例还公开了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器可以从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行前面的方法。
下面结合说明书附图,对本发明的实现过程进行详细描述:
需要说明的是,持久性内存PM(Persistent Memory)也是非易失存储器NVM的一种,具备非易失内存的特性,例如,非易失性、字节可寻址性、延迟性能接近DRAM。应用程序也可以通过CPU的load/store指令直接访问PM设备的数据。英特尔傲腾持久内存(IntelOptane DC Memory Module)就是PM设备的一种,其有两种操作模式:内存模式(MemoryMode)以及应用程序直接访问模式(APP Direct Mode)。在内存模式下,Intel Optane DCMemory可作为DRAM的替代品,或者将二者组合以混合方式插入到内存槽中,带来速度性能上的提升。在APP Direct模式下,当系统需要数据持久性以及有较大内存需求时,可以使用持久性内存,保证数据的非易失性;当系统需要低延迟以及数据只是暂时存储时,即利用传统的DRAM进行存储。
本发明基于PM设备的APP Direct Mode搭建专用于PM文件系统的轻量级异步I/O。本发明基于较新的持久性内存文件系统SplitFS,但是同样兼容于其他PM文件系统。并且,在用户空间支持POSIX标准,创新性地使用纤程ucontext机制,沿用POSIX-AIO的异步接口实现I/O接口的用户层异步方式。在用户层和内核层的交界处,通过调用优化好的IO_uring底层系统调用,批量提交I/O请求,实现了I/O接口的内核层异步。IO_uring批量提交接口设计简洁,参数结构更为精简,本专利充分发挥其优势进一步提升异步I/O性能。通过用户层、内核层的双层异步方式保证新的异步I/O接口的低延迟性、可拓展性以及高吞吐量。本发明的方案主要分成三个部分,第一部分是本发明的总体技术方案的具体过程描述,第二部分是一个I/O请求生命周期,第三部分是本发明的实现平台及依赖。
本发明的总体技术方案包括主要包括五个部分:1、API接口。2、用户层异步机制。3、内核层异步机制。4、批量I/O请求处理机制。5、崩溃恢复一致性保证。
1.API接口
本发明在用户空间沿用了POSIX标准,接口依旧保留了部分POSIX-AIO原生API接口,方便兼容传统应用程序,降低使用门槛。API接口的相关接口说明如表1所示:
表1
保留部分POSIX-AIO API接口 | 说明 |
aio_read() | 请求异步I/O读操作 |
aio_write() | 请求异步I/O写操作 |
aio_error() | 检查异步I/O请求的状态 |
aio_return() | 将获得完成的异步I/O请求的返回状态 |
lio_listio() | 发起一系列I/O操作 |
2.用户层异步机制
2.1、I/O请求表、I/O请求结构体
在用户发起I/O请求时,可以发起单个I/O请求,也可以发起批量I/O请求。单个I/O请求可通过aio_read()/aio_write()函数进行处理,批量I/O请求则可以通过lio_listio()函数进行处理。二者采用的组织形式不同,但算法原理相同。以下先对单个I/O请求处理方式进行具体阐述。每个请求通过aio_read()/aio_write()函数进入时,都会被组织进I/O请求表中,如图1所示。该I/O请求表是通过各个I/O请求节点插入生成的。每个节点的结构沿用了POSIX-AIO标准,包括运行状态running,用以判断该节点当前状态(每个节点代表提交的一个读写请求);上一个/下一个文件描述符节点last_fd/next_fd指针,用于构建双向链表;优先级next_prio指针,用于构建优先级序列的单向链表;下一运行节点next_run指针、以及aiocb结构体。其中aiocb结构体用以描述I/O请求,如表2所示:
表2
2.2、组织I/O请求算法
I/O请求表的具体组织过程如图2所示,算法如下:
首先,在用户层设置了资源池供每个I/O请求使用,使用后还会进行相应回收。从资源池中提取出的每个节点通过双向链表组成了I/O请求表。当大量I/O请求涌入而发生资源短缺时,资源池也会进行主动扩充,满足大量的异步I/O请求提交。
然后,计算优先级。每个I/O请求都会有一个优先级,优先级的范围在0-20之间。prio指的是该请求最后计算出的优先级。这也是该异步I/O的一项优势,既能利用优先级保证执行顺序,又可以不使用优先级。
接下来,通过while循环在I/O请求表中找到合适的插入列,但是此时并不插入。通过判断该请求的文件描述符fd对应的其他I/O请求是否正在被执行,如果正在执行,说明该列请求已被分配I/O纤程进行处理;如果未被执行,则要在I/O请求表中新建一列用以处理该文件描述符对应的一系列请求,并为其配纤程来处理。伪代码如表3所示:
表3
2.3、纤程机制
本发明创新性地在用户层通过纤程技术来实现真正的异步效果。通过引入纤程机制,每一列I/O请求都会被分配一个纤程进行执行处理。每列I/O请求,即表示拥有同一文件描述符的I/O请求。接下来,创建纤程以及进行初始化。纤程需被分配优先级,为调度做准备。在系统中也可以设置纤程的调度策略。当该纤程执行完其负责的某一文件描述符的全部I/O请求时,如无需使用该纤程执行其他I/O请求,就对纤程进行回收或者销毁,保证内存资源的不浪费。
为了进一步实现轻量级异步I/O,本发明利用纤程(POSIX标准下的纤程上下文一般用ucontext叫法)搭建了用户级纤程库uthread。另外,在此引入了纤程池机制。在系统启动时,会创建相应数量的空闲纤程,接下来程序将任务传给纤程池,纤程池启动纤程来执行任务,在执行结束后,该纤程在短时间不会被销毁,可以再次返回纤程池成为空闲纤程,等待后续任务的分配。
纤程池算法如下:在执行过程中,程序将任务提交给整个纤程池,在纤程池拿到任务后,就在池中寻找是否有空闲的纤程,如果有空闲线程,则将该任务交给其进行处理。使用纤程池机制,可以保证用户层异步机制不用耗费时间用于纤程的创建、销毁以及频繁的切换开销。与此同时,纤程的安全性能也得到了进一步提升。
纤程池架构如下:1、纤程池状态信息。包括描述当前纤程池的基本信息:是否开启纤程、开启纤程数量、最大纤程数、最小纤程数、存活纤程数、忙纤程数、待销毁纤程数等;2、任务队列信息。描述当前任务队列的基本信息,任务最大数量、队列是否为空条件变量等;3、多纤程互斥锁:保证在同一时间点上只有一个纤程在任务队列中取任务并修改任务队列信息、修改纤程池信息;4、函数指针:在打包消息阶段,将分类后的消息处理函数放在(*function);void*类型参数:用于传递消息处理函数需要的信息。表4为纤程池基本信息表,如表4所示,详细描述了本发明实施例的纤程池基本信息。
表4
threadpool_t | 说明 |
lock | 纤程池互斥锁 |
threads | 存放纤程的tid |
task_queue | 任务队列 |
min_uthr_num | 纤程池中最小纤程数 |
max_uthr_num | 纤程池中最大纤程数 |
wait_exit_thr_num | 需要销毁的纤程数 |
queue_front | 任务队列队头 |
queue_rear | 任务队列队尾 |
queue_size | 任务队列长度 |
queue_max_size | 任务队列能容纳的最大任务数 |
本发明实施例的创建纤程伪代码如表5所示:
表5
3.内核层异步机制
3.1 I/O请求提交处理
本发明沿用了POSIX-AIO的处理I/O请求的aio_read()/aio_write()接口,但对内部实际过程进行了重写。首先将传入参数,即指针arg指向的具体地址赋值给runp,runp也是每个I/O请求的封装。接下来整体结构应用到了两个do while循环结构,来保证按I/O请求表整理接下来的I/O请求。其中巧妙的利用到了IO_uring系统的四个阶段:(1)准备阶段。为了保证最大限度利用提交性能,我们为每次提交都设置了不大于128个I/O请求的(<=128)的提交限制。因此,准备的I/O请求结构体、转换体、I/O请求事件结构体都是以128个I/O请求为一个单位。(2)提交阶段。我们通过do while循环整理好一个批次的提交量。此种方式有利用用户层与内核层的良好交互,避免了频繁的上下文切换开销。(3)获取返回事件阶段。通过返回事件带回填充好的返回数组,此种方式交互性强,性能好,避免了单独返回所带来的算法开销。(4)销毁,释放资源。除此以外,在该算法中,纤程还进行了等待以及复用。如果该纤程执行完此文件描述符对应的I/O请求时,还有剩余时间,可以稍加等待是否还会有请求到达,也可申请处理其他文件描述符的I/O请求。
本发明实施例的handle_fildes_io处理I/O请求算法如表6所示:
表6
3.2、I/O请求返回机制
本发明在前期,需要对单个I/O请求进行组织、转换并批量提交,但是在后期返回后仍需对aiocb结构体进行修改。因此,为了提高从aiocb结构体转化为iov结构体,从iov结构体到aiocb结构体的转换效率,以及节省内存地址空间的消耗,本发明巧妙使用了地址引用机制。在do while循环组织I/O请求到数组中时,利用取地址符号将aiocb结构地址保存到申请好的指针空间中。在I/O请求结束后,利用*运算符指向aiocb结构体,达到在后置操作中修改前置变量的效果,大大提高了效率,优化了代码结构。
本发明实施例的地址引用机制的实现过程如表7所示:
表7
4.批量I/O请求处理机制
当用户程序使用lio_listio()接口发出批量I/O读写请求时,就会调用此机制。该接口有四个传入参数:lio_listio(int mode,struct aiocb*const list[],int nent,struct sigevent*sig)。其中mode指的是模式,mode的值通常设置为LIO_NOWAIT。LIO_NOWAIT表示调用了lio_listio()会立即返回,当所有异步I/O请求完成后,才会进行异步通知。list则表示由aiocb结构体指针的数组,nent即表示该数组的长度,即I/O请求个数。其中aiocb中的aio_lio_opcode成员表示该I/O请求要完成的工作。aio_lio_opcode的值可以为以下两种,如表8所示:
表8
aio_lio_opcode的值 | 说明 |
LIO_READ | 发起异步I/O读操作 |
LIO_WRITE | 发起异步I/O写操作 |
在批量I/O请求机制中,由于用户程序传入的参数已经为组织好的I/O请求,所以节省了1.2中组织I/O的步骤。但是用户程序需要对I/O请求进行整理,填充进数组。用户层异步机制使用纤程实现,内核层异步机制巧妙使用系统调用实现。
5、崩溃恢复一致性保证
本发明设计并搭建在持久性内存PM设备上,需要保证在出现断电、宕机等崩溃场景后,重启该设备时数据的恢复以及数据一致性问题。本发明通过增加clflush缓存刷写命令保证写回指令的执行顺序。为避免缓存行失效,在刷写指令之后插入mfence屏障指令保证数据的崩溃恢复一致性。以下为具体步骤:
1.用户程序提交读写数据到软件系统中。
2.如图二所示,通过两段锁保证数据在组织I/O表过程中的顺序性、一致性以及数据安全性。该锁采用ucontext纤程实现的互斥锁。
3.aiocb与iov两种结构体进行转换并提交I/O请求。
4.纤程结束时系统进行clflush刷新指令以及mfence屏障指令。
当数据在上述步骤1中读写操作发生崩溃时,由于该数据还未进行到系统执行中,因此文件的元数据并未发生改变,PM设备可保证数据的安全性。在步骤2过程中,系统发生崩溃,SplitFS文件系统的U-Split建立在用户层,通过relink原语可以保证数据已经在PM设备上存在大量实际备份。通过数据备份即可进行数据恢复,从而保证数据一致性。在步骤3中,在准备I/O请求、返回机制利用aiocb结构体,在提交执行中利用iov结构体。aiocb与iov两种结构体的巧妙利用可以保证数据的安全性以及数据备份。步骤4的执行则在系统中利用硬件原语,保证数据的顺序写回。mfence指令迫使在其之前的存储指令与之后的存储指令之间,有不变的内存访问次序。另外,mfence指令也保证系统在执行后续存储之前完成之前所有的存储。
本发明实施例的一个I/O请求生命周期如下:
本发明在此分析一个读I/O请求从创建到消亡的整个过程,流程图如图3、图4、图5所示。
如图3所示,应用程序通过aio_read()函数发起读I/O请求,接下来进入到用户层准备I/O。首先会计算该I/O请求的优先级,并为其从资源池中分配一个I/O请求结构体。然后通过对I/O请求表的查看,决定插入位置以及是否需要为此I/O请求分配相应纤程。接下来按照优先级次序将该I/O请求插入到I/O请求表中。最后判断该请求需要被新纤程处理,还是可以由属于同一文件描述符的已运行的纤程进行处理。
如图4所示,I/O请求由用户级ucontext纤程进行处理。首先,I/O请求结构体将会由aiocb结构体转换为iov结构体。然后,在已经创建好的SQ提交队列中填充I/O请求并设置地址引用机制,便于数据返回。接下来,进行短时间等待是否还有后续I/O请求,保证提交性能最大化。最后,通过IO_uring系统调用函数io_uring_enter进入内核处理。
如图5所示,IO_uring通过mmap函数设置了环形缓冲区,内核将SQ中的请求继续向下提交,直到硬件层面。读操作获取到文件数据时,会进行内存拷贝操作,并将数据填充至CQ队列。在整体过程中,通过mmap实现用户层内核层数据共享,避免了频繁的上下文切换。最后,通过地址引用机制,CQ中的返回数据会刷新至aiocb结构体。至此iov结构体完成使命,释放空间进行回收,而aio_read()函数也有效返回。用户程序可通过aio_error()函数判断I/O请求运行的阶段,通过aio_return()获得返回值。
另外,本发明实施例的实现平台及依赖如图:
1、安装SplitFS文件系统
SplitFS需要安装依赖项,运行在Linux Kernel 4.13.0,并且需要用户安装bc、libelf-dev、libncurses5-dev等库;
2、安装liburing
本发明基于ubuntu 18.04、Glibc-2.23版本。liburing库实现了IO_uring接口。
综上所述,本发明设计了专用于PM文件系统的轻量级异步I/O,UPMAIO。UPMAIO在三点上进行了创新:1、在用户空间,引入纤程库机制,避免了在关键路径上创建、销毁纤程的开销。该纤程机制相较于Pthread线程库,实现简洁,效率高。2、改变了I/O请求的提交方式。本发明从单个I/O请求提交方式,优化为基于同一文件描述符对应的一系列I/O请求同时提交,减轻了用户态和内核态之间频繁切换开销,也提高了读写性能。3、提出内核层、用户层双层共同搭建异步I/O机制。在用户层通过纤程机制模拟异步I/O方式,在用户层和内核层的交界处通过优化的IO_uring系统调用批量处理I/O请求。通过用户层、内核层双层异步I/O方式的设计保证其兼容性、低延迟性、可拓展性以及高吞吐量。
本发明可以搭建在戴尔R740服务器上,该服务器带有2块128GB英特尔傲腾DC持久性内存,Optane DC PMM当作APP Direct模式(应用程序直接访问模式)使用。在UbuntuServer16.04.6x86_64操作系统,Linux 4.13.1版本的内核实验环境下,基于SplitFS文件系统实现本发明设计的异步I/O接口。当使用其进行读写文件操作时,读写性能均有显著提升,延迟问题明显下降,可拓展性强,一致性问题得到保证。
在一些可选择的实施例中,在方框图中提到的功能/操作可以不按照操作示图提到的顺序发生。例如,取决于所涉及的功能/操作,连续示出的两个方框实际上可以被大体上同时地执行或所述方框有时能以相反顺序被执行。此外,在本发明的流程图中所呈现和描述的实施例以示例的方式被提供,目的在于提供对技术更全面的理解。所公开的方法不限于本文所呈现的操作和逻辑流程。可选择的实施例是可预期的,其中各种操作的顺序被改变以及其中被描述为较大操作的一部分的子操作被独立地执行。
此外,虽然在功能性模块的背景下描述了本发明,但应当理解的是,除非另有相反说明,所述的功能和/或特征中的一个或多个可以被集成在单个物理装置和/或软件模块中,或者一个或多个功能和/或特征可以在单独的物理装置或软件模块中被实现。还可以理解的是,有关每个模块的实际实现的详细讨论对于理解本发明是不必要的。更确切地说,考虑到在本文中公开的装置中各种功能模块的属性、功能和内部关系的情况下,在工程师的常规技术内将会了解该模块的实际实现。因此,本领域技术人员运用普通技术就能够在无需过度试验的情况下实现在权利要求书中所阐明的本发明。还可以理解的是,所公开的特定概念仅仅是说明性的,并不意在限制本发明的范围,本发明的范围由所附权利要求书及其等同方案的全部范围来决定。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,“计算机可读介质”可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。
计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(RAM),只读存储器(ROM),可擦除可编辑只读存储器(EPROM或闪速存储器),光纤装置,以及便携式光盘只读存储器(CDROM)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。
应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
尽管已经示出和描述了本发明的实施例,本领域的普通技术人员可以理解:在不脱离本发明的原理和宗旨的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由权利要求及其等同物限定。
以上是对本发明的较佳实施进行了具体说明,但本发明并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做出种种的等同变形或替换,这些等同的变形或替换均包含在本申请权利要求所限定的范围内。
Claims (6)
1.基于持久性内存的用户层异步IO方法,其特征在于,包括:
应用程序发起读I/O请求;
通过用户级ucontext纤程对所述读I/O请求进行第一处理后,将所述读I/O请求传入内核层进行第二处理;
由所述内核层对所述读I/O请求进行第三处理后,将所述读I/O请求发送至硬件层进行第四处理;
根据所述读I/O请求,通过所述硬件层的读操作获取文件数据;
其中,所述读I/O请求包括单个I/O请求或批量I/O请求;
所述应用程序发起读I/O请求,包括:
应用程序发起读I/O请求;
在用户层中计算所述读I/O请求的优先级,并为所述读I/O请求分配I/O请求结构体;
根据I/O请求表确定所述读I/O请求的插入位置以及所述读I/O请求的待分配纤程;
根据所述读I/O请求的优先级,将所述读I/O请求插入到所述I/O请求表中;
确定所述I/O请求表的待处理纤程;
所述通过用户级ucontext纤程对所述读I/O请求进行第一处理后,将所述读I/O请求传入内核层进行第二处理,包括:
通过用户级ucontext纤程对所述读I/O请求进行处理;
将所述I/O请求结构体从aiocb结构体转换为iov结构体;
在SQ提交队列中填充所述读I/O请求,并确定地址引用机制;
等待预设时长并确定完成所有I/O请求的接收后,通过IO_uring系统调用函数io_uring_enter将所述读I/O请求传入内核层进行处理;
所述由所述内核层对所述读I/O请求进行第三处理后,将所述读I/O请求发送至硬件层进行第四处理,包括:
所述IO_uring系统通过mmap函数设置环形缓冲区,所述内核层将所述SQ提交队列中的读I/O请求提交至硬件层;所述mmap函数用于实现用户层与内核层之间的数据共享。
2.根据权利要求1所述的基于持久性内存的用户层异步IO方法,其特征在于,所述根据所述读I/O请求,通过所述硬件层的读操作获取文件数据,包括:
所述硬件层通过读操作获取文件数据;
对所述文件数据进行内存拷贝后,将所述文件数据填充至CQ队列;
根据地址引用机制,将所述CQ队列中的返回数据刷新至aiocb结构体。
3.根据权利要求2所述的基于持久性内存的用户层异步IO方法,其特征在于,所述方法还包括配置API接口的步骤,其中所述API接口包括:
aio_read(),用于请求异步I/O读操作;
aio_write(),用于请求异步I/O写操作;
aio_error(),用于检查异步I/O请求的状态;
aio_return(),用于将获得完成的异步I/O请求的返回状态;
lio_listio(),用于发起一系列I/O操作;
所述aio_read()和aio_write()用于对单个I/O请求进行处理;
所述lio_listio()用于对批量I/O请求进行处理。
4.根据权利要求3所述的基于持久性内存的用户层异步IO方法,其特征在于,所述方法还包括组织I/O请求表的步骤,该步骤包括:
在用户层设置资源池,所述资源池用于供I/O请求使用;
从所述资源池中提取多个节点,并根据双向链表将所述多个节点组成I/O请求表;
计算每个I/O请求的优先级;
在所述I/O请求表中查询目标插入列,通过I/O请求的文件描述符来判断I/O请求是否被执行,对于未被执行的I/O请求,在所述I/O请求表中新建待处理列来处理所述文件描述符对应的I/O请求。
5.根据权利要求4所述的基于持久性内存的用户层异步IO方法,其特征在于,所述方法还包括:
根据纤程搭建用户级纤程库和纤程池;
其中,所述纤程池的架构包括纤程池状态信息、任务队列信息、多纤程互斥锁以及函数指针;
所述纤程池状态信息用于描述当前纤程池的基本信息,所述基本信息包括是否开启纤程、开启纤程数量、最大纤程数、最小纤程数、存活纤程数、忙纤程数以及待销毁纤程数;
所述任务队列信息,用于描述当前任务队列的基本信息、任务最大数量以及队列是否为空条件变量;
所述多纤程互斥锁,用于保证在同一时间点上只有一个纤程在任务队列中取任务并修改任务队列信息或修改纤程池信息;
所述函数指针,用于在打包消息阶段,将分类后的消息处理函数放在类型参数中,以传递消息处理函数需要的信息。
6.根据权利要求1-5任一项所述的基于持久性内存的用户层异步IO方法,其特征在于,所述方法还包括以下至少之一:
用户程序可通过aio_error()函数判断I/O请求运行的阶段;
I/O请求提交处理步骤;
I/O请求返回步骤;
批量I/O请求处理步骤;
崩溃恢复一致性保证步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110494879.XA CN113282407B (zh) | 2021-05-07 | 2021-05-07 | 基于持久性内存的用户层异步io方法与系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110494879.XA CN113282407B (zh) | 2021-05-07 | 2021-05-07 | 基于持久性内存的用户层异步io方法与系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113282407A CN113282407A (zh) | 2021-08-20 |
CN113282407B true CN113282407B (zh) | 2023-01-03 |
Family
ID=77278388
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110494879.XA Active CN113282407B (zh) | 2021-05-07 | 2021-05-07 | 基于持久性内存的用户层异步io方法与系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113282407B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114706820B (zh) * | 2022-05-18 | 2022-09-06 | 北京卡普拉科技有限公司 | 异步i/o请求的调度方法、系统、电子设备及介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110147670A (zh) * | 2019-05-21 | 2019-08-20 | 电子科技大学 | 一种工作于内核态的进程间持久性内存保护方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080133654A1 (en) * | 2006-12-01 | 2008-06-05 | Chei-Yol Kim | Network block device using network asynchronous i/o |
US9063783B2 (en) * | 2008-11-24 | 2015-06-23 | Red Hat, Inc. | Coordinating parallel execution of processes using agents |
US11398894B2 (en) * | 2018-06-20 | 2022-07-26 | University Of Central Florida Research Foundation, Inc. | System, method and computer readable medium for file encryption and memory encryption of secure byte-addressable persistent memory and auditing |
-
2021
- 2021-05-07 CN CN202110494879.XA patent/CN113282407B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110147670A (zh) * | 2019-05-21 | 2019-08-20 | 电子科技大学 | 一种工作于内核态的进程间持久性内存保护方法 |
Non-Patent Citations (1)
Title |
---|
BeeGFS并行文件系统性能优化技术研究;宋振龙等;《计算机工程与科学》;20201015(第10期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN113282407A (zh) | 2021-08-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Joshi et al. | Atom: Atomic durability in non-volatile memory through hardware logging | |
EP3701377B1 (en) | Method and apparatus for updating shared data in a multi-core processor environment | |
US11487435B1 (en) | System and method for non-volatile memory-based optimized, versioned, log-structured metadata storage with efficient data retrieval | |
CN110750356B (zh) | 适用于非易失性内存的多核交互方法、系统及存储介质 | |
US20180260324A1 (en) | Data Structure Store in Persistent Memory | |
WO2015169145A1 (zh) | 内存管理方法和设备 | |
US9378069B2 (en) | Lock spin wait operation for multi-threaded applications in a multi-core computing environment | |
CN111857993B (zh) | 一种内核态调用用户态函数的方法 | |
CN110457261B (zh) | 数据访问方法、装置及服务器 | |
CN115658277B (zh) | 一种任务调度方法、装置及电子设备和存储介质 | |
US11960747B2 (en) | Moving data in a memory and command for memory control | |
CN106708627A (zh) | 一种基于kvm的多虚拟机映射、多通路的fuse加速方法及系统 | |
CN114780025B (zh) | 软件raid请求处理方法、控制器及raid存储系统 | |
EP1760580B1 (en) | Processing operation information transfer control system and method | |
CN114138200A (zh) | 一种基于RocksDB的预写日志方法及系统 | |
CN113282407B (zh) | 基于持久性内存的用户层异步io方法与系统 | |
CN113568908A (zh) | 一种键值请求并行调度方法及系统 | |
CN112748869B (zh) | 一种数据处理方法及装置 | |
CN116521608A (zh) | 数据迁移方法及计算设备 | |
CN112948136A (zh) | 一种嵌入式操作系统异步日志记录的实现方法 | |
US9417805B2 (en) | Exporting computational capabilities into a block-oriented disk memory | |
CN112346879B (zh) | 进程管理方法、装置、计算机设备及存储介质 | |
Chen et al. | Lock-free high-performance hashing for persistent memory via PM-aware holistic optimization | |
CN112486410A (zh) | 一种持久性内存文件读写方法、系统、装置及存储介质 | |
Xu et al. | I/O Transit Caching for PMem-based Block Device |
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 |