CN114721844B - 数据缓存方法和装置、计算机设备、存储介质 - Google Patents

数据缓存方法和装置、计算机设备、存储介质 Download PDF

Info

Publication number
CN114721844B
CN114721844B CN202210237653.6A CN202210237653A CN114721844B CN 114721844 B CN114721844 B CN 114721844B CN 202210237653 A CN202210237653 A CN 202210237653A CN 114721844 B CN114721844 B CN 114721844B
Authority
CN
China
Prior art keywords
thread
cache
data
read
write request
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
Application number
CN202210237653.6A
Other languages
English (en)
Other versions
CN114721844A (zh
Inventor
魏键
文均波
黄岩
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Yunhe Enmo Beijing Information Technology Co ltd
Original Assignee
Yunhe Enmo Beijing Information Technology Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Yunhe Enmo Beijing Information Technology Co ltd filed Critical Yunhe Enmo Beijing Information Technology Co ltd
Priority to CN202210237653.6A priority Critical patent/CN114721844B/zh
Publication of CN114721844A publication Critical patent/CN114721844A/zh
Application granted granted Critical
Publication of CN114721844B publication Critical patent/CN114721844B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes

Abstract

本申请实施例提供一种数据缓存方法和装置、计算机设备、存储介质,属于数据处理领域。方法包括:将缓存存储划分多个独立的数据处理线程,接收数据读写请求;计算数据读写请求中后端存储地址对应的线程ID,作为目标ID;根据目标ID获取对应的数据处理线程,作为目标处理线程;将数据读写请求分配至目标处理线程来判断后端存储地址是否命中目标处理线程的线程缓存,得到判断结果;根据判断结果对数据读写请求进行读写操作。通过将缓存存储拆分到各个独立的数据处理线程,由于缓存实际上是由各数据处理线程独立维护,因此数据读写的过程不需要一个独立线程来操作整个缓存空间,也不存在各线程对整个缓存元数据进行的互斥访问,从而提升数据吞吐性能。

Description

数据缓存方法和装置、计算机设备、存储介质
技术领域
本申请涉及数据处理领域,尤其涉及一种数据缓存方法和装置、计算机设备、存储介质。
背景技术
在多线程环境中,由于所有线程共用缓存项列表,并且线程之间是并行运行的。因此,为了确保并行操作缓存项时带来的数据一致性问题,通常采用对缓存项列表进行线程互斥的方式,但是线程互斥会导致数据吞吐量下降,从而导致数据吞吐性能差。
发明内容
本申请公开实施例的主要目的在于提出一种数据缓存方法和装置、计算机设备、存储介质,能够提升数据吞吐性能。
为实现上述目的,本申请公开实施例的第一方面提出了一种数据缓存方法,应用于缓存实例,所述缓存实例对应有后端存储和缓存存储,所述缓存存储划分有多个独立的数据处理线程,每一所述数据处理线程对应一个线程ID,所述方法包括:
接收数据读写请求;其中,所述数据读写请求包括后端存储地址;
计算所述后端存储地址对应的线程ID,作为目标ID;
根据所述目标ID获取对应的数据处理线程,作为目标处理线程;
将所述数据读写请求分配至所述目标处理线程,以判断所述后端存储地址是否命中所述目标处理线程的线程缓存,得到判断结果;
根据所述判断结果对所述数据读写请求进行读写操作。
在一些实施例,所述根据所述判断结果对所述数据读写请求进行读写操作,包括:
若所述判断结果为所述后端地址命中所述线程缓存,则将所述数据读写请求对应的待写入数据写入至所述线程缓存中,或从所述线程缓存中读取对应的待读取数据。
在一些实施例,所述根据所述判断结果对所述数据读写请求进行读写操作,包括:
若所述判断结果为所述后端存储地址未命中所述线程缓存,则从所述线程缓存中获取所述数据读写请求未命中的缓存项的数量,作为第一数量;
若所述数据读写请求需要申请所述缓存项,则从所述线程缓存中获取空闲的缓存项的数量,作为第二数量;
根据所述第一数量和所述第二数量对所述读写请求进行读写操作。
在一些实施例,所述根据所述第一数量和所述第二数量对所述读写请求进行读写操作,包括:
比较所述第一数量和所述第二数量之间的大小关系;
若所述第二数量大于或等于所述第一数量,则将所述数据读写请求的待写入数据写入至对应所述线程缓存中。
在一些实施例,在所述比较所述第一数量和所述第二数量之间的大小关系之后,所述方法还包括:
若所述第二数量小于所述第一数量,则根据预设的淘汰策略对所述线程缓存中的部分低访问度的缓存项进行淘汰,以得到更新后的线程缓存;
将所述数据读写请求对应的待写入数据写入至更新后的所述线程缓存中。
在一些实施例,所述方法还包括:动态调整每一所述数据处理线程的缓存容量,具体包括:
根据预设的时间周期对每一所述数据处理线程的活跃度进行评估,得到评估结果;
基于所述评估结果,根据预设的容量调整策略调整每一所述数据处理线程的所述缓存容量。
在一些实施例,所述基于所述评估结果,根据预设的容量调整策略调整每一所述数据处理线程的所述缓存容量,包括:
根据所述评估结果,从所述数据处理线程中获取需要缩小容量的缩容线程,并获取需要扩大容量的扩容线程;
发送均衡消息给所述缩容线程,以使所述缩容线程根据所述均衡消息缩小所述缩容线程的缓存容量,得到空余容量;
根据所述空余容量扩大所述扩容线程的缓存容量。
本申请公开实施例的第二方面提出了一种数据缓存装置,包括:
请求接收模块:用于接收数据读写请求;其中,所述数据读写请求包括后端存储地址;
ID计算模块:用于计算所述后端存储地址对应的线程ID,作为目标ID;
线程获取模块:用于根据所述目标ID获取对应的数据处理线程,作为目标处理线程;
请求分配模块:用于将所述数据读写请求分配至所述目标处理线程,以使所述目标处理线程判断所述后端存储地址是否命中所述目标处理线程的线程缓存,得到判断结果;
读写操作模块:用于根据所述判断结果对所述数据读写请求进行读写操作。本申请公开实施例的第三方面提出了一种计算机设备,所述计算机设备包括存储器和处理器,其中,所述存储器中存储有程序,所述程序被所述处理器执行时所述处理器用于执行如本申请第一方面实施例任一项所述的方法。
本申请公开实施例的第四方面提出了一种存储介质,该存储介质为计算机可读存储介质,所述存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行如本申请第一方面实施例任一项所述的方法。
本申请公开实施例提出的数据缓存方法和装置、计算机设备、存储介质,通过将缓存存储划分多个独立的数据处理线程,接收数据读写请求;其中,数据读写请求包括后端存储地址;计算后端存储地址对应的线程ID,作为目标ID;根据目标ID获取对应的数据处理线程,作为目标处理线程;将数据读写请求分配至目标处理线程,以判断后端存储地址是否命中目标处理线程的线程缓存,得到判断结果;根据判断结果对数据读写请求进行读写操作。本申请公开实施例通过将缓存存储拆分到各个独立的数据处理线程中,由于缓存实际上是由各数据处理线程独立维护,因此在数据读写的过程中,不需要一个独立线程来操作整个缓存空间,也不存在各线程对整个缓存元数据进行的互斥访问,从而提升数据吞吐性能。
附图说明
图1是本申请公开实施例提供的缓存基本模型的示意图;
图2是本申请公开实施例提供的线程冲突的示意图;
图3是本申请公开实施例提供的线程竞争锁操作来缓存元数据的示意图;
图4是本申请公开实施例提供的整体架构图;
图5是本申请公开实施例提供的数据缓存方法的第一流程图;
图6是图5中的步骤S500的流程图;
图7是图6中的步骤S530的第一流程图;
图8是图6中的步骤S530的第二流程图;
图9是本申请公开实施例提供的LRU淘汰策略的示意图;
图10是本申请公开实施例提供的数据缓存方法的第二流程图;
图11是图10中的步骤S700的流程图;
图12是本申请公开实施例提供的数据缓存装置的模块结构示意图;
图13是本申请公开实施例提供的计算机设备的硬件结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本申请,并不用于限定本申请。
需要说明的是,虽然在装置示意图中进行了功能模块划分,在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于装置中的模块划分,或流程图中的顺序执行所示出或描述的步骤。说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本公开的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本公开的各方面。
附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
首先,对本申请中涉及的若干名词进行解析:
人工智能(artificial intelligence,AI):是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学;人工智能是计算机科学的一个分支,人工智能企图了解智能的实质,并生产出一种新的能以人类智能相似的方式作出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能可以对人的意识、思维的信息过程的模拟。人工智能还是利用数字计算机或者数字计算机控制的机器模拟、延伸和扩展人的智能,感知环境、获取知识并使用知识获得最佳结果的理论、方法、技术及应用系统。
缓存实例(cache):与后端数据存储一一对应,缓存实例可以配置不同的缓存模式、淘汰策略、存储大小和方式等。
线程缓存(thread-cache):负责单个线程内缓存空间的实际分配和回收。一个缓存实例中的线程缓存数量等于当前程序运行设定的CPU核心数量。
数据页(page):将缓存空间按一定的对齐大小(4k,16k,32k…)拆分为多个数据页,此外,数据读写必须以数据页为单位进行对齐操作。
缓存项(entry):用于维护缓存地址与后端存储地址之间映射,以及当前状态等信息的元数据。一个数据页对应一个缓存项。
淘汰策略(eviction):释放缓存空间的策略。
协调者(coordinator):监控线程缓存的使用度和活跃度。
中央处理器(Central Processing Unit,CPU):作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。
读写锁:实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。
目前,在多线程环境中,由于所有线程共用缓存项列表,并且线程之间是并行运行的。因此,为了确保并行操作缓存项时带来的数据一致性问题,通常采用对缓存项列表进行线程互斥的方式,但是线程互斥会导致数据吞吐量下降,从而导致数据吞吐性能差。
基于此,本申请公开实施例提供一种数据缓存方法和装置、计算机设备、存储介质,通过将缓存存储划分多个独立的数据处理线程,接收数据读写请求;其中,数据读写请求包括后端存储地址;计算后端存储地址对应的线程ID,作为目标ID;根据目标ID获取对应的数据处理线程,作为目标处理线程;将数据读写请求分配至目标处理线程,以判断后端存储地址是否命中目标处理线程的线程缓存,得到判断结果;根据判断结果对数据读写请求进行读写操作。本申请公开实施例通过将缓存存储拆分到各个独立的数据处理线程中,由于缓存实际上是由各数据处理线程独立维护,因此在数据读写的过程中,不需要一个独立线程来操作整个缓存空间,也不存在各线程对整个缓存元数据进行的互斥访问,从而提升数据吞吐性能。
本申请公开实施例提供数据缓存方法和装置、计算机设备、存储介质,具体通过如下实施例进行说明,首先描述本申请公开实施例中的数据缓存方法。
本申请实施例可以基于人工智能技术对相关的数据进行获取和处理。其中,人工智能(Artificial Intelligence,AI)是利用数字计算机或者数字计算机控制的机器模拟、延伸和扩展人的智能,感知环境、获取知识并使用知识获得最佳结果的理论、方法、技术及应用系统。
人工智能基础技术一般包括如传感器、专用人工智能芯片、云计算、分布式存储、大数据处理技术、操作/交互系统、机电一体化等技术。人工智能软件技术主要包括计算机视觉技术、机器人技术、生物识别技术、语音处理技术、自然语言处理技术以及机器学习/深度学习等几大方向。
本申请公开实施例提供的数据缓存方法,涉及数据处理领域,同样涉及人工智能领域。本申请公开实施例提供的数据缓存方法可应用于终端中,也可应用于服务端中,还可以是运行于终端或服务端中的软件。在一些实施例中,终端可以是智能手机、平板电脑、笔记本电脑、台式计算机或者智能手表等;服务端可以配置成独立的物理服务端,也可以配置成多个物理服务端构成的服务端集群或者分布式系统,还可以配置成提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN以及大数据和人工智能平台等基础云计算服务的云服务端;软件可以是实现数据缓存方法的应用等,但并不局限于以上形式。
本申请公开实施例可用于众多通用或专用的计算机系统环境或配置中。例如:个人计算机、服务端计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
需要说明的是,在存储系统中,需要将一些持久化数据存储在具备大容量的磁盘设备中,但大多数大容量的磁盘设备吞吐速度较慢。为了加速数据操作,通常将部分经常访问的数据放入一些速度较快且容量较小的设备,例如内存中。一般地,将容量大速度慢的存储设备称为后端存储,将容量小速度快的存储设备称为缓存存储。
需要说明的是,缓存实例是根据具体的缓存模式确定数据读写的路径,以及协调缓存存储与后端存储之间的数据交换。通常,一个缓存实例对应一个后端存储和一个缓存存储。
在一些实施例中,如图1所示,当应用程序下发磁盘读写请求时,缓存实例会优先判断该请求的地址是否在缓存存储中命中,也即判断该地址是否预先存储在缓存存储中,如果该地址在缓存存储中命中,则缓存实例通过操作命中的缓存存储来加速数据吞吐,进而提升整个存储系统的性能。
在一些实施例中,在存储系统中,为了最大化利用CPU资源,通常会创建多个数据处理线程,其中数据的读写请求会被分散于不同的数据处理线程中。此外,为了提高缓存命中率且保证能淘汰最不常访问的缓存,因此所有的数据处理线程通常共享缓存项列表。在多CPU的计算机系统中,不同的数据处理线程独立运行在不同的CPU核上,所以数据处理线程之间的并行运行的,由于各个数据处理线程对数据的访问彼此独立,因此当多个线程并行访问同一个共享资源时,就可能产生数据不一致的问题,从而产生线程冲突。
如图2所示,线程1、线程2和线程3并行访问同一个共享资源A,其中线程1用于写入数据B,线程2用于写入数据C,线程3用于从共享资源A中读取数据,用于线程1、线程2是并行的,这时就可能产生数据不一致的问题,因此不能分辨出线程3读取到的数据是数据A、数据B还是数据B。
如上所述,由于缓存列表是所有数据处理线程共用的,因此当多个数据处理线程需要同时操作缓存项时,需要对数据处理线程进行协调,即进行线程互斥,从而防止线程冲突。目前,通常是采用在数据处理线程中加入读写锁的方法实现线程互斥,例如可以利用开源的缓存框架OCF,其读写锁的特点是:1、写者具有互斥性,即排他性和唯一性;2、读者之间可以共存。也就是说,有一个或多个数据处理线程需要写入数据时,只能由其中一个执行写入操作,其余的数据处理线程不能执行写入操作;如果一个或多个数据处理线程需要读取数据时,则可能并行执行读取操作。
在一些实施例中,如图3所示,以OCF为例,当各个数据处理线程,即线程1、线程2、线程3和线程4等,对缓存项进行分配和淘汰时,OCF内部会对各种读写锁进行锁定,防止缓存项并行执行重复操作;在对缓存项进行查找时,也会给相应的读写锁加锁,以防止缓存项数据失效。读写锁虽然可以保证数据的一致性,但是随着程序创建的数据处理线程的数量逐渐增加,且由于读写锁本身的特性,各数据处理线程之间对锁的竞争会逐渐加剧,会在以下几种情况下形成性能瓶颈:
情况一:当有一个数据处理线程持有写锁的情况下,其余的数据处理线程只能陷入内核态自旋,等待写锁被释放。
情况二:当数据处理线程中存在大量读写请求,且读写锁未设置“写亲和”属性时,写请求所在的数据处理线程可能会处于长时间无法申请到写锁而陷入内核态自旋等待的状态。
需要说明的是,当锁陷入内核态自旋等待时,会导致当前的数据处理线程所在的CPU核处于忙等状态。由于单个数据处理线程对程序的处理是线性的,这会导致忙等的CPU无法处理更多的指令,造成CPU资源的浪费,并且该数据处理线程的读写请求也会被阻塞。因此,目前的缓存方案,由于锁的存在,而导致缓存项的访问效率降低。
在描述本申请公开实施例的数据缓存方法之前,首先介绍本申请公开实施例的数据缓存方法的整体架构图,如图4所示,本申请公开实施例的整个缓存存储被拆分成大小不等的部分到各数据处理线程中,例如线程1、线程2和线程3,且各数据处理线程按数据对齐大小分为多页,每一个数据页对应一个缓存项,即元数据,等量的数据页组成一个数据块。由于缓存存储实际上是由各数据处理线程独立维护,因此不需要一个独立的数据处理线程来操作整个缓存空间,也不存在各数据处理线程对整个缓存的元数据进行互斥访问,因此能够减少性能开销。
需要说明的是,本申请公开实施例的技术要点如下:
第一:本申请公开实施例的缓存存储被拆分到各个数据处理线程中,因此没有全局的公共缓存元数据,也没有由于线程互斥操作公共缓存元数据而产生的性能开销。
第二:本申请公开实施例的各个数据处理线程具有独立且完整的本线程缓存元数据和流程,独立执行本线程缓存的全部生命周期。
第三:本申请公开实施例的数据读写请求被分发给不同的数据处理线程处理,且数据块地址相同的数据读写请求,会分发到同一个数据处理线程处理。
第四:协调者根据容量调整策略动态调整各个数据处理线程缓存的容量,不参与缓存的分配和淘汰。
本申请公开实施例第一方面实施例的数据缓存方法应用于缓存实例,缓存实例对应有后端存储和缓存存储,缓存存储划分有多个独立的数据处理线程,每一数据处理线程对应一个线程ID,参照图5,数据缓存方法包括但不限于包括步骤S100、步骤S200、步骤S300、步骤S400和步骤S500。
步骤S100,接收数据读写请求;
步骤S200,计算后端存储地址对应的线程ID,作为目标ID;
步骤S300,根据目标ID获取对应的数据处理线程,作为目标处理线程;
步骤S400,将数据读写请求分配至目标处理线程,以判断后端存储地址是否命中目标处理线程的线程缓存,得到判断结果;
步骤S500,根据判断结果对数据读写请求进行读写操作。
在一些实施例的步骤S100中,缓存实例获取来自用户或应用程序的数据读写请求;其中,数据读写请求包括后端存储地址,数据读写请求用于在缓存系统中请求读取或写入对应的数据。
在一些实施例的步骤S200中,缓存实例计算后端存储地址对应的数据处理线程,作为目标线程。具体地,对请求的后端存储地址,即数据块进行哈希计算,计算出该地址对应的线程ID,作为目标ID。
需要说明的是,由于缓存系统约定传入缓存实例的数据读写请求不跨数据块,因此相同数据块的请求计算出来的线程ID是固定的。
在一些实施例的步骤S300中,缓存实例根据目标ID获取对应的数据处理线程,作为目标处理线程。
在一些实施例的步骤S400中,缓存实例将数据读写请求分配或转发给计算出的目标处理线程,其目的是固定后端存储地址对应的数据处理线程,防止多个数据处理线程重复缓存同一个后端存储地址,此外还需要判断后端存储地址是否命中目标处理线程的线程缓存,得到判断结果,其中,该判断结果包括命中和未命中。
在一些实施例的步骤S500中,根据步骤S400得出的判断结果对数据读写请求进行读写操作。
在一些实施例中,步骤S500具体包括:若判断结果为后端地址命中线程缓存,则将数据读写请求对应的待写入数据写入至线程缓存中,或从线程缓存中读取对应的待读取数据。
在一些实施例中,如图6所示,步骤S500具体包括但不限于步骤S510、步骤S520和步骤S530。
步骤S510,若判断结果为后端存储地址未命中线程缓存,则从线程缓存中获取数据读写请求未命中的缓存项的数量,作为第一数量;
步骤S520,若数据读写请求需要申请缓存项,则从线程缓存中获取空闲的缓存项的数量,作为第二数量;
步骤S530,根据第一数量和第二数量对读写请求进行读写操作。
在一些实施例的步骤S510至步骤S530中,若判断结果为后端存储地址未命中线程缓存,则从线程缓存中获取数据读写请求未命中的缓存项的数量,作为第一数量;如果数据读写请求需要申请缓存项,则从线程缓存中获取空闲的缓存项的数量,作为第二数量。根据第一数量和第二数量对读写请求进行读写操作,具体地,需要判断当前线程缓存中空闲的缓存项数量(即第二数量)是否满足数据读写请求中未命中的数据页数量(即第一数量),接着根据判断结果执行后续操作。
在一些实施例中,如图7所示,步骤S530具体包括但不限于步骤S531和步骤S532。
步骤S531,比较第一数量和第二数量之间的大小关系;
步骤S532,若第二数量大于或等于第一数量,则将数据读写请求的待写入数据写入至对应线程缓存中。
在一些实施例的步骤S531至步骤S532中,比较第一数量和第二数量的大小关系,若第二数量大于或等于第一数量,则说明当前线程缓存中空闲的缓存项数量满足数据读写请求中未命中的数据页数量,则直接申请将数据读写请求中的待写入数据写入对应的线程缓存中。
在一些实施例中,如图8所示,步骤S530具体还包括但不限于步骤S533和步骤S534。
步骤S533,若第二数量小于第一数量,则根据预设的淘汰策略对线程缓存中的部分低访问度的缓存项进行淘汰,以得到更新后的线程缓存;
步骤S534,将数据读写请求对应的待写入数据写入至更新后的线程缓存中。
在一些实施例的步骤S533至步骤S534中,若第二数量小于第一数量,则说明当前线程缓存中空闲的缓存项数量不满足数据读写请求中未命中的数据页数量,此时需要根据预设的淘汰策略,例如利用LRU算法将当前的线程缓存中的部分低访问度的缓存项淘汰掉,以提供足够的空间写入待写入数据,得到更新后的线程缓存。需要说明的是,除了LRU算法之外,本领域技术人员还可以采用其他淘汰算法,本申请公开实施例不作具体限制。
在一些实施例中,如图9所示,预设的淘汰策略可以采用多种算法,本申请公开实施例以LRU算法为例进行讲解缓存项的淘汰过程。需要理解的是,下面描述仅是示例性说明,而不是对本申请的具体限制。
首先,线程缓存中的缓存项采用链表形式进行组织,初始化数据处理线程时,缓存项链表为空。其次,新申请的缓存项会被直接添加到链表头,最近命中的缓存项会从当前位置移除,再添加至链表头并更新其命中时间;链表尾则表示最不常访问的缓存项。因此本申请公开实施例在对缓存项进行淘汰时,从链表尾部作为起始点,移除一定数量最不常访问的缓存项,并将最不常访问的缓存项放入内存池中。
在一些实施例中,如图10所示,本申请的数据缓存方法具体还包括但不限于步骤S600和步骤S700。
步骤S600,根据预设的时间周期对每一数据处理线程的活跃度进行评估,得到评估结果;
步骤S700,基于评估结果,根据预设的容量调整策略调整每一数据处理线程的缓存容量。
在一些实施例的步骤S600中,当初始化数据处理线程时,每个数据处理线程分配到的线程缓存容量是相同的。但是,在线程读写请求分布不均衡的情况下,活跃度更高的线程应该获得更多的缓存资源以防止其命中率下降。因此,需要协调者根据预设的时间周期对所有数据处理线程的活跃度进行评估,得到评估结果。
需要说明的是,本申请公开实施例除了采用活跃度评估的方式,还可以采用其余的评估方式,例如一定周期内各线程IO增量的百分比等,本申请公开实施例不作具体限制。
在一些实施例的步骤S700中,协调者基于步骤S600的评估结果,并根据预设的容量调整策略,动态调整各个数据处理线程的缓存容量。
在一些实施例中,如图11所示,步骤S700具体包括但不限于步骤S710、步骤S720和步骤S730。
步骤S710,根据评估结果,从数据处理线程中获取需要缩小容量的缩容线程,并获取需要扩大容量的扩容线程;
步骤S720,发送均衡消息给缩容线程,以使缩容线程根据均衡消息缩小缩容线程的缓存容量,得到空余容量;
步骤S730,根据空余容量扩大扩容线程的缓存容量。
在一些实施例的步骤S710至步骤S730中,评估结果一般包括对某些缓存线程的容量进行缩小或扩大;协调者根据评估结果,从数据处理线程中获取需要缩小容量的缩容线程,并获取需要扩大容量的扩容线程。发送均衡消息给缩容线程,以使缩容线程根据均衡消息缩小缩容线程的缓存容量,得到空余容量;其中,均衡消息用于提示缩容线程需要缩小的缓存容量,空余容量用于分配至扩容线程;根据空余容量扩大扩容线程的缓存容量。
在实际应用中,容量调整策略有多种算法可选,也可以采用多种算法进行组合的形式。本申请公开实施例以超时时间(Timeout)方案为例,描述缓存容量调整的过程,需要理解的是,下面描述仅是示例性说明,而不是对本申请的具体限制。
首先,协调者需要在一个协调周期内计算出所有线程缓存最不常访问的缓存项中,命中时间最晚的一个及最早的一个,如果二者的差值达到某个预设的阈值,则需要对这两个数据处理线程的线程缓存的大小进行调整,其中,将需要缩小容量的线程称为缩容线程,将需要扩大容量的线程称为扩容线程。
其次,在协调者进行缓存容量调整时,为了防止出现缓存总量超额的情况,需要采用先减后加的顺序。具体地,首先需要减小扩容线程的缓存容量,并向该线程发送均衡消息。扩容线程收到均衡消息后,使用淘汰策略将当前的缓存量调整到新容量以下。
最后,协调者在其后的协调周期内,需要判断所有的线程缓存的实际使用量是否处于最大值以下,若是,则将空余出来的换存量添加至扩容线程的容量上,若否则不执行扩容操作。
本申请公开实施例提出的数据缓存方法,通过将缓存存储划分多个独立的数据处理线程,接收数据读写请求;其中,数据读写请求包括后端存储地址;计算后端存储地址对应的线程ID,作为目标ID;根据目标ID获取对应的数据处理线程,作为目标处理线程;将数据读写请求分配至目标处理线程,以判断后端存储地址是否命中目标处理线程的线程缓存,得到判断结果;根据判断结果对数据读写请求进行读写操作。本申请公开实施例通过将缓存存储拆分到各个独立的数据处理线程中,由于缓存实际上是由各数据处理线程独立维护,因此在数据读写的过程中,不需要一个独立线程来操作整个缓存空间,也不存在各线程对整个缓存元数据进行的互斥访问,从而提升数据吞吐性能。
本申请公开实施例还提供一种数据缓存装置,如图12所示,可以实现上述数据缓存方法,该装置包括:请求接收模块810、ID计算模块820、线程获取模块830、请求分配模块840和读写操作模块850;请求接收模块810用于接收数据读写请求;其中,数据读写请求包括后端存储地址;ID计算模块820用于计算后端存储地址对应的线程ID,作为目标ID;线程获取模块830用于根据目标ID获取对应的数据处理线程,作为目标处理线程;请求分配模块840用于将数据读写请求分配至目标处理线程,以使目标处理线程判断后端存储地址是否命中目标处理线程的线程缓存,得到判断结果;读写操作模块850用于根据判断结果对数据读写请求进行读写操作。
需要说明的是,本申请公开实施例的数据缓存装置用于执行上述实施例中的数据缓存方法,其具体处理过程与上述实施例中的数据缓存方法相同,此处不再一一赘述。
本申请公开实施例提出的数据缓存装置,通过将缓存存储划分多个独立的数据处理线程,接收数据读写请求;其中,数据读写请求包括后端存储地址;计算后端存储地址对应的线程ID,作为目标ID;根据目标ID获取对应的数据处理线程,作为目标处理线程;将数据读写请求分配至目标处理线程,以判断后端存储地址是否命中目标处理线程的线程缓存,得到判断结果;根据判断结果对数据读写请求进行读写操作。本申请公开实施例通过将缓存存储拆分到各个独立的数据处理线程中,由于缓存实际上是由各数据处理线程独立维护,因此在数据读写的过程中,不需要一个独立线程来操作整个缓存空间,也不存在各线程对整个缓存元数据进行的互斥访问,从而提升数据吞吐性能。
本申请公开实施例还提供了一种计算机设备,包括:
至少一个处理器,以及,
与至少一个处理器通信连接的存储器;其中,
存储器存储有指令,指令被至少一个处理器执行,以使至少一个处理器执行指令时实现如本申请第一方面实施例中任一项的方法。
下面结合图13对计算机设备的硬件结构进行详细说明。该计算机设备包括:处理器910、存储器920、输入/输出接口930、通信接口940和总线950。
处理器910,可以采用通用的中央处理器(Central Processin Unit,CPU)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本申请公开实施例所提供的技术方案;
存储器920,可以采用只读存储器(Read Only Memory,ROM)、静态存储设备、动态存储设备或者随机存取存储器(Random Access Memory,RAM)等形式实现。存储器920可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器920中,并由处理器910来调用执行本申请公开实施例的数据缓存方法;
输入/输出接口930,用于实现信息输入及输出;
通信接口940,用于实现本设备与其他设备的通信交互,可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信;和
总线950,在设备的各个组件(例如处理器910、存储器920、输入/输出接口930和通信接口940)之间传输信息;
其中处理器910、存储器920、输入/输出接口930和通信接口940通过总线950实现彼此之间在设备内部的通信连接。
本申请公开实施例还提供一种存储介质,该存储介质是计算机可读存储介质,该计算机可读存储介质存储有计算机可执行指令,该计算机可执行指令用于使计算机执行本申请公开实施例的数据缓存方法。
存储器作为一种非暂态计算机可读存储介质,可用于存储非暂态软件程序以及非暂态性计算机可执行程序。此外,存储器可以包括高速随机存取存储器,还可以包括非暂态存储器,例如至少一个磁盘存储器件、闪存器件、或其他非暂态固态存储器件。在一些实施方式中,存储器可选包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至该处理器。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
本申请公开实施例提出的数据缓存方法和装置、计算机设备、存储介质,通过将缓存存储划分多个独立的数据处理线程,接收数据读写请求;其中,数据读写请求包括后端存储地址;计算后端存储地址对应的线程ID,作为目标ID;根据目标ID获取对应的数据处理线程,作为目标处理线程;将数据读写请求分配至目标处理线程,以判断后端存储地址是否命中目标处理线程的线程缓存,得到判断结果;根据判断结果对数据读写请求进行读写操作。本申请公开实施例通过将缓存存储拆分到各个独立的数据处理线程中,由于缓存实际上是由各数据处理线程独立维护,因此在数据读写的过程中,不需要一个独立线程来操作整个缓存空间,也不存在各线程对整个缓存元数据进行的互斥访问,从而提升数据吞吐性能。
本申请公开实施例描述的实施例是为了更加清楚的说明本申请公开实施例的技术方案,并不构成对于本申请公开实施例提供的技术方案的限定,本领域技术人员可知,随着技术的演变和新应用场景的出现,本申请公开实施例提供的技术方案对于类似的技术问题,同样适用。
本领域技术人员可以理解的是,图5、图6、图7、图8、图10和图11中示出的技术方案并不构成对本申请公开实施例的限定,可以包括比图示更多或更少的步骤,或者组合某些步骤,或者不同的步骤。
以上所描述的装置实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、设备中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。
本申请的说明书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
应当理解,在本申请中,“至少一个(项)”是指一个或者多个,“多个”是指两个或两个以上。“和/或”,用于描述关联对象的关联关系,表示可以存在三种关系,例如,“A和/或B”可以表示:只存在A,只存在B以及同时存在A和B三种情况,其中A,B可以是单数或者复数。字符“/”一般表示前后关联对象是一种“或”的关系。“以下至少一项(个)”或其类似表达,是指这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a,b或c中的至少一项(个),可以表示:a,b,c,“a和b”,“a和c”,“b和c”,或“a和b和c”,其中a,b,c可以是单个,也可以是多个。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括多指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,简称ROM)、随机存取存储器(Random Access Memory,简称RAM)、磁碟或者光盘等各种可以存储程序的介质。
以上参照附图说明了本申请公开实施例的优选实施例,并非因此局限本申请公开实施例的权利范围。本领域技术人员不脱离本申请公开实施例的范围和实质内所作的任何修改、等同替换和改进,均应在本申请公开实施例的权利范围之内。

Claims (9)

1.一种数据缓存方法,其特征在于,应用于缓存实例,所述缓存实例对应有后端存储和缓存存储,所述缓存存储划分有多个独立的数据处理线程,每一所述数据处理线程对应一个线程ID,所述方法包括:
接收数据读写请求;其中,所述数据读写请求包括后端存储地址;
计算所述后端存储地址对应的线程ID,作为目标ID;
根据所述目标ID获取对应的数据处理线程,作为目标处理线程;
将所述数据读写请求分配至所述目标处理线程,以判断所述后端存储地址是否命中所述目标处理线程的线程缓存,得到判断结果;
根据所述判断结果对所述数据读写请求进行读写操作,包括:
若所述判断结果为所述后端存储地址未命中所述线程缓存,则从所述线程缓存中获取所述数据读写请求未命中的缓存项的数量,作为第一数量;
若所述数据读写请求需要申请所述缓存项,则从所述线程缓存中获取空闲的缓存项的数量,作为第二数量;
根据所述第一数量和所述第二数量对所述读写请求进行读写操作。
2.根据权利要求1所述的方法,其特征在于,所述根据所述判断结果对所述数据读写请求进行读写操作,还包括:
若所述判断结果为所述后端存储地址命中所述线程缓存,则将所述数据读写请求对应的待写入数据写入至所述线程缓存中,或从所述线程缓存中读取对应的待读取数据。
3.根据权利要求1所述的方法,其特征在于,所述根据所述第一数量和所述第二数量对所述读写请求进行读写操作,包括:
比较所述第一数量和所述第二数量之间的大小关系;
若所述第二数量大于或等于所述第一数量,则将所述数据读写请求的待写入数据写入至对应所述线程缓存中。
4.根据权利要求3所述的方法,其特征在于,在所述比较所述第一数量和所述第二数量之间的大小关系之后,所述方法还包括:
若所述第二数量小于所述第一数量,则根据预设的淘汰策略对所述线程缓存中的部分低访问度的缓存项进行淘汰,以得到更新后的线程缓存;
将所述数据读写请求对应的待写入数据写入至更新后的所述线程缓存中。
5.根据权利要求1至4任一项所述的方法,其特征在于,所述方法还包括:动态调整每一所述数据处理线程的缓存容量,具体包括:
根据预设的时间周期对每一所述数据处理线程的活跃度进行评估,得到评估结果;
基于所述评估结果,根据预设的容量调整策略调整每一所述数据处理线程的所述缓存容量。
6.根据权利要求5所述的方法,其特征在于,所述基于所述评估结果,根据预设的容量调整策略调整每一所述数据处理线程的所述缓存容量,包括:
根据所述评估结果,从所述数据处理线程中获取需要缩小容量的缩容线程,并获取需要扩大容量的扩容线程;
发送均衡消息给所述缩容线程,以使所述缩容线程根据所述均衡消息缩小所述缩容线程的缓存容量,得到空余容量;
根据所述空余容量扩大所述扩容线程的缓存容量。
7.一种数据缓存装置,其特征在于,应用于缓存实例,所述缓存实例对应有后端存储和缓存存储,所述缓存存储划分有多个独立的数据处理线程,每一所述数据处理线程对应一个线程ID,所述装置包括:
请求接收模块:用于接收数据读写请求;其中,所述数据读写请求包括后端存储地址;
ID计算模块:用于计算所述后端存储地址对应的线程ID,作为目标ID;
线程获取模块:用于根据所述目标ID获取对应的数据处理线程,作为目标处理线程;
请求分配模块:用于将所述数据读写请求分配至所述目标处理线程,以使所述目标处理线程判断所述后端存储地址是否命中所述目标处理线程的线程缓存,得到判断结果;
读写操作模块:用于根据所述判断结果对所述数据读写请求进行读写操作,包括:
若所述判断结果为所述后端存储地址未命中所述线程缓存,则从所述线程缓存中获取所述数据读写请求未命中的缓存项的数量,作为第一数量;
若所述数据读写请求需要申请所述缓存项,则从所述线程缓存中获取空闲的缓存项的数量,作为第二数量;
根据所述第一数量和所述第二数量对所述读写请求进行读写操作。
8.一种计算机设备,其特征在于,所述计算机设备包括存储器和处理器,其中,所述存储器中存储有计算机程序,所述计算机程序被所述处理器执行时,所述处理器用于执行:如权利要求1至6中任一项所述的方法。
9.一种存储介质,所述存储介质为计算机可读存储介质,其特征在于,所述计算机可读存储有计算机程序,在所述计算机程序被计算机执行时,所述计算机用于执行:如权利要求1至6中任一项所述的方法。
CN202210237653.6A 2022-03-10 2022-03-10 数据缓存方法和装置、计算机设备、存储介质 Active CN114721844B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210237653.6A CN114721844B (zh) 2022-03-10 2022-03-10 数据缓存方法和装置、计算机设备、存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210237653.6A CN114721844B (zh) 2022-03-10 2022-03-10 数据缓存方法和装置、计算机设备、存储介质

Publications (2)

Publication Number Publication Date
CN114721844A CN114721844A (zh) 2022-07-08
CN114721844B true CN114721844B (zh) 2022-11-25

Family

ID=82237930

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210237653.6A Active CN114721844B (zh) 2022-03-10 2022-03-10 数据缓存方法和装置、计算机设备、存储介质

Country Status (1)

Country Link
CN (1) CN114721844B (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116340214B (zh) * 2023-02-28 2024-01-02 中科驭数(北京)科技有限公司 缓存数据存读方法、装置、设备和介质
CN116089477B (zh) * 2023-04-10 2023-08-08 荣耀终端有限公司 分布式训练方法及系统
CN117539802B (zh) * 2024-01-10 2024-04-05 中昊芯英(杭州)科技有限公司 一种缓存操作方法、系统以及相关装置

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109992530A (zh) * 2019-03-01 2019-07-09 晶天电子(深圳)有限公司 一种固态驱动器设备及基于该固态驱动器的数据读写方法
CN111752866A (zh) * 2019-03-28 2020-10-09 北京忆恒创源科技有限公司 存储设备的虚拟校验数据缓存
CN112817738A (zh) * 2019-11-15 2021-05-18 辉达公司 用于修改可执行图以实施与新任务图关联的工作负载的技术
CN112817739A (zh) * 2019-11-15 2021-05-18 辉达公司 用于修改可执行图以实施不同工作负载的技术

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5509129A (en) * 1993-11-30 1996-04-16 Guttag; Karl M. Long instruction word controlling plural independent processor operations
US6868472B1 (en) * 1999-10-01 2005-03-15 Fujitsu Limited Method of Controlling and addressing a cache memory which acts as a random address memory to increase an access speed to a main memory
CN106294205B (zh) * 2015-05-15 2019-12-10 北京国双科技有限公司 缓存数据处理方法及装置
CN108153682B (zh) * 2017-12-12 2020-10-27 西安交通大学 一种利用闪存内部并行性进行闪存转换层地址映射的方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109992530A (zh) * 2019-03-01 2019-07-09 晶天电子(深圳)有限公司 一种固态驱动器设备及基于该固态驱动器的数据读写方法
CN111752866A (zh) * 2019-03-28 2020-10-09 北京忆恒创源科技有限公司 存储设备的虚拟校验数据缓存
CN112817738A (zh) * 2019-11-15 2021-05-18 辉达公司 用于修改可执行图以实施与新任务图关联的工作负载的技术
CN112817739A (zh) * 2019-11-15 2021-05-18 辉达公司 用于修改可执行图以实施不同工作负载的技术

Also Published As

Publication number Publication date
CN114721844A (zh) 2022-07-08

Similar Documents

Publication Publication Date Title
CN114721844B (zh) 数据缓存方法和装置、计算机设备、存储介质
KR101814577B1 (ko) 프로세싱-인-메모리를 이용한 명령어 처리 방법 및 그 장치
US10572378B2 (en) Dynamic memory expansion by data compression
CN104202373A (zh) 移动云计算迁移方法及系统
WO2023050712A1 (zh) 一种深度学习业务的任务调度方法及相关装置
US20190057032A1 (en) Cache Coherence Management Method and Node Controller
WO2021232769A1 (zh) 一种存储数据的方法及数据处理装置
CN107888687B (zh) 一种基于分布式存储系统的代理客户端存储加速方法及系统
CN111416825A (zh) 线程间无锁日志管理方法和系统、终端、存储介质
US20220066928A1 (en) Pooled memory controller for thin-provisioning disaggregated memory
CN116501249A (zh) 一种减少gpu内存重复数据读写的方法及相关设备
CN113590508A (zh) 动态可重构的内存地址映射方法及装置
CN107562806B (zh) 混合内存文件系统的自适应感知加速方法及系统
US20180189040A1 (en) Automatic identification and generation of non-temporal store and load operations in a dynamic optimization environment
CN110222046B (zh) 列表数据的处理方法、装置、服务器和存储介质
JP2013196384A (ja) 制御装置、管理装置、情報処理システム、制御装置の動作方法、管理装置の動作方法、情報処理システムの動作方法およびプログラム
CN107656992B (zh) 面向多插入源的快照版本管理方法
US20140149691A1 (en) Data processing system and data processing method
CN114925078A (zh) 数据更新方法、系统、电子设备及存储介质
CN114048847A (zh) 一种图神经网络数据缓存方法、装置、设备及存储介质
CN114675959A (zh) 一种内存回收的方法及相关装置
CN113448897B (zh) 适用于纯用户态远端直接内存访问的优化方法
US11741017B2 (en) Power aware translation lookaside buffer invalidation optimization
CN107463512B (zh) 分布式高速存储系统的数据更新方法
CN117311997B (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