CN117407148A - 数据写入方法、读取方法、装置、电子设备以及存储介质 - Google Patents

数据写入方法、读取方法、装置、电子设备以及存储介质 Download PDF

Info

Publication number
CN117407148A
CN117407148A CN202210806780.3A CN202210806780A CN117407148A CN 117407148 A CN117407148 A CN 117407148A CN 202210806780 A CN202210806780 A CN 202210806780A CN 117407148 A CN117407148 A CN 117407148A
Authority
CN
China
Prior art keywords
storage area
space
memory
read
data
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.)
Pending
Application number
CN202210806780.3A
Other languages
English (en)
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.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies 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 Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN202210806780.3A priority Critical patent/CN117407148A/zh
Priority to PCT/CN2023/094808 priority patent/WO2024007745A1/zh
Publication of CN117407148A publication Critical patent/CN117407148A/zh
Pending legal-status Critical Current

Links

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/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation 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/5016Allocation 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
    • 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/50Allocation of resources, e.g. of the central processing unit [CPU]

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System Of A Hierarchy Structure (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请用于提供一种数据写入方法、读取方法、装置、电子设备以及存储介质。数据写入方法包括:确定待写入循环存储队列的第一数据;获取所述循环存储队列的全局写指针,所述循环存储队列包括多个存储区域,每个存储区域包括多个子区域,所述全局写指针指向所述多个存储区域中的第一存储区域;获取所述第一存储区域的第一写指针,根据所述第一存储区域的第一写指针确定所述第一存储区域中已被分配的空间大小;确定所述第一存储区域中已被分配的空间大小小于所述第一存储区域的空间大小,则通过针对所述第一存储区域实施FAA操作,以在所述第一存储区域中分配第一子区域;将所述第一数据写入所述第一子区域中。该方法能够提升系统性能,降低Cache Miss率。

Description

数据写入方法、读取方法、装置、电子设备以及存储介质
技术领域
本申请涉及数据存储技术领域,尤其涉及一种数据写入方法、读取方法、装置、电子设备以及存储介质。
背景技术
在操作系统中,循环存储队列是一种特殊的先进先出(First In First Out,FIFO)队列。循环存储队列将存储空间中的最后一个位置连接到第一个位置,形成逻辑上的环状空间。循环存储队列作为一种通用的数据结构,在网络通信收发数据包、内核profiling工具记录日志数据等场景被广泛使用,例如:数据平面开发工具(Data PlaneDevelopment Kit,DPDK)中实现了一个无锁循环存储队列,用来实现网卡和内核间的数据传输;在linux系统跟踪工具ftrace中,也使用循环存储队列来存取日志数据。
现有的循环存储队列包括对应的全局元数据,全局元数据包括全局写指针和全局读指针,线程可以在全局写指针位置进行数据存储,在全局读指针位置进行数据读取。现有的数据写入方法各个线程将相应的数据写入循环存储队列后,需要按照分配顺序先后执行顺序提交(commit)操作,导致写入数据的多个线程之间会有互相等待的问题。对于读取数据的多个线程之间也有类似相互等待操作,这种相互等待操作降低了系统运行效率。同时,各个线程共享全局元数据,每次判断读写位置都要读取全局元数据,每次执行读写操作都要更新全局元数据,造成总线抢占高,多核吞吐率差。
发明内容
本申请的一些实施方式提供了一种数据写入方法、读取方法、装置、电子设备以及存储介质,以下从多个方面介绍本申请,以下多个方面的实施方式和有益效果可互相参考。
第一方面,本申请实施方式提供了一种数据写入方法,应用于电子设备,数据写入方法的执行主体可以为线程、操作系统或安装有操作系统的电子设备。所述方法包括:
确定待写入循环存储队列的第一数据;
获取所述循环存储队列的全局写指针,所述循环存储队列包括多个存储区域,每个存储区域包括多个子区域,所述全局写指针指向所述多个存储区域中的第一存储区域;
获取所述第一存储区域的第一写指针,根据所述第一存储区域的第一写指针确定所述第一存储区域中已被分配的空间大小;
确定所述第一存储区域中已被分配的空间大小小于所述第一存储区域的空间大小,则通过针对所述第一存储区域实施FAA操作,以在所述第一存储区域中分配第一子区域;
将所述第一数据写入所述第一子区域中。
根据本申请实施方式,通过对循环队列进行分块管理,使用全局写指针分配写者位置,每个存储区域内本地统计已生产信息(包括写者相关的局部元数据:第一写指针allocated和第二写指针committed)。电子设备只需要访问存储区域内与写者相关的局部元数据来确定存储区域的可写状态,无需访问与读者相关的局部元数据和全局元数据,减轻了系统总线压力,减少了读者和写者之间的相互竞争干扰,以及减少了写者由于被读者更新元数据造成的缓存未命中(Cache Miss),提升了系统整体性能。并且,通过使用FAA指令来实现数据交换操作,记录已经分配的空间大小,无需考虑分配空间超上界的情况,有效降低了操作复杂度,减少了系统同步开销,同时提高了系统的可扩展性。
在一些实施方式中,所述方法还包括:
确定所述第一存储区域中已被分配的空间大小等于所述第一存储区域的空间大小,并且确定第二存储区域的状态为可写入状态,其中所述第二存储区域为与所述第一存储区域邻接的下一个存储区域;
更新所述全局写指针,以使得更新后的所述全局写指针指向所述第二存储区域。
根据本申请实施方式,电子设备在确定所述第一存储区域没有存储空间后,可以根据与所述第一存储区域邻接的下一个存储区域(即第二存储区域)的状态,来确定是否更新所述全局写指针。
在一些实施方式中,所述确定第二存储区域的状态为可写入状态包括:
确定所述第二存储区域是未被分配过的状态。
根据本申请实施方式,当所述第二存储区域未被分配过时,电子设备确定可以直接写入数据,无需判断第二存储区域中上一轮的读写情况。
在一些实施方式中,所述确定第二存储区域的状态为可写入状态包括:
确定所述第二存储区域中已被读取的空间大小等于所述第二存储区域的空间大小;以及
确定所述第二存储区域中已被读取的局部读回绕次数等于全局写回绕次数;
其中,所述全局写回绕次数是根据所述全局写指针确定的;
所述第二存储区域中已被读取的空间大小,以及已被读取的局部读回绕次数是基于所述第二存储区域的第二读指针确定的,所述第二存储区域的第二读指针是在当前的数据写入模式为第一模式的情形下所获取的。
根据本申请实施方式,在当前的数据写入模式为第一模式的情形下,电子设备在所述第二存储区域中上一轮还没有被读完时,不能更新所述全局写指针。否则可能出现将上一轮写入数据进行覆盖,从而导致数据丢失的情况发生。
应理解,本申请实施例中每个存储区域内本地内还统计已消费信息(包括读者相关的局部元数据:第一读指针reserved和第二读指针consumed)。电子设备在所述第一存储区域已经被分配完后,可以访问第二存储区域(即下一存储区域)内与读者相关的局部元数据来确定所述第二存储区域中上一轮是否被读完,在已经被读完的情况下才更新所述全局写指针,无需访问全局元数据,减轻了系统总线压力,提升了系统整体性能,并且降低了读者与读者、读者与写者之间的相互竞争干扰,保证了系统的可靠性。
此外,本申请实施例中确定所述存储区域中上一轮是否被读完使用的是该存储区域中已被读取的空间大小,是以存储区域的维度进行的判断。因此,在循环存储队列的各个存储区域内部,读者乱序销毁(consume)并不会影响对存储区域是否被读完的状态的判断,即乱序consume不会影响写入数据的正确性。因此,在循环存储队列的各个存储区域中读取数据后,线程可以不需要等待其它线程完成consume操作,避免了读者和读者之间的相互阻塞,从而提高了系统吞吐率。
在一些实施方式中,所述确定第二存储区域的状态为可写入状态包括:
确定所述第二存储区域中已被写入的空间大小等于所述第二存储区域的空间大小;以及
确定所述第二存储区域中已被写入的局部写回绕次数等于全局写回绕次数;
其中,所述全局写回绕次数是根据所述全局写指针确定的;
所述第二存储区域中已被写入的空间大小,以及已被写入的局部写回绕次数是基于所述第二存储区域的第二写指针确定的,所述第二存储区域的第二写指针是在当前的数据写入模式为第二模式的情形下所获取的。
根据本申请实施方式,在当前的数据写入模式为第二模式的情形下,电子设备在所述第二存储区域中上一轮还没有被写完时,不能更新所述全局写指针。否则可能产生两个线程同时写入数据到相同的子区域,从而造成系统异常。
应理解,本申请实施例中电子设备在所述第一存储区域已经被分配完后,可以访问第二存储区域(即下一存储区域)内与写者相关的局部元数据来确定所述第二存储区域中上一轮是否被写完,在已经被写完的情况下才更新所述全局写指针,无需访问全局元数据,减轻了系统总线压力,并且降低了写者与写者之间的相互竞争干扰,提升了系统整体性能。
第二方面,本申请实施方式提供了一种数据读取方法,应用于电子设备,所述方法包括:
获取存储有待读取数据的循环存储队列的全局读指针,所述循环存储队列包括多个存储区域,每个存储区域包括多个子区域,所述全局读指针指向所述多个存储区域中的第三存储区域;
获取所述第三存储区域的第一写指针和第二写指针,根据所述第三存储区域的第一写指针确定所述第三存储区域中已被分配的空间大小,根据所述第三存储区域的第二写指针确定所述第三存储区域中已被写入的空间大小;
确定所述第三存储区域中已被写入的空间大小等于所述第三存储区域中已被分配的空间大小,则通过针对所述第三存储区域实施MAX操作,以在所述第三存储区域中占用第二子区域;
读取所述第二子区域中存储的第二数据。
根据本申请实施方式,电子设备根据所述第三存储区域中已被写入的空间大小与所述第三存储区域中已被分配的空间大小,可以确定所述第三存储区域的commit状态。commit状态包括完全commit和未完全commit。完全commit表示所述第三存储区域中已被写入的空间大小等于所述第三存储区域中已被分配的空间大小,未完全commit表示所述第三存储区域中已被写入的空间大小小于所述第三存储区域中已被分配的空间大小。电子设备在确定所述第三存储区域的commit状态为完全commit时,通过使用MAX指令在所述第三存储区域中占用第二子区域,并读取第二子区域中的第二数据。
应理解,本申请实施例中通过对循环队列进行分块管理,使用全局读指针分配读者位置,每个存储区域内本地统计已生产信息(包括写者相关的局部元数据:第一写指针allocated和第二写指针committed)。电子设备可以访问存储区域内与写者相关的局部元数据来确定存储区域的commit状态,在存储区域的commit状态为完全commit时才进行数据的读取,可以减少读者与写者之间的相互竞争干扰。并且,本申请实施例中确定所述存储区域的commit状态使用的是该存储区域中已被写入的空间大小,是以存储区域的维度进行的判断。因此,在循环存储队列的各个存储区域内部,写者乱序commit并不会影响对commit状态的判断,即乱序commit不会影响读取的数据的正确性。因此,在循环存储队列的各个存储区域中写入数据后,线程可以不需要等待其它线程完成commit操作,避免了写者和写者之间的相互阻塞,从而提高了系统吞吐率。
在一些实施方式中,所述通过针对所述第三存储区域实施MAX操作,以在所述第三存储区域中占用第二子区域之前,所述方法还包括:
确定所述第三存储区域中已被占用的空间大小小于所述第三存储区域中已被写入的空间大小;
其中,所述第三存储区域中已被占用的空间大小是基于所述第三存储区域的第一读指针确定的。
根据本申请实施方式,电子设备可以根据所述第三存储区域中已被占用的空间大小与所述第三存储区域中已被写入的空间大小,来确定所述第三存储区域中已经被写入的子空间是否被占用完。电子设备在确定所述第三存储区域中已经被写入的子空间已经被占用完时,表征第三存储区域中还没有写入未被读取的数据,电子设备无法读取数据。因此,电子设备可以无需判断所述第三存储区域的commit状态,从而节约系统的处理资源。
应理解,本申请实施例中每个存储区域内本地内还统计已消费信息(包括读者相关的局部元数据reserved和consumed)。电子设备只需要访问存储区域内与读者相关的局部元数据来确定存储区域是否被占用完,无需访问全局元数据,减轻了系统总线压力,减少了读者和写者之间的相互竞争干扰,提升了系统整体性能。
在一些实施方式中,所述通过针对所述第三存储区域实施MAX操作,以在所述第三存储区域中占用第二子区域包括:
通过实施MAX操作对所述第三存储区域的第一读指针进行加1,并且确定所述第三存储区域的第一读指针是否被其他线程更新;
若所述第三存储区域的第一读指针未被其他线程更新,则在所述第三存储区域中占用第二子区域。
应理解,通过使用MAX指令来实现数据交换操作,记录已经占用的空间大小,无需考虑分配空间超上界的情况,有效降低了操作复杂度,减少了系统同步开销,同时提高了系统的可扩展性。
在一些实施方式中,所述读取所述第二子区域中存储的第二数据包括:
确定当前的数据写入模式为第二模式,并且所述第三存储区域中已被分配的局部写回绕次数等于所述第三存储区域中已被占用的局部读回绕次数,则读取并返回所述第二子区域中存储的第二数据;
其中,所述第三存储区域中已被分配的局部写回绕次数是基于所述第三存储区域的第一写指针确定的,所述第三存储区域中已被占用的局部读回绕次数是基于所述第三存储区域的第一读指针确定的。
根据本申请实施方式,电子设备可以根据所述第三存储区域中已被分配的局部写回绕次数与所述第三存储区域中已被占用的局部读回绕次数,来确定是否复写所述第二子区域。在当前的数据写入模式为第二模式的情形下,电子设备在确定复写了所述第二子区域时,表明所述第二子区域中存储的数据已经发生了改变,需要重新读取。
应理解,电子设备在当前的数据写入模式为第二模式的情形下,只需要访问存储区域内与读者相关的局部元数据来确定否复写了对应存储区域中的子区域,无需访问全局元数据,不仅可以确保读者读取的数据为最新一轮中写入的数据,保证数据读取的实时性,还可以减轻系统总线压力,提升系统整体性能。
在一些实施方式中,所述方法还包括:
确定所述第三存储区域中已被占用的空间大小等于所述第三存储区域的空间大小,并且确定第四存储区域的状态为可读取状态,其中所述第四存储区域为与所述第三存储区域邻接的下一个存储区域;
更新所述全局读指针,以使得更新后的所述全局读指针指向所述第四存储区域。
根据本申请实施方式,电子设备可以根据所述第三存储区域中已被占用的空间大小,来确定所述第三存储区域是否被占用完。电子设备在确定所述第三存储区域已经被占用完时,可以根据与所述第三存储区域邻接的下一个存储区域(即第四存储区域)的状态,来确定是否更新所述全局读指针。
在一些实施方式中,所述确定第四存储区域的状态为可读取状态包括:
确定所述第四存储区域中已被写入的局部写回绕次数等于所述全局读回绕次数加1;
其中,所述全局读回绕次数是根据所述全局读指针确定的;
所述第四存储区域中已被写入的局部写回绕次数是基于所述第四存储区域的第二写指针确定的,所述第四存储区域的第二写指针是在当前的数据写入模式为第一模式的情形下所获取的。
根据本申请实施方式,电子设备可以根据所述第四存储区域中已被写入的局部写回绕次数与所述全局读回绕次数,来确定所述第四存储区域中是否已经写入新的一轮数据。在当前的数据写入模式为第一模式的情形下,电子设备在确定所述第四存储区域中已经写入新的一轮数据时,确定所述第四存储区域的状态为可读取状态,并更新所述全局读指针。电子设备在确定所述第四存储区域中还没有写入新的一轮数据时,表示所述第四存储区域中还没有写入未被读取的数据,电子设备无法读取数据。电子设备在确定所述第四存储区域中已经写入新的不只一轮数据时,表明系统发生异常。
应理解,电子设备在确定所述第三存储区域已经被占用完时,可以访问第四存储区域(即下一存储区域)内与读者相关的局部元数据来确定所述第四存储区域中是否已经写入新的一轮数据,在已经写入新的一轮数据的情况下才更新所述全局读指针,能够减少全局元数据的访问,减轻了系统总线压力,提升了系统整体性能,保证了系统的可靠性。
在一些实施方式中,所述确定第四存储区域的状态为可读取状态包括:
确定所述第四存储区域中已被写入的局部写回绕次数大于或等于所述第三存储区域中已被占用的局部读回绕次数与目标增量之和;
其中,所述第四存储区域中已被写入的局部写回绕次数是基于所述第四存储区域的第二写指针确定的,所述第四存储区域的第二写指针是在当前的数据写入模式为第二模式的情形下所获取的;
所述第三存储区域中已被占用的局部读回绕次数是基于所述第三存储区域的第一读指针确定的,所述目标增量值是基于所述第三存储区域的位置确定的。
根据本申请实施方式,电子设备可以根据所述第四存储区域中已被写入的局部写回绕次数与所述第三存储区域中已被占用的局部读回绕次数,来确定所述第四存储区域中是否已经写入新的至少一轮数据。在当前的数据写入模式为第二模式的情形下,电子设备在确定所述第四存储区域中已经写入新的至少一轮数据时,确定所述第四存储区域的状态为可读取状态,并更新所述全局读指针。电子设备在确定所述第四存储区域中还没有写入新的一轮数据时,表示所述第四存储区域中还没有写入未被读取的数据,电子设备无法读取数据。
应理解,电子设备在确定所述第三存储区域已经被占用完时,可以访问第四存储区域(即下一存储区域)内与读者相关的局部元数据来确定所述第四存储区域中是否已经写入新的至少一轮数据,在已经写入新的至少一轮数据的情况下才更新所述全局读指针,能够减少全局元数据的访问,减轻了系统总线压力,提升了系统整体性能,保证了系统的可靠性。
在一些实施方式中,所述方法还包括:
通过针对所述第四存储区域实施MAX操作,以将所述第四存储区域中已被占用的局部读回绕次数设置为所述第四存储区域中已被写入的局部写回绕次数。
第三方面,本申请实施方式提供了一种数据写入装置,设置于电子设备,所述装置包括:
确定模块,用于确定待写入循环存储队列的第一数据;
第一获取模块,用于获取所述循环存储队列的全局写指针,所述循环存储队列包括多个存储区域,每个存储区域包括多个子区域,所述全局写指针指向所述多个存储区域中的第一存储区域;
第二获取模块,用于获取所述第一存储区域的第一写指针,根据所述第一存储区域的第一写指针确定所述第一存储区域中已被分配的空间大小;
分配模块,用于确定所述第一存储区域中已被分配的空间大小小于所述第一存储区域的空间大小,则通过针对所述第一存储区域实施FAA操作,以在所述第一存储区域中分配第一子区域;
写入模块,用于将所述第一数据写入所述第一子区域中。
第四方面,本申请实施方式提供了一种数据读取装置,设置于电子设备,所述装置包括:
第三获取模块,用于获取存储有待读取数据的循环存储队列的全局读指针,所述循环存储队列包括多个存储区域,每个存储区域包括多个子区域,所述全局读指针指向所述多个存储区域中的第三存储区域;
第四获取模块,用于获取所述第三存储区域的第一写指针和第二写指针,根据所述第三存储区域的第一写指针确定所述第三存储区域中已被分配的空间大小,根据所述第三存储区域的第二写指针确定所述第三存储区域中已被写入的空间大小;
占用模块,用于确定所述第三存储区域中已被写入的空间大小等于所述第三存储区域中已被分配的空间大小,则通过针对所述第三存储区域实施MAX操作,以在所述第三存储区域中占用第二子区域;
读取模块,用于读取所述第二子区域中存储的第二数据。
第五方面,本申请实施方式提供了一种电子设备,包括:存储器,用于存储由电子设备的一个或多个处理器执行的指令;处理器,当处理器执行存储器中的指令时,可使得电子设备执行本申请第一方面任一实施方式提供的数据写入方法或者执行本申请第二方面任一实施方式提供的数据读取方法。第五方面能达到的有益效果可参考本申请第一方面任一实施方式的有益效果或者参考本申请第二方面任一实施方式的有益效果,此处不再赘述。
第六方面,本申请实施方式提供了一种计算机可读存储介质,计算机可读存储介质上存储有指令,该指令在计算机上执行时使得计算机执行本申请第一方面任一实施方式提供的数据写入方法或者执行本申请第二方面任一实施方式提供的数据读取方法。第六方面能达到的有益效果可参考本申请第一方面任一实施方式的有益效果或者参考本申请第二方面任一实施方式的有益效果,此处不再赘述。
附图说明
图1为本申请一个实施例提供的应用场景示意图;
图2为本申请另一个实施例提供的应用场景示意图;
图3为本申请另一个实施例提供的应用场景示意图;
图4a为根据一些实施例的一种循环存储队列的结构示意图;
图4b至图4e为根据一些实施例的一种多写者写入数据的示意图;
图5为本申请一个实施例提供的数据写入方法的流程图;
图6为本申请一个实施例提供的循环存储队列的结构示意图;
图7为本申请另一个实施例提供的数据写入方法的流程图;
图8为本申请另一个实施例提供的循环存储队列的结构示意图;
图9为本申请一个实施例提供的数据读取方法的流程图;
图10为本申请另一个实施例提供的数据读取方法的流程图;
图11a至图11c示出了本申请一个实施例提供的性能对比示意图;
图12为本申请另一个实施例提供的性能对比示意图;
图13为本申请一个实施例提供的数据写入装置的框图;
图14为本申请一个实施例提供的数据读取装置的框图;
图15为本申请一个实施例提供的电子设备的框图;
图16为本申请一个实施例提供的片上系统(System on Chip,SOC)的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。为了便于理解本申请方案,下面先介绍本申请实施例所涉及的部分专业名词。
弱内存模型:在特定的中央处理器(Central Processing Unit,CPU)和工具链组合所定义的架构下,程序所执行的内存访问序列可能和代码编写的顺序产生不一致。存在任意内存访问重排的架构称之为弱内存序架构,其重排的规则称之为弱内存模型。
原子操作:原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有切换到另一个线程。
比较并交换(Compare And Swap,CAS)操作:一种原子操作,用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。
头部:在循环存储队列中,头部指下一次进行读写的位置。
写者(生产者、producer)/读者(消费者、consumer):生产者是指把数据写入循环存储队列的线程,消费者是指把数据从循环存储队列中读出的线程。
MAX操作:一种原子操作,类似CAS操作,用于比较两个值,如果第二个值大于第一个值,则将第二个值赋值给第一个值并返回更新前的第一个值;如果第二个值小于或等于第一个值,则直接返回第一个值,不更新。
读取并作加(Fetch And Add,FAA)操作:一种原子操作,用于将存储位置的内容增加指定的值。
图1示出了本申请一个实施例提供的应用场景示意图。如图1所示,本申请实施例提供的方法可以应用于存储产品的内存池(Memory pool)模块中。具体地,内存池110中压缩后的数据被写入循环存储队列120中,线程从循环存储队列120中进行数据读取,并将读取的数据存入对象缓存130中,以供操作系统内核140使用。本申请实施例提供的循环存储队列及对应的数据写入方法和数据读取方法可以提升产品端到端性能4%。
图2示出了本申请另一个实施例提供的应用场景示意图。如图2所示,本申请实施例提供的方法可以应用于网卡驱动收发数据包场景中。具体地,网卡驱动210通过循环存储队列211和内核空间220进行通信。当输入数据包到达网卡时,网卡驱动210先将输入数据包存储在网卡内存212中,并通过调用直接存储器访问引擎(Direct Memory Access Engine,DMA Engine)213将网卡内存212中的输入数据包逐个写入循环存储队列211中。DMAEngine213读完网卡内存212中的输入数据包后,中断发生器214可以触发一个中断请求。内核空间220的中断处理器221接收到所述中断请求后,网卡222可以注册poll函数,利用poll函数从循环存储队列211中读取数据包,并放入列表中,以将网卡内存212中存储的数据包转存至内核内存223中。当poll函数在读取数据包时,中断请求会被禁用,使得在poll函数读完所有数据包前不会由新的中断请求,在poll函数读完数据后,打开中断请求。互联网协议层224可以从列表中获取数据包,并放入套接字等待连接队列225,传输控制协议进程226可以从套接字等待连接队列225中获取数据包,并存入传输控制协议接收缓冲区227中,以发送至用户空间230的应用程序231。
图3示出了本申请另一个实施例提供的应用场景示意图。如图3所示,本申请实施例提供的方法可以应用于高频交易场景中。具体地,接收器310用于接收数据,并将接收到的数据写入输入干扰器320中的循环存储队列321中。日志记录器322、复制器223和解码器324可以读取循环存储队列321中的数据,来进行日志记录、复制和反序列化操作。业务逻辑消费者330可以读取循环存储队列321中的数据,并经过业务逻辑处理器340处理并发送至业务逻辑生产者350。业务逻辑生产者350可以将接收到的数据写入输出干扰器360中的循环存储队列361中。编码器362和发行器370可以读取循环存储队列361中的数据,来进行序列化和发行操作。
循环存储队列是一种特殊的先进先出队列,它将顺序队列首位相连,即存储空间最后一个位置连接到第一个位置,形成逻辑上的环状空间。循环存储队列不仅可以在上述Memory pool模块中使用,还可以在内核驱动框架中实现设备与协议栈之间的通信、网络通信收发数据包、内核profiling工具记录日志数据和并发控制基础库等场景使用。相比于顺序队列,循环存储队列实现更为复杂,需要考虑如读写回绕等特殊情况。特别是多读者多写者并发的情况,需要考虑读写者之间的同步,各个写者之间同步和各个读者之间的同步等复杂情况,特别是在弱内存模型,读写顺序存在不确定性,为实现带来了很大困难。
图4a示出了根据一些实施例的一种循环存储队列的结构示意图。如图4a所示,循环存储队列包括对应的全局写指针和全局读指针。沿逆时针方向,全局写指针和全局读指针之间的区域为存储区域b,全局读指针和全局写指针之间的区域为区域a。区域a中的数据即将被读取,区域b即将被写入数据。随着数据的写入和读取,全局写指针和全局读指针沿逆时针方向移动。例如,在线程1分配到了存储区域b1后,全局写指针移动至存储区域b2。在线程2分配到了存储区域b2后,全局写指针移动至存储区域b3。
在写入数据后,不同的线程按照分配顺序先后更新全局元数据,执行顺序commit操作。分配顺序是指全局写指针和全局读指针的移动方向。例如,在图4a中,分配顺序为逆时针方向。具体地,在存储区域b1中写入数据后,线程1执行commit操作。commit操作表征存储区域b1中已写入数据,存储区域b1中的数据可以被读取。类似地,在存储区域b2中写入数据后,线程2执行commit操作。commit操作表征存储区域b2中已写入数据,存储区域b2中的数据可以被读取。
在执行顺序commit时,即使线程2先于线程1写入数据,也必须等待线程1完成commit操作。如果线程1还未执行commit操作,线程2会进入等待状态,直至线程1完成commit操作后,才能执行commit操作。在等待期间,线程2需要频繁判断线程1是否完成commit操作,从而降低了系统的运行效率。
具体地,在实施方式一中,参考图4b至图4e,对于多读者多写者的无锁循环存储队列,当存在多个写者(局部变量核心1和局部变量核心2)向所述无锁循环存储队列中写入数据时,多个写者首先读取全局元数据中的全局写头指针prod_head,确定全局写入位置。如图4b所示,局部变量核心1和局部变量核心2均确定所述全局写头指针prod_head所指的位置410为全局写入位置(如局部变量核心1和局部变量核心2的prod_head所指)。
确定全局写入位置后,所述多个写者执行抢头操作,确认各自写入的位置。具体地,所述多个写者分别通过原子操作更新所述全局写头指针prod_head,若更新所述全局写头指针prod_head成功,则表示抢头成功。如图4c所示,局部变量核心1抢头成功,将所述全局写头指针prod_head更新为指向全局写入位置的下一个位置(如局部变量核心1的prod_next所指),并确定位置410为局部变量核心1写入的位置(如局部变量核心1的prod_head所指)。局部变量核心2抢头失败,则重新执行抢头操作,确定位置420为局部变量核心2写入的位置(如局部变量核心2的prod_head所指)。
然后,所述多个写者分别在各自写入的位置执行写操作。如图4d所示,局部变量核心1将数据obj4写入位置410,局部变量核心2将数据obj5写入位置420。写入数据后,所述多个写者按照分配顺序更新全局元数据中的全局写尾指针prod_tail,以执行commit操作。如图4e所示,局部变量核心1先执行commit操作,将所述全局写尾指针prod_tail更新为指向其写入的位置的下一个位置(如局部变量核心1的prod_next所指),操作完成后,局部变量核心2再执行commit操作。
当存在多个读者在所述无锁循环存储队列中读取数据时,与多个写者写入数据类似,多个读者读取全局元数据中的全局读头指针cons_head,来确定全局读取位置。并在读取数据后,按照占用顺序更新全局元数据中的全局读尾指针cons_tail,以执行consume操作。具体操作过程与上述多个写者写入数据类似,本申请实施例在此不再赘述。
上述实施方式中各个写者写入数据后按照分配顺序先后更新全局元数据,执行commit操作,后分配的写者需要等待前面的写者完成。对于多个读者也有类似相互等待操作,这种相互等待操作造成多核吞吐率差。每个线程共享全局元数据,每次判断读写位置都要读取全局元数据,每次执行读写操作都要更新全局元数据,造成总线抢占高,多核吞吐率差。
具体地,在实施方式二中,对于多读者多写者的无锁循环存储队列,对所述无锁循环存储队列设置两个全局元数据Head和Tail,分别表示所述无锁循环存储队列写入位置和读出位置。对每个存储区域设置一个Cycle、Index和IsSafe的位,Cycle表示循环存储队列的回绕次数,Index表示在循环存储队列中的偏移。该实施方式在写者乱序写入时,为保证操作的线性化,当读者超过乱序写入的写者时,需要关闭当前写入的存储区域,移向下一个存储区域再读取;另一种情形下,由于FAA不能原子的做判断并执行,可能导致读者位置超过写者位置,此时读者仍要关闭写入的存储区域。两种情景都会造成较大的性能损失。上述实施方式的具体内容可以参考文章“A Scalable,Portable,and Memory-Efficient Lock-Free FIFO Queue”中的相关描述,本申请实施例在此不再赘述。
为此,本申请实施例提供了一种数据写入方法、读取方法、装置、电子设备以及存储介质,用于降低缓存未命中率,提升系统整体性能。
根据本申请实施例提供的方法,通过对循环队列进行分块管理,使用全局写指针分配写者位置,每个存储区域内本地统计已生产信息(包括写者相关的局部元数据:第一写指针allocated和第二写指针committed)。电子设备根据第一存储区域的第一写指针allocated,可以确定第一存储区域中已被分配的空间大小,当第一存储区域中已被分配的空间大小小于第一存储区域的空间大小时,电子设备可以确定第一存储区域还有存储空间。电子设备在确定第一存储区域还有存储空间时,通过使用FAA指令在第一存储区域中分配第一子区域,来存储待储存的数据。
本申请实施例中通过对循环队列进行分块管理,使得读者和写者不在同一存储区域的情况下无相互竞争干扰,减小读者和写者数据竞争造成的Cache Miss,提升了系统性能。同时,电子设备在为写者分配存储空间的过程中,只需要访问存储区域内与写者相关的局部元数据来确定存储区域的可写状态,无需访问与读者相关的局部元数据和全局元数据,减轻了系统总线压力,减少了同一存储区域内读者和写者之间的相互竞争干扰,以及减少了写者由于被读者更新元数据造成的Cache Miss,进一步提升了系统整体性能。并且,通过使用FAA指令来实现数据交换操作,记录已经分配的空间大小,无需考虑分配空间超上界的情况,有效降低了操作复杂度,减少了系统同步开销,同时提高了系统的可扩展性。
需要说明的是,上述应用场景仅为示例,本申请实施例提供的方法还可以应用在其它使用循环存储队列的场景中,例如使用循环存储队列的操作系统内核中记录内核事件,以及进程间通信等场景。应理解,本申请中使用的“第一”、“第二”、“目标”等仅用于区分描述的目的,而不能理解为指示或暗示相对重要性,也不能理解为指示或暗示顺序。另外,为了简明和清楚,本申请多个附图中重复参考编号和/或字母。重复并不表明各种实施例和/或配置之间存在严格的限定关系。
以下介绍本申请实施例提供的数据写入方法的具体流程。
图5示出了本申请一个实施例提供的一种数据写入方法的实施流程示意图。应理解,数据写入方法的执行主体可以为线程、操作系统或安装有操作系统的电子设备。后续将以执行主体是电子设备为例,对数据写入方法进行描述。
本申请实施例采用了另一种循环存储队列。具体地,循环存储队列分为逻辑上的M个存储区域,M为大于1的整数,每个存储区域在逻辑上连续。每个存储区域分为逻辑上的N个子区域,N为大于1的整数,每个子区域在逻辑上连续。所述循环存储队列的队列头部中包括对应的全局元数据,全局元数据包括全局写指针和全局读指针。随着数据的写入和读取,全局写指针和全局读指针的位置沿逻辑方向不断变化。每个存储区域的区域头部中包括对应的局部元数据,所述局部元数据包括第一写指针allocated。
本申请实施例提供的循环存储队列中各个存储区域的空间大小可以相同,也可以不同;各个子区域的空间大小可以相同,也可以不同。各个存储区域/子区域的空间大小的具体值可以由用户根据实际需要进行预先设置,本申请实施例对此不作限制。优选地,各个存储区域的空间大小可以设置为相同,各个子区域的空间大小也可以设置为相同。
示例性地,图6示出了本申请一个实施例提供的循环存储队列的结构示意图。如图6所示,循环存储队列包括三个存储区域,三个存储区域的空间大小可以根据需要进行设置。本实施例中,为了说明方便,假定三个存储区域的空间大小相同。三个存储区域分别为存储区域610、存储区域620和存储区域630。每个存储区域均包括多个子区域,各个子区域的空间大小也可以根据需要进行设置。本实施例中,为了说明方便,假定各个子区域的空间大小相同。例如,存储区域610包括子区域611、子区域612和子区域613。三个存储区域对应三个第一写指针allocated,三个存储区域和三个allocated一一对应。
如图6所示,循环存储队列包括全局元数据640,全局元数据640包括全局写指针641和全局读指针642。在图6中,逻辑方向为逆时针方向。应理解,在实际应用中,逻辑方向还可以是顺时针方向。循环存储队列是逻辑上的环状空间。因此,全局写指针或全局读指针可以循环的经过相同的区域。
如图5所示,数据写入方法的流程包括以下步骤S501-S505。
S501:电子设备确定待写入循环存储队列的第一数据。
在不同的场景中,待写入循环存储队列的第一数据可以为不同类型的数据。例如,在使用循环存储队列的操作系统内核中记录内核事件场景中,所述第一数据为内核事件数据,在网卡驱动收发数据包场景中,所述第一数据为输入数据包,本申请实施例在此不作限定。
S502:电子设备获取所述循环存储队列的全局写指针,所述全局写指针指向所述循环存储队列中的存储区域610(作为第一存储区域的实例)。
本申请实施例中,电子设备可以从循环存储队列的队列头部中获取全局写指针,所述全局写指针指向存储区域610。具体地,全局写指针可以指向存储区域610的起始位置,起始位置可以是存储区域610的第一个字节。在写入数据的过程中,电子设备以子区域为单位写入数据。例如,存储区域610包括子区域611、子区域612和子区域613,电子设备将子区域611分配给了线程1,将子区域612分配给了线程2。线程1在第一个子区域611中写入数据,线程2在第二个子区域612中写入数据。
S503:电子设备获取存储区域610的第一写指针,根据存储区域610的第一写指针确定存储区域610中已被分配的空间大小。
本申请实施例中,每个存储区域对应一个局部元数据,局部元数据包括第一写指针allocated,allocated由64位组成,包含两个部分:offset和version。其中offset值用于表征最后一次写回绕中,最后分配的一个子区域在对应的存储区域中的位置,version值用于表征对应的存储区域中当前已被分配的局部写回绕次数。根据第一写指针allocated中的offset值可以确定最后一次写回绕中,对应的存储区域中已被分配的空间大小。
应理解,在本申请实施例中,存储区域610中已被分配的空间大小只包括电子设备在最后一次写回绕中已被分配的存储空间大小。具体地,随着数据的写入,电子设备循环的分配存储区域610的存储空间。例如,在第一次写回绕中,电子设备将存储区域610的三个子区域分配给了线程1、线程2和线程3。在第二次写回绕中,电子设备将存储区域610的三个子区域分配给了线程2、线程3和线程4。在最后一次写回绕中,电子设备仅将子区域611分配给了线程5。则存储区域610中已被分配的空间大小即为最后一次写回绕中分配的第一个子区域的空间大小。
本申请实施例中,第一写指针allocated中的offset值和version值是随着电子设备在存储区域中分配存储空间的分配操作而改变的。例如,存储区域610包括子区域611、子区域612和子区域613。存储区域610未被分配时,存储区域610的第一写指针allocated中的offset值和version值可以均是0。电子设备将子区域611分配给了线程1,此时,存储区域610的第一写指针allocated中的offset值变为1,电子设备将子区域612分配给了线程2,此时,存储区域610的第一写指针allocated中的offset值变为2。
S504:电子设备确定存储区域610中已被分配的空间大小小于存储区域610的空间大小,则通过针对存储区域610实施FAA操作,以在存储区域610中分配第一子区域。
本申请实施例中,电子设备可以将存储区域610中已被分配的空间大小与存储区域610的空间大小进行比较,从而确定存储区域610是否被分配完。当存储区域610中已被分配的空间大小小于存储区域610的空间大小,表示存储区域610未被分配完;否则表示存储区域610已经被分配完。
在一个实施例中,所述循环存储队列的全局元数据还可以包括各个存储区域的空间大小,电子设备可以从所述循环存储队列的队列头部中读取存储区域610的空间大小。或者,所述循环存储队列的各个存储区域的局部元数据还可以包括对应的空间大小,电子设备可以从存储区域610的区域头部中读取存储区域610的空间大小。应理解,存储区域610的空间大小可以预先根据需要进行设置,本申请实施例对此不作限制。
本申请实施例中,若电子设备确定存储区域610未被分配完,则电子设备通过针对存储区域610实施FAA操作,在存储区域610中分配第一子区域。具体地,可以通过执行FAA(blk.allocated,1)操作对存储区域610的第一写指针进行加1操作,以执行子区域的分配操作。执行FAA操作成功,则表征电子设备更新了存储区域610的第一写指针。
应理解,电子设备对存储区域610是否被分配完进行预检查,可以避免在多个线程写入数据时,即使在存储区域610中已被分配的空间大小大于或等于存储区域610的空间大小时还执行FAA操作,造成数据溢出和性能损失的问题。
S505:电子设备将所述第一数据写入所述第一子区域中。
本申请实施例中,是按照分配-写入数据-commit流程进行数据写入。电子设备确定在存储区域610中分配第一子区域成功后,将待写入循环存储队列的第一数据写入所述第一子区域中,并执行commit操作,以完成数据的写入。
在本申请的一个实施例中,参考附图7,图7示出了本申请另一个实施例提供的一种数据写入方法的实施流程示意图。如图7所示,该流程包括以下步骤S701-S712。
S701:电子设备确定待写入循环存储队列的第一数据。
其中,在步骤S701中的具体内容可以参考图5所示的实施例的相关描述,本申请实施例在此不再赘述。
S702:电子设备获取所述循环存储队列的当前全局写指针,所述当前全局写指针指向当前存储区域。
其中,电子设备可以从循环存储队列的队列头部中获取当前全局写指针,循环存储队列的描述可以参考前述图5或图6的相关描述。电子设备获取循环存储队列当前的全局写指针,当前的全局写指针也称为当前全局写指针,当前全局写指针指向所述循环存储队列中的存储区域610(作为第一存储区域的实例),存储区域610也称为当前存储区域。
具体地,所述循环存储队列的队列头部可以用于存储对应的全局元数据,全局元数据包括全局写指针widx和全局读指针ridx。全局写指针widx和全局读指针ridx由64位组成,分别表示当前读(ridx)写(widx)的存储区域的索引。widx和ridx由两部分组成:index和version,index值表示当前读写存储区域的位置,例如当前读写存储区域的编号;version值表示当前的全局读写回绕次数。index的位数算法如下:
|index|=log2(num_block)bits
其中,num_block表示存储区域的数量,可以由用户设置,在初始化时存入队列配置信息(buffer config)中,也就是说,循环存储队列的队列头部还可以用于存储队列大小(即存储区域的数量)、每个存储区域的空间大小等配置信息。widx和ridx中除|index|位以外的剩余位数即是|version|。其中index占全局元数据的低|index|位,version占高|version|位。在队列初始化时,所有的version值为0。
示例性地,图8示出了本申请另一个实施例提供的循环存储队列的结构示意图。如图8所示,循环存储队列包括3个存储区域。3个存储区域分别为存储区域810、存储区域820和存储区域830。存储区域810包括子区域811、子区域812和子区域813,存储区域820包括子区域821、子区域822和子区域823,存储区域830包括子区域831、子区域832和子区域833。循环存储队列还包括队列头部800。队列头部800可以用于存储全局写指针widx和全局读指针ridx。在图8中,全局写指针widx指向存储区域820,全局读指针ridx指向存储区810。
S703:电子设备获取所述当前存储区域的第一写指针,根据所述当前存储区域的第一写指针确定所述当前存储区域中已被分配的空间大小。
其中,电子设备可以从所述当前存储区域的区域头部中获取第一写指针,当前存储区域的描述可以参考前述图5或图6的相关描述。
具体地,每个存储区域还可以包括对应的区域头部,区域头部用于存储对应的局部元数据,所述局部元数据可以包括4个指针:第一写指针allocated、第二写指针committed、第一读指针reserved和第二读指针consumed。和全局元数据类似,局部元数据也由64位组成包含两个部分:offset和version。其中,allocated/reserved中的offset值用于表征最后一次写/读回绕中,最后分配/占用的一个子区域在对应的存储区域中的位置,根据allocated/reserved中的offset值可以确定最后一次写/读回绕中,对应的存储区域中已被分配/已被占用的空间大小;allocated/reserved中的version值用于表征对应的存储区域中当前已被分配的局部写回绕次数/当前已被占用的局部读回绕次数。committed/consumed中的offset值用于表征最后一次写/读回绕中,对应的存储区域中已被写入/已被读取的空间大小;committed/consumed中的version值用于表征对应的存储区域中当前已被写入的局部写回绕次数/当前已被读取的局部读回绕次数。
具体地,offset的位数的算法如下:
|offset|=1+log2(block_size)bits
其中,block_size表示子区域的数量,可以由用户设置,在初始化时存入队列配置信息(buffer config)中。allocated、committed、reserved、consumed中除|offset|位以外的剩余位数即是version的位数|version|,其中offset占局部元数据的低|offset|位,version占高|version|位。在队列初始化时,所有的version值为0。
示例性地,如图8所示,存储区域810包括区域头部814。区域头部814用于存储存储区域810的局部元数据,包括allocated、committed、reserved、consumed。类似地,存储区域820包括区域头部824。存储区域830包括区域头部834。
S704:电子设备确定所述当前存储区域中已被分配的空间大小是否小于所述当前存储区域的空间大小。
本申请实施例中,电子设备可以将所述当前存储区域中已被分配的空间大小与所述当前存储区域的空间大小进行比较,从而确定当前存储区域是否被分配完。若电子设备确定所述当前存储区域未被分配完,电子设备执行步骤S705;若电子设备确定所述当前存储区域已经被分配完,电子设备执行步骤S708。
S705:电子设备通过针对所述当前存储区域实施FAA操作,以在所述当前存储区域中分配第一子区域。
其中,在步骤S702至步骤S705中的其它相关内容可以参考图5所示的实施例的相关描述,本申请实施例在此不再赘述。
S706:电子设备再次确定实施FAA操作之前所述当前存储区域中已被分配的空间大小是否小于所述当前存储区域的空间大小。
本申请实施例中,由于可能存在多个同时写入数据的线程,电子设备需要分别针对所述当前存储区域实施FAA操作,为各个线程分配子区域。为了避免同时执行FAA操作,导致当前存储区域中的子区域被分配完的情况,所述步骤S705之后,还可以执行步骤S706。
具体地,可以获取实施FAA操作之前当前存储区域的第一写指针(记为blk.allocated)中的offset值,对获取的offset值进行重新检查,确定所述当前存储区域中已被分配的空间大小是否仍然小于所述当前存储区域的空间大小。若是,则返回分配的第一子区域的信息,电子设备执行步骤S707;若否,则确定所述当前存储区域已经被分配完(即没有存储空间),电子设备执行步骤S708。
在实际应用中,每个子区域还可以包括对应的元数据offset,元数据offset用于指示该子区域在对应的存储区域中的位置。电子设备返回在当前存储区域中分配的子区域的信息EntryDesc,EntryDesc包括block和offset两个部分,其中,block值表示分配的子区域所在的存储区域(即所述当前存储区域),offset值表示分配的子区域在对应的存储区域中的位置。
S707:电子设备将所述第一数据写入所述第一子区域中。
其中,在步骤S707中的具体内容可以参考图5所示的实施例的相关描述,本申请实施例在此不再赘述。电子设备执行commit操作过程中,还可以对当前存储区域的第二写指针进行加1,若电子设备执行commit操作成功,则表征电子设备更新了当前存储区域的第二写指针。
S708:在所述当前存储区域已经被分配完的情况下,电子设备确定下一存储区域是否是未被分配过的状态。
其中,下一存储区域为与当前存储区域逻辑相邻的下一个存储区域,即与当前存储区域邻接的沿逻辑方向上的下一个存储区域。例如,在图8中,若当前存储区域为存储区域830,则下一存储区域为与存储区域830邻接的存储区域810。当电子设备确定当前存储区域已经被分配完时,可以确定下一存储区域是否是未被分配过的状态。若电子设备确定下一存储区域是未被分配过的状态,电子设备即可确定下一存储区域的状态为可写入状态。此时,电子设备确定可以更新所述当前全局写指针,电子设备执行步骤S711;若电子设备确定下一存储区域是已经被分配过的状态,则电子设备执行步骤S709或执行步骤S710。
具体地,电子设备可以根据下一存储区域对应的第一写指针allocated确定下一个存储区域是否被分配过。如果下一存储区域对应的第一写指针allocated中的offset值和version值均为0,则电子设备确定下一存储区域未被分配过;如果下一存储区域对应的第一写指针allocated中的offset值或version值不为0,则电子设备确定下一存储区域已经被分配过。
S709:电子设备确定所述下一存储区域中上一轮是否被读完。
本申请实施例中,当电子设备确定下一存储区域已经被分配过时,电子设备可以确定当前的数据写入模式,若当前的数据写入模式为retry-new模式(作为第一模式的实例),则当所述下一存储区域中上一轮还没有被读完时,不继续写入覆盖数据,以减少数据的丢失。因此,电子设备在当前的数据写入模式为retry-new模式时,可以先确定所述下一存储区域中上一轮是否被读完,在已经被读完的情况下,确定所述下一存储区域的状态为可写入状态。此时,电子设备确定可以更新所述当前全局写指针,电子设备执行步骤S711;若电子设备确定所述下一存储区域中上一轮还没有被读完,下一存储区域的状态为不可写入状态,则电子设备执行步骤S712。
具体地,电子设备在当前的数据写入模式为retry-new模式时,可以获取下一存储区域的第二读指针consumed,并根据所述下一存储区域的第二读指针consumed中的offset值确定所述下一存储区域中已被读取的空间大小,根据所述下一存储区域的第二读指针consumed中的version值确定所述下一存储区域中已被读取的局部读回绕次数。电子设备根据所述当前全局写指针确定全局写回绕次数。电子设备确定所述下一存储区域中已被读取的空间大小等于所述下一存储区域的空间大小,并且确定所述下一存储区域中已被读取的局部读回绕次数等于所述全局写回绕次数时,可以确定所述下一存储区域中上一轮已经被读完,下一存储区域的状态为可写入状态,电子设备执行步骤S711。其中,所述下一存储区域的空间大小也可以预先根据实际需要进行设置,本申请实施例对此也不作限制。
具体地,若电子设备确定所述下一存储区域中已被读取的空间大小不等于所述下一存储区域的空间大小,表示下一存储区域中上一轮还没有被读完,下一存储区域的状态为不可写入状态,电子设备执行步骤S712。
具体地,在前述步骤S702中,电子设备获取了当前全局写指针。在多线程并发的场景中,可能存在其它线程已经修改了当前全局写指针的情况。例如存在其它线程完成了后续的步骤S711。因此,电子设备通过判断所述下一存储区域中已被读取的局部读回绕次数是否等于全局写回绕次数,来判断是否已经有其他线程已经更新了所述当前全局写指针。若上述条件不满足,表示已经有其他线程已经更新了所述当前全局写指针,这种情况下则不再更新所述当前全局写指针,电子设备执行步骤S712。
在一个实施例中,在下一存储区域中上一轮还没有被读完的情况下,电子设备还可以获取下一存储区域的第一读指针reserved,并根据所述下一存储区域的第一读指针reserved中的offset值确定所述下一存储区域中已被占用的空间大小。电子设备可以确定所述下一存储区域中已被占用的空间大小是否等于所述下一存储区域中已被读取的空间大小,若是,表示下一存储区域中上一轮还没有被写完(即该存储区域中不是所有的子区域都commite),但是所有已经写完的子区域都已经被读完,这种情况下可以定义为队列已满,不能再写入,电子设备返回FULL,并执行步骤S712。其他情况下表示其他线程正在进行写入或读取操作,电子设备返回BUSY,并执行步骤S712。
S710:电子设备确定所述下一存储区域中上一轮是否被写完。
本申请实施例中,若当前的数据写入模式为drop-old模式(作为第二模式的实例),则当所述下一存储区域中上一轮还没有被读完时,直接写入覆盖数据,以提高写入数据的效率。因此,电子设备在当前的数据写入模式为drop-old模式时,只需判断所述下一存储区域中上一轮是否被写完,在所述下一存储区域中上一轮已经被写完的情况下,确定所述下一存储区域的状态为可写入状态。此时,电子设备确定可以更新所述当前全局写指针,电子设备执行步骤S711;若电子设备确定所述下一存储区域中上一轮还没有被写完,下一存储区域的状态为不可写入状态,则电子设备执行步骤S712。
具体地,电子设备在当前的数据写入模式为drop-old模式时,可以获取下一存储区域的第二写指针committed,并根据所述下一存储区域的第二写指针committed中的offset值确定所述下一存储区域中已被写入的空间大小,根据所述下一存储区域的第二写指针committed中的version值确定所述下一存储区域中已被写入的局部写回绕次数。电子设备根据所述当前全局写指针确定全局写回绕次数。电子设备确定所述下一存储区域中已被写入的空间大小等于所述下一存储区域的空间大小,并且确定所述下一存储区域中已被写入的局部写回绕次数等于全局写回绕次数时,可以确定所述下一存储区域中上一轮已经被写完,下一存储区域的状态为可写入状态,电子设备执行步骤S711。。
具体地,若电子设备确定所述下一存储区域中已被写入的空间大小不等于所述下一存储区域的空间大小,表示下一存储区域中上一轮还没有被写完(即该存储区域中的子区域还没有完全被commit),下一存储区域的状态为不可写入状态,电子设备返回BUSY,并执行步骤S712。若电子设备确定所述下一存储区域中已被写入的局部写回绕次数不等于全局写回绕次数,表示发生异常,电子设备执行步骤S712。
S711:电子设备更新所述当前全局写指针,以使得更新后的所述当前全局写指针指向下一存储区域。
本申请实施例中,电子设备可以通过针对所述下一存储区域的第一写指针和第二写指针实施MAX操作,以将所述下一存储区域的第一写指针和第二写指针加1。电子设备可以通过针对所述当前全局写指针实施MAX操作,以更新所述当前全局写指针,使得所述当前全局写指针指向下一存储区域。
应理解,电子设备在更新元数据时先更新局部元数据,再更新全局元数据,并且在retry-new模式下,当存储区域被写完后,只有在被读者读完后才更新对应的局部元数据,能够减少读者和写者之间的相互竞争干扰,减少读者的Cache Miss。
S712:结束。其中,结束可以是指电子设备中的当前线程放弃存储所述第一数据,或者电子设备中的当前线程回到步骤S702。
本申请实施例中,电子设备执行所述步骤S711之后,可以返回至步骤S702,此时,当前全局写指针指向下一个存储区域,可以将下一个存储区域作为当前存储区域,以在下一个存储区域中分配第一子区域,并将所述第一数据写入所述第一子区域中,完成数据的写入。
以下介绍本申请实施例提供的数据读取方法的具体流程。
图9示出了本申请一个实施例提供的一种数据读取方法的实施流程示意图。应理解,数据读取方法的执行主体可以为线程、操作系统或安装有操作系统的电子设备。后续将以执行主体是电子设备为例,对数据读取方法进行描述。本申请实施例中,所述循环存储队列的描述可以参考前述图7或图8的相关描述。如图9所示,该流程包括以下步骤S901-S904。
S901:电子设备获取存储有待读取数据的循环存储队列的全局读指针,所述全局读指针指向所述循环存储队列中的存储区域810(作为第三存储区域的实例)。
在不同的场景中,所述待读取数据可以为不同类型的数据。例如,在使用循环存储队列的操作系统内核中记录内核事件场景中,所述待读取数据为内核事件数据,在网卡驱动收发数据包场景中,所述待读取数据为输入数据包,本申请实施例在此不作限定。
本申请实施例中,电子设备可以从循环存储队列的队列头部中获取全局读指针,所述全局读指针指向存储区域810。具体地,全局读指针可以指向存储区域810的起始位置,起始位置可以是存储区域810的第一个字节。在读取数据的过程中,电子设备以子区域为单位读取数据。例如,如图8所示,存储区域810包括子区域811、子区域812和子区域813,电子设备将子区域811分配给了线程1,将子区域812分配给了线程2。线程1读取第一个子区域811中的数据,线程2读取第二个子区域812中的数据。
S902:电子设备获取存储区域810的第一写指针和第二写指针,根据存储区域810的第一写指针确定存储区域810中已被分配的空间大小,根据存储区域810的第二写指针确定存储区域810中已被写入的空间大小。
本申请实施例中,所述循环存储队列的每个存储区域的区域头部存储对应的局部元数据,所述局部元数据包括第一写指针allocated和第二写指针committed。所述局部元数据的描述可以参考前述图7或图8的相关描述。
应理解,在本申请实施例中,存储区域810中已被分配的空间大小只包括电子设备在最后一次写回绕中已被分配的存储空间大小,存储区域810中已被写入的空间大小只包括电子设备在最后一次写回绕中已被写入的存储空间大小。
本申请实施例中,第一写指针allocated/第二写指针committed中的offset值和version值是随着电子设备在存储区域中分配存储空间的分配操作/commit操作而改变的。例如,存储区域810包括子区域811、子区域812和子区域813。存储区域810未被分配时,存储区域810的第一写指针中的offset值和version值可以均是0。电子设备将子区域811分配给了线程1,此时,存储区域810的第一写指针中的offset值变为1,电子设备将子区域812分配给了线程2,此时,存储区域810的第一写指针中的offset值变为2。线程1向子区域811写入数据后,执行commit操作,此时,存储区域810的第二写指针中的offset值变为1,线程2向子区域812写入数据后,执行commit操作,此时,存储区域810的第二写指针中的offset值变为2。
S903:电子设备确定存储区域810中已被写入的空间大小等于存储区域810中已被分配的空间大小,则通过针对存储区域810实施MAX操作,以在存储区域810中占用第二子区域。
本申请实施例中,电子设备根据存储区域810中已被写入的空间大小与存储区域810中已被分配的空间大小可以确定存储区域810的commit状态。commit状态包括完全commit和未完全commit。当电子设备确定存储区域810中已被写入的空间大小等于存储区域810中已被分配的空间大小时,确定存储区域810的commit状态为完全commit;否则确定存储区域810的commit状态为未完全commit(即还存在一些子区域已经被分配但是还没有commit)。在向存储区域810写入数据前,电子设备需要将存储区域810中的存储空间分配给一个或多个线程。根据前面的描述可知,电子设备循环的在存储区域810中写入数据,因此,电子设备循环的将第三存储空间中的存储空间分配给线程。应理解,在本申请实施例中,存储区域810中已被分配的空间大小只包括电子设备在最后一次写回绕中分配的空间大小,存储区域810中已被写入的空间大小只包括电子设备在最后一次写回绕中写入数据的空间大小。
本申请实施例中,若电子设备确定存储区域810的commit状态为完全commit,即确定存储区域810为可读取状态,则电子设备通过针对存储区域810实施MAX操作,在存储区域810中占用第二子区域。若电子设备确定存储区域810的commit状态为未完全commit,即确定存储区域810为不可读取状态,电子设备返回BUSY,并结束流程。
在一个实施例中,若电子设备确定存储区域810的commit状态为完全commit,还可以获取存储区域810的第一读指针reserved,根据所述第一读指针reserved中的offset值确定存储区域810中已被占用的空间大小。当电子设备确定存储区域810中已被占用的空间大小小于存储区域810中已被写入的空间大小时,可以确定存储区域810中已经被写入的子空间还没有被占用完;否则可以确定存储区域810中已经被写入的子空间已经被占用完。当电子设备确定存储区域810中已经被写入的子空间还没有被占用完时,电子设备通过针对存储区域810实施MAX操作,在存储区域810中占用第二子区域。当电子设备确定存储区域810中已经被写入的子空间已经被占用完时,确定存储区域810中没有已经写入的数据可以被读取,电子设备返回EMPTY,并结束流程,或者电子设备更新所述全局读指针。
应理解,在本申请实施例中,存储区域810中已被占用的空间大小只包括电子设备在最后一次读回绕中占用的空间大小。通过确定存储区域810中已经被写入的子空间是否已经被占用完,保证了读者不会超过写者,避免了读者读取到老数据。
具体地,电子设备可以通过实施MAX操作对存储区域810的第一读指针进行加1,并且确定存储区域810的第一读指针是否被其他线程更新;若存储区域810的第一读指针未被其他线程更新,则确定在存储区域810中占用第二子区域。
在实际应用中,电子设备可以通过执行MAX(blk.reserved,reversed+1)操作对存储区域810的第一读指针进行加1操作,以执行子区域的占用操作。执行MAX操作成功,则表征电子设备更新了存储区域810的第一读指针。其中,blk.reserved表示再次获取的存储区域810当前的第一读指针,reversed表示步骤S902中获取的第一读指针。
本申请实施例中,由于可能存在多个同时读取数据的线程,电子设备需要分别针对存储区域810实施MAX操作,为各个线程占用子区域。为了避免同时执行MAX操作,导致存储区域810中已经被写完的子区域被分配完的情况,电子设备可以将再次获取的存储区域810当前的第一读指针与步骤S902中获取的第一读指针进行比较。若确定再次获取的存储区域810当前的第一读指针与步骤S902中获取的第一读指针相同,则电子设备确定存储区域810的第一读指针未被其他线程更新,则执行MAX操作成功,即确定在存储区域810中成功占用第二子区域,电子设备返回在存储区域810中占用的第二子区域的信息。若确定再次获取的存储区域810当前的第一读指针与步骤S902中获取的第一读指针不相同,则电子设备确定存储区域810的第一读指针已经被其他线程更新,则执行MAX操作失败,电子设备确定已经为其他线程占用了存储区域810中的子区域,电子设备需要重新进行占用,即电子设备返回步骤S901。
在实际应用中,每个子区域还可以包括对应的元数据offset,元数据offset用于指示该子区域在对应的存储区域中的位置。电子设备返回的在存储区域810中占用的子区域的信息EntryDesc包括block、offset和version三个部分,其中,block值表示占用的子区域所在的存储区域(即存储区域810),offset值表示占用的子区域在对应的存储区域中的位置,version值用来在当前的数据写入模式为drop-old模式(作为第二模式的实例)时,检验数据的一致性。
应理解,电子设备对存储区域810的第一读指针是否已经被其他线程更新进行判断,可以避免在多个线程读取数据时,即使在存储区域810中已被占用的空间大小大于或等于存储区域810中已被写入的空间大小时还执行占用操作,造成数据溢出和性能损失的问题。
S904:电子设备读取所述第二子区域中存储的第二数据。
本申请实施例中,是按照占用-读出数据-consume流程进行数据读取。电子设备确定在存储区域810中占用第二子区域成功后,读取所述第二子区域中存储的第二数据,并执行consume操作,以完成数据的读取。
在本申请的一个实施例中,参考附图10,图10示出了本申请另一个实施例提供的一种数据读取方法的实施流程示意图。如图10所示,该流程包括以下步骤S1001-S1012。
S1001:电子设备获取存储有待读取数据的循环存储队列的当前全局读指针,所述当前全局读指针指向当前存储区域。
本申请实施例中,电子设备可以从循环存储队列的队列头部中获取当前全局读指针,循环存储队列的描述可以参考前述图7或图8的相关描述。电子设备获取循环存储队列当前的全局读指针,当前的全局读指针也称为当前全局读指针,当前全局读指针指向所述循环存储队列中的存储区域810(作为第三存储区域的实例),存储区域810也称为当前存储区域。
S1002:电子设备获取所述当前存储区域的第一写指针和第二写指针,根据所述当前存储区域的第一写指针确定所述当前存储区域中已被分配的空间大小,根据所述当前存储区域的第二写指针确定所述当前存储区域中已被写入的空间大小。
本申请实施例中,电子设备可以从所述当前存储区域的区域头部中获取第一写指针和第二写指针,当前存储区域的描述可以参考前述图7或图8的相关描述。
S1003:电子设备确定所述当前存储区域中已被写入的空间大小是否等于所述当前存储区域中已被分配的空间大小。
本申请实施例中,当电子设备确定所述当前存储区域中已被写入的空间大小等于所述当前存储区域中已被分配的空间大小时,确定所述当前存储区域的commit状态是否为完全commit;否则确定所述当前存储区域的commit状态是否为未完全commit。若电子设备确定所述当前存储区域的commit状态为完全commit,即确定所述当前存储区域为可读取状态,电子设备执行步骤S1004。若电子设备确定所述当前存储区域的commit状态为未完全commit,即确定所述当前存储区域为不可读取状态,电子设备返回BUSY,并执行执行步骤S1012。
S1004:电子设备获取所述当前存储区域的第一读指针,根据所述当前存储区域的第一读指针确定所述当前存储区域中已被占用的空间大小。
本申请实施例中,电子设备可以从所述当前存储区域的区域头部中获取第一读指针,当前存储区域的描述可以参考前述图7或图8的相关描述。
S1005:电子设备确定所述当前存储区域中已被占用的空间大小是否小于所述当前存储区域中已被写入的空间大小。
本申请实施例中,当电子设备确定所述当前存储区域中已被占用的空间大小小于所述当前存储区域中已被写入的空间大小时,可以确定所述当前存储区域中已经被写入的子空间还没有被占用完;否则可以确定所述当前存储区域中已经被写入的子空间已经被占用完。当电子设备确定所述当前存储区域中已经被写入的子空间还没有被占用完时,电子设备执行步骤S1006;当电子设备确定所述当前存储区域中已经被写入的子空间已经被占用完时,电子设备执行步骤S1008。
S1006:在确定所述当前存储区域中已经被写入的子空间还没有被占用完的情况下,电子设备通过针对所述当前存储区域实施MAX操作,以在所述当前存储区域中占用第二子区域。
S1007:电子设备读取所述第二子区域中存储的第二数据。
其中,在步骤S1001至步骤S1007中的具体内容可以参考图9所示的实施例的相关描述,本申请实施例在此不再赘述。
在一个实施例中,由于在当前的数据写入模式为drop-old模式(作为第二模式的实例)时,在下一存储区域中上一轮还没有被读完时,可以直接写入覆盖数据。因此,在当前的数据写入模式为drop-old模式时,电子设备读取所述第二子区域中存储的第二数据后,可以判断是否复写了所述第二子区域。若电子设备确定没有复写所述第二子区域,则电子设备返回所述第二子区域中存储的第二数据。若电子设备确定复写了所述第二子区域,则电子设备不返回所述第二数据,返回空值,并返回步骤S1001。
具体地,电子设备确定当前的数据写入模式为drop-old模式时,可以根据所述当前存储区域的第一写指针allocated中的version值确定所述当前存储区域中已被分配的局部写回绕次数,根据所述当前存储区域的第一读指针reserved中的version值确定所述当前存储区域中已被占用的局部读回绕次数。当所述当前存储区域中已被分配的局部写回绕次数等于所述当前存储区域中已被占用的局部读回绕次数时,电子设备可以确定没有复写所述第二子区域;否则电子设备可以确定复写了所述第二子区域。
在实际应用中,电子设备在所述当前存储区域中占用第二子区域时,可以将所述当前存储区域的第一读指针reserved中的version值保存在所述第二子区域对应的version中,再将保存的所述第二子区域对应的version值与所述当前存储区域的第一写指针allocated中的version值进行比较。若相同,则电子设备确定没有复写所述第二子区域;若不相同,则电子设备确定复写了所述第二子区域。
应理解,本申请实施例中读者先从循环存储队列中读取数据,再根据当前存储区域中的第一写指针allocated中的version值和第二子区域对应的version值来比较判断是否复写了所述第二子区域,如果被复写则重新读取。本申请实施例提供的方法使得投机读能够方便实现,并且不用考虑数据在尾部不连续存放的情况,降低了Cache Miss率,提升了系统整体性能。
S1008:电子设备确定所述当前存储区域中已被占用的空间大小是否等于所述当前存储区域的空间大小。
本申请实施例中,当电子设备确定所述当前存储区域中已经被写入的子空间已经被占用完时,可以确定所述当前存储区域中已被占用的空间大小是否等于所述当前存储区域的空间大小,从而确定当前存储区域是否被占用完(即当前存储区域中的所有子区域已经被写完并且已经被占用完)。
在一个实施例中,所述循环存储队列的全局元数据还可以包括各个存储区域的空间大小,电子设备可以从所述循环存储队列的队列头部中读取所述当前存储区域的空间大小。或者,所述循环存储队列的各个存储区域的局部元数据还可以包括对应的空间大小,电子设备可以从所述当前存储区域的区域头部中读取所述当前存储区域的空间大小。应理解,所述当前存储区域的空间大小可以预先根据需要进行设置,本申请实施例对此不作限制。
本申请实施例中,若电子设备确定所述当前存储区域中已被占用的空间大小等于所述当前存储区域的空间大小,则确定当前存储区域已经被占用完,否则确定当前存储区域还没有被占用完。当电子设备确定当前存储区域已经被占用完时,电子设备确定需要更新所述全局读指针,电子设备执行步骤S1009或步骤S1010。当电子设备确定当前存储区域还没有被占用完时,表明所述当前存储区域中已经被写入的子空间已经被占用完,但还存在没有被分配的子空间,此时电子设备可以确定所述当前存储区域中没有数据可以被读取,电子设备返回EMPTY,并执行执行步骤S1012。
S1009:电子设备确定下一存储区域中是否已经写入新的一轮数据。
其中,下一存储区域为与当前存储区域逻辑相邻的下一个存储区域,即与当前存储区域邻接的沿逻辑方向上的下一个存储区域。例如,在图8中,若当前存储区域为存储区域830,则下一存储区域为与存储区域830邻接的存储区域810。当电子设备确定当前存储区域已经被占用完,需要更新所述全局读指针时,电子设备可以确定当前的数据写入模式。若当前的数据写入模式为retry-new模式(作为第一模式的实例),则在下一存储区域中已经写入新的一轮数据的情况下,电子设备确定所述下一存储区域的状态为可读取状态。在下一存储区域中还没有写入新的一轮数据,或者已经写入更多轮数据的情况下,电子设备确定所述下一存储区域的状态为不可读取状态。若电子设备确定所述下一存储区域的状态为可读取状态,则电子设备确定可以更新所述当前全局读指针,电子设备执行步骤S1011;若电子设备确定所述下一存储区域的状态为不可读取状态,则电子设备不更新所述当前全局读指针,执行步骤S1012。
具体地,电子设备在确定当前的数据写入模式为retry-new模式时,可以获取下一存储区域的第二写指针committed,并根据所述下一存储区域的第二写指针committed中的version值确定所述下一存储区域中已被写入的局部写回绕次数。电子设备根据所述全局读指针确定全局读回绕次数。当所述下一存储区域中已被写入的局部写回绕次数等于所述全局读回绕次数加1时,电子设备可以确定所述下一存储区域中已经写入新的一轮数据,下一存储区域的状态为可读取状态,电子设备执行步骤S1011。当所述下一存储区域中已被写入的局部写回绕次数小于所述全局读回绕次数加1时,电子设备确定下一存储区域中还没有写入新的数据,电子设备返回EMPTY,执行步骤S1012。当所述下一存储区域中已被写入的局部写回绕次数大于所述全局读回绕次数加1时,电子设备确定发生异常,执行步骤S1012。
S1010:电子设备确定下一存储区域中是否已经写入新的至少一轮数据。
本申请实施例中,若当前的数据写入模式为drop-old模式(作为第二模式的实例),则在下一存储区域中已经写入新的至少一轮数据的情况下,电子设备确定所述下一存储区域的状态为可读取状态,则可以更新所述当前全局读指针;否则不更新所述当前全局读指针。
具体地,电子设备在确定当前的数据写入模式为drop-old模式时,可以根据所述当前存储区域的第一读指针reserved中的version值确定所述当前存储区域中已被占用的局部读回绕次数,根据所述当前存储区域的位置确定对应的目标增量值。电子设备还可以获取下一存储区域的第二写指针commited,根据所述下一存储区域的第二写指针commited中的version值确定所述下一存储区域中已被写入的局部写回绕次数。当电子设备确定所述下一存储区域中已被写入的局部写回绕次数大于或等于所述当前存储区域中已被占用的局部读回绕次数与目标增量之和时,电子设备可以确定所述下一存储区域中已经写入新的至少一轮数据,下一存储区域的状态为可读取状态,电子设备执行步骤S1011。当电子设备确定所述下一存储区域中已被写入的局部写回绕次数小于所述当前存储区域中已被占用的局部读回绕次数与目标增量之和时,可以确定下一存储区域中还没有写入新的数据,电子设备返回EMPTY,执行步骤S1012。
其中,当所述当前存储区域是所述循环存储队列中的第一个存储区域时,所述当前存储区域对应的目标增量值可以设置为1,当所述当前存储区域不是所述循环存储队列中的第一个存储区域时,所述当前存储区域对应的目标增量值可以设置为0。
在实际应用中,由于初始情况下向第一个存储区域写入数据/读取数据时,电子设备不会更新全局写指针/全局读指针,因此在第一次读/写回绕中,第一个存储区域的version值为0,而向其它存储区域写入数据/读取数据时,其他存储区域的version值为1。可以看出,即使是在同一次回绕中,第一个存储区域和其它存储区域的version值也差1。所以这里需要考虑第一个存储区域的特殊情况,当所述当前存储区域为第一个存储区域时,将对应的已被占用的局部读回绕次数加1。
S1011:电子设备更新所述当前全局读指针,以使得更新后的所述当前全局读指针指向所述下一存储区域。
本申请实施例中,电子设备可以通过针对所述当前全局读指针实施MAX操作,以更新所述当前全局读指针,使得所述当前全局读指针指向下一存储区域。
本申请实施例中,当电子设备在确定当前的数据写入模式为retry-new模式时,在更新所述当前全局读指针之前,电子设备可以通过针对所述下一存储区域的第一读指针和第二读指针实施MAX操作,以将所述下一存储区域的第一读指针和第二读指针加1。
本申请实施例中,当电子设备在确定当前的数据写入模式为drop-old模式时,在更新所述当前全局读指针之前,电子设备可以通过针对所述下一存储区域实施MAX操作,以将所述下一存储区域中已被占用的局部读回绕次数设置为所述下一存储区域中已被写入的局部写回绕次数。具体地,电子设备可以通过针对所述下一存储区域的第一读指针reserved中的version实施MAX操作,以将下一存储区域的第二写指针commited中的version值赋值给所述下一存储区域的第一读指针reserved中的version。
在实际应用中,由于在drop-old模式下可以进行覆盖写,所以第二写指针commited中的version值可能比第一读指针reserved中的version值大很多。
S1012:结束。其中,结束可以是指电子设备中的当前线程放弃读取数据,或者电子设备中的当前线程回到步骤S1001。
本申请实施例中,电子设备执行所述步骤S1011之后,可以返回至步骤S1001,此时,当前全局读指针指向下一个存储区域,可以将下一个存储区域作为当前存储区域,以在下一个存储区域中占用第二子区域,并读取所述第二子区域中存储的第二数据,完成数据的读取。
需要说明的是,在一些实施例中,上述方法中各个通过MAX操作实现的部分,均可以通过使用CAS操作进行代替。例如,在没有MAX指令的硬件平台X86平台上,可以采用CAS指令来代替。
应理解,为了方便描述,在图7和图10中的流程图中,采用了当前全局写指针、当前全局读指针、当前存储区域和下一存储区域等描述。在实际应用中,可以将“当前”修改为“第一”、“第二”或“第三”等描述。例如,当前存储区域可以为第一存储区域或第三存储区域等。
应理解,在前述图7的描述中,当前全局写指针对应当前存储区域。在前述图10的描述中,当前全局读指针对应当前存储区域。两个当前存储区域可以是同一个存储区域,也可以不是同一个存储区域。
应理解,前述图5和图7为写入数据的方法的流程图,图9和图10为读取数据的方法的流程图。在循环存储队列中,写入数据和读取数据是相互关联的。因此,关于关于图9和图10中的描述,可以参考图5和图7中的描述。关于图5和图7中的描述,也可以参考图9和图10中的描述。
将本申请实施例提供的方法分别应用于ARM平台和X86平台,并在不同数量的写者的状态下与现有技术中的实现方法进行对比,可以得到如图11a和图11b所示的性能对比图。其中,bbq表示本申请实施例提供的方法的吞吐量变化曲线,dpdkrb表示DPDK中的实现方法的吞吐量变化曲线,linuxrb表示linux系统中的实现方法的吞吐量变化曲线,boostq表示boost库中的实现方法的吞吐量变化曲线,follyq表示facebook(meta)公司提供的实现方法的吞吐量变化曲线,scqd表示上述实施方式二中的实现方法的吞吐量变化曲线。根据图11a和图11b可以看出,在X86平台和ARM平台上,本申请实施例提供的方法的吞吐量明显高于现有技术中的实现方法的吞吐量,本申请实施例提供的方法可以提高几十倍的系统性能。
在ARM平台中,分别采用FAA指令和CAS指令实现本申请实施例提供方法,并在不同数量的写者的状态下进行对比,可以得到如图11c所示的性能对比图。其中,bbq-faa-lse表示采用ARM LSE指令集FAA指令实现时的吞吐量变化曲线,bbq-cas表示采用CAS指令实现时的吞吐量变化曲线。根据图11c可以看出,在写者数量较多时,通过使用ARM LSE指令集FAA指令实现可以达到CAS指令实现5倍以上的性能。
将本申请实施例提供的循环存储队列与DPDK中的循环存储队列ring buffer的性能进行对比,可以得到如图12所示的性能对比图。其中,bbq表示本申请实施例提供的循环存储队列在不同队列大小时的吞吐量,dpdkrb表示DPDK中的循环存储队列在不同队列大小时的吞吐量。根据图12可以看出,在L2F场景本申请实施例提供的循环存储队列性能比DPDK中的循环存储队列性能端到端好至少50%。
前面对本申请中的数据写入方法和数据读取方法进行描述,下面对本申请中的数据写入装置和数据读取装置进行描述。
参考图13,图13示出了本申请实施例提供的数据写入装置1300的结构示意图。如图13所示,数据写入装置1300可以包括:
确定模块1310,用于确定待写入循环存储队列的第一数据;
第一获取模块1320,用于获取所述循环存储队列的全局写指针,所述循环存储队列包括多个存储区域,每个存储区域包括多个子区域,所述全局写指针指向所述多个存储区域中的第一存储区域;
第二获取模块1330,用于获取所述第一存储区域的第一写指针,根据所述第一存储区域的第一写指针确定所述第一存储区域中已被分配的空间大小;
分配模块1340,用于确定所述第一存储区域中已被分配的空间大小小于所述第一存储区域的空间大小,则通过针对所述第一存储区域实施FAA操作,以在所述第一存储区域中分配第一子区域;
写入模块1350,用于将所述第一数据写入所述第一子区域中。
在一些实施例中,数据写入装置1300还可以包括:第一更新模块,用于确定所述第一存储区域中已被分配的空间大小等于所述第一存储区域的空间大小,并且确定第二存储区域的状态为可写入状态,其中所述第二存储区域为与所述第一存储区域邻接的下一个存储区域;以及更新所述全局写指针,以使得更新后的所述全局写指针指向所述第二存储区域。
参考图14,图14示出了本申请实施例提供的数据读取装置1400的结构示意图。如图14所示,数据读取装置1400可以包括:
第三获取模块1410,用于获取存储有待读取数据的循环存储队列的全局读指针,所述循环存储队列包括多个存储区域,每个存储区域包括多个子区域,所述全局读指针指向所述多个存储区域中的第三存储区域;
第四获取模块1420,用于获取所述第三存储区域的第一写指针和第二写指针,根据所述第三存储区域的第一写指针确定所述第三存储区域中已被分配的空间大小,根据所述第三存储区域的第二写指针确定所述第三存储区域中已被写入的空间大小;
占用模块1430,用于确定所述第三存储区域中已被写入的空间大小等于所述第三存储区域中已被分配的空间大小,则通过针对所述第三存储区域实施MAX操作,以在所述第三存储区域中占用第二子区域;
读取模块1440,用于读取所述第二子区域中存储的第二数据。
在一些实施例中,所述占用模块1430,还用于确定所述第三存储区域中已被占用的空间大小小于所述第三存储区域中已被写入的空间大小;其中,所述第三存储区域中已被占用的空间大小是基于所述第三存储区域的第一读指针确定的。
在一些实施例中,数据读取装置1400还可以包括:第二更新模块,用于确定所述第三存储区域中已被占用的空间大小等于所述第三存储区域的空间大小,并且确定第四存储区域的状态为可读取状态,其中所述第四存储区域为与所述第三存储区域邻接的下一个存储区域;以及更新所述全局读指针,以使得更新后的所述全局读指针指向所述第四存储区域。
在一些实施例中,数据读取装置1400还可以包括:设置模块,用于通过针对所述第四存储区域实施MAX操作,以将所述第四存储区域中已被占用的局部读回绕次数设置为所述第四存储区域中已被写入的局部写回绕次数。
需要说明的是,上述实施例提供的装置,在实现其功能时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的装置与相应方法实施例属于同一构思,其具体实现过程详见对应方法实施例,这里不再赘述。
本申请实施例还提供一种电子设备,包括:
存储器,用于存储由所述电子设备的一个或多个处理器执行的指令;
处理器,当所述处理器执行所述存储器中的所述指令时,可使得所述电子设备执行上述实施例中图5至图10所示的方法。
本申请实施例还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有指令,该指令被处理器运行时,使得处理器执行上述实施例中图5至图10所示的方法。
本申请还提供一种包含指令的计算机程序产品,当该计算机程序产品在电子设备上运行时,使得处理器执行上述实施例中图5至图10所示的方法。
参考图15,所示为根据本申请的一个实施例的电子设备1500的框图。电子设备1500可以包括耦合到控制器中枢1503的一个或多个处理器1501。对于至少一个实施例,控制器中枢1503经由诸如前端总线(Front Side Bus,FSB)之类的多分支总线、诸如快速通道互连(Quick Path Interconnect,QPI)之类的点对点接口、或者类似的连接1506与处理器1501进行通信。处理器1501执行控制一般类型的数据处理操作的指令。在一实施例中,控制器中枢1503包括,但不局限于,图形存储器控制器中枢(Graphics Memory ControllerHub,GMCH)(未示出)和输入/输出中枢(Input Output Hub,IOH)(其可以在分开的芯片上)(未示出),其中GMCH包括存储器和图形控制器并与IOH耦合。
电子设备1500还可包括耦合到控制器中枢1503的协处理器1502和存储器1504。或者,存储器和GMCH中的一个或两者可以被集成在处理器内(如本申请中所描述的),存储器1504和协处理器1502直接耦合到处理器1501以及控制器中枢1503,控制器中枢1503与IOH处于单个芯片中。
存储器1504可以是例如动态随机存取存储器(Dynamic Random Access Memory,DRAM)、相变存储器(Phase Change Memory,PCM)或这两者的组合。存储器1504作为计算机可读存储介质,可以包括用于存储数据和/或指令的一个或多个有形的、非暂时性计算机可读介质。例如,存储器1504可以包括闪存等任何合适的非易失性存储器和/或任何合适的非易失性存储设备,例如一个或多个硬盘驱动器(Hard-Disk Drive,HDD(s)),一个或多个光盘(Compact Disc,CD)驱动器,和/或一个或多个数字通用光盘(Digital Versatile Disc,DVD)驱动器。
根据本申请的一些实施例,作为计算机可读存储介质的存储器1504上存储有指令,该指令在计算机上执行时使系统1500执行根据上述实施例中的数据写入方法或数据读取方法,具体可参照上述实施例中图5至图10所示的方法,在此不再赘述。
在一个实施例中,协处理器1502是专用处理器,诸如例如高吞吐量集成众核(ManyIntegerated Core,MIC)处理器、网络或通信处理器、压缩引擎、图形处理器、通用图形处理器(General Purpose Computing on GPU,GPGPU)、或嵌入式处理器等等。协处理器1502的任选性质用虚线表示在图15中。
在一个实施例中,电子设备1500可以进一步包括网络接口(Network InterfaceController,NIC)1506。网络接口1506可以包括收发器,用于为电子设备1500提供无线电接口,进而与任何其他合适的设备(如前端模块,天线等)进行通信。在各种实施例中,网络接口1506可以与电子设备1500的其他组件集成。网络接口1506可以实现上述实施例中的通信单元的功能。
电子设备1500可以进一步包括输入/输出(Input/Output,I/O)设备1505。I/O1505可以包括:用户界面,该设计使得用户能够与电子设备1500进行交互;外围组件接口的设计使得外围组件也能够与电子设备1500交互;和/或传感器设计用于确定与电子设备1500相关的环境条件和/或位置信息。
值得注意的是,图15仅是示例性的。即虽然图15中示出了电子设备1500包括处理器1501、控制器中枢1503、存储器1504等多个器件,但是,在实际的应用中,使用本申请各方法的设备,可以仅包括电子设备1500各器件中的一部分器件,例如,可以仅包含处理器1501和网络接口1506。图15中可选器件的性质用虚线示出。
参考图16,所示为根据本申请的一实施例的SoC(System on Chip,片上系统)1600的框图。在图16中,相似的部件具有同样的附图标记。另外,虚线框是更先进的SoC的可选特征。在图16中,SoC1600包括:互连单元1650,其被耦合至处理器1610;系统代理单元1680;总线控制器单元1690;集成存储器控制器单元1640;一组或一个或多个协处理器1620,其可包括集成图形逻辑、图像处理器、音频处理器和视频处理器;静态随机存取存储器(StaticRandom Access Memory,SRAM)单元1630;直接存储器存取(Direct Memory Access,DMA)单元1660。在一个实施例中,协处理器1620包括专用处理器,诸如例如网络或通信处理器、压缩引擎、GPGPU、高吞吐量MIC处理器、或嵌入式处理器等。
静态随机存取存储器(SRAM)单元1630中可以包括用于存储数据和/或指令的一个或多个有形的、非暂时性计算机可读存储介质。计算机可读存储介质中可以存储有指令,具体而言,存储有该指令的暂时和永久副本。该指令可以包括:由处理器中的至少一个单元执行时使Soc1600执行根据上述实施例中的数据写入方法或数据读取方法,具体可参照上述实施例中图5至图10所示的方法,在此不再赘述。
本申请公开的机制的各实施例可以被实现在硬件、软件、固件或这些实现方法的组合中。本申请的实施例可实现为在可编程系统上执行的计算机程序或程序代码,该可编程系统包括至少一个处理器、存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备以及至少一个输出设备。
可将程序代码应用于输入指令,以执行本申请描述的各功能并生成输出信息。可以按已知方式将输出信息应用于一个或多个输出设备。为了本申请的目的,处理系统包括具有诸如例如数字信号处理器(Digital Signal Processor,DSP)、微控制器、专用集成电路(Application Specific Integrated Circuit,ASIC)或微处理器之类的处理器的任何系统。
程序代码可以用高级程序化语言或面向对象的编程语言来实现,以便与处理系统通信。在需要时,也可用汇编语言或机器语言来实现程序代码。事实上,本申请中描述的机制不限于任何特定编程语言的范围。在任一情形下,该语言可以是编译语言或解释语言。
在一些情况下,所公开的实施例可以以硬件、固件、软件或其任何组合来实现。所公开的实施例还可以被实现为由一个或多个暂时或非暂时性机器可读(例如,计算机可读)存储介质承载或存储在其上的指令,其可以由一个或多个处理器读取和执行。例如,指令可以通过网络或通过其他计算机可读介质分发。因此,机器可读介质可以包括用于以机器(例如,计算机)可读的形式存储或传输信息的任何机制,包括但不限于,软盘、光盘、光碟、光盘只读存储器(Compact Disc Read Only Memory,CD-ROMs)、磁光盘、只读存储器(Read OnlyMemory,ROM)、随机存取存储器(RAM)、可擦除可编程只读存储器(Erasable ProgrammableRead Only Memory,EPROM)、电可擦除可编程只读存储器(Electrically ErasableProgrammable Read Only Memory,EEPROM)、磁卡或光卡、闪存、或用于利用因特网以电、光、声或其他形式的传播信号来传输信息(例如,载波、红外信号数字信号等)的有形的机器可读存储器。因此,机器可读介质包括适合于以机器(例如,计算机)可读的形式存储或传输电子指令或信息的任何类型的机器可读介质。
在附图中,可以以特定布置和/或顺序示出一些结构或方法特征。然而,应该理解,可能不需要这样的特定布置和/或排序。而是,在一些实施例中,这些特征可以以不同于说明书附图中所示的方式和/或顺序来布置。另外,在特定图中包括结构或方法特征并不意味着暗示在所有实施例中都需要这样的特征,并且在一些实施例中,可以不包括这些特征或者可以与其他特征组合。
需要说明的是,本申请各设备实施例中提到的各单元/模块都是逻辑单元/模块,在物理上,一个逻辑单元/模块可以是一个物理单元/模块,也可以是一个物理单元/模块的一部分,还可以以多个物理单元/模块的组合实现,这些逻辑单元/模块本身的物理实现方式并不是最重要的,这些逻辑单元/模块所实现的功能的组合才是解决本申请所提出的技术问题的关键。此外,为了突出本申请的创新部分,本申请上述各设备实施例并没有将与解决本申请所提出的技术问题关系不太密切的单元/模块引入,这并不表明上述设备实施例并不存在其它的单元/模块。
需要说明的是,在本申请的示例和说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
虽然通过参照本申请的某些优选实施例,已经对本申请进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种改变,而不偏离本申请的精神和范围。

Claims (17)

1.一种数据写入方法,应用于电子设备,其特征在于,所述方法包括:
确定待写入循环存储队列的第一数据;
获取所述循环存储队列的全局写指针,所述循环存储队列包括多个存储区域,每个存储区域包括多个子区域,所述全局写指针指向所述多个存储区域中的第一存储区域;
获取所述第一存储区域的第一写指针,根据所述第一存储区域的第一写指针确定所述第一存储区域中已被分配的空间大小;
确定所述第一存储区域中已被分配的空间大小小于所述第一存储区域的空间大小,则通过针对所述第一存储区域实施FAA操作,以在所述第一存储区域中分配第一子区域;
将所述第一数据写入所述第一子区域中。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
确定所述第一存储区域中已被分配的空间大小等于所述第一存储区域的空间大小,并且确定第二存储区域的状态为可写入状态,其中所述第二存储区域为与所述第一存储区域邻接的下一个存储区域;
更新所述全局写指针,以使得更新后的所述全局写指针指向所述第二存储区域。
3.根据权利要求2所述的方法,其特征在于,所述确定第二存储区域的状态为可写入状态包括:
确定所述第二存储区域是未被分配过的状态。
4.根据权利要求2所述的方法,其特征在于,所述确定第二存储区域的状态为可写入状态包括:
确定所述第二存储区域中已被读取的空间大小等于所述第二存储区域的空间大小;以及
确定所述第二存储区域中已被读取的局部读回绕次数等于全局写回绕次数;
其中,所述全局写回绕次数是根据所述全局写指针确定的;
所述第二存储区域中已被读取的空间大小,以及已被读取的局部读回绕次数是基于所述第二存储区域的第二读指针确定的,所述第二存储区域的第二读指针是在当前的数据写入模式为第一模式的情形下所获取的。
5.根据权利要求2所述的方法,其特征在于,所述确定第二存储区域的状态为可写入状态包括:
确定所述第二存储区域中已被写入的空间大小等于所述第二存储区域的空间大小;以及
确定所述第二存储区域中已被写入的局部写回绕次数等于全局写回绕次数;
其中,所述全局写回绕次数是根据所述全局写指针确定的;
所述第二存储区域中已被写入的空间大小,以及已被写入的局部写回绕次数是基于所述第二存储区域的第二写指针确定的,所述第二存储区域的第二写指针是在当前的数据写入模式为第二模式的情形下所获取的。
6.一种数据读取方法,应用于电子设备,其特征在于,所述方法包括:
获取存储有待读取数据的循环存储队列的全局读指针,所述循环存储队列包括多个存储区域,每个存储区域包括多个子区域,所述全局读指针指向所述多个存储区域中的第三存储区域;
获取所述第三存储区域的第一写指针和第二写指针,根据所述第三存储区域的第一写指针确定所述第三存储区域中已被分配的空间大小,根据所述第三存储区域的第二写指针确定所述第三存储区域中已被写入的空间大小;
确定所述第三存储区域中已被写入的空间大小等于所述第三存储区域中已被分配的空间大小,则通过针对所述第三存储区域实施MAX操作,以在所述第三存储区域中占用第二子区域;
读取所述第二子区域中存储的第二数据。
7.根据权利要求6所述的方法,其特征在于,所述通过针对所述第三存储区域实施MAX操作,以在所述第三存储区域中占用第二子区域之前,所述方法还包括:
确定所述第三存储区域中已被占用的空间大小小于所述第三存储区域中已被写入的空间大小;
其中,所述第三存储区域中已被占用的空间大小是基于所述第三存储区域的第一读指针确定的。
8.根据权利要求7所述的方法,其特征在于,所述通过针对所述第三存储区域实施MAX操作,以在所述第三存储区域中占用第二子区域包括:
通过实施MAX操作对所述第三存储区域的第一读指针进行加1,并且确定所述第三存储区域的第一读指针是否被其他线程更新;
若所述第三存储区域的第一读指针未被其他线程更新,则在所述第三存储区域中占用第二子区域。
9.根据权利要求7所述的方法,其特征在于,所述读取所述第二子区域中存储的第二数据包括:
确定当前的数据写入模式为第二模式,并且所述第三存储区域中已被分配的局部写回绕次数等于所述第三存储区域中已被占用的局部读回绕次数,则读取并返回所述第二子区域中存储的第二数据;
其中,所述第三存储区域中已被分配的局部写回绕次数是基于所述第三存储区域的第一写指针确定的,所述第三存储区域中已被占用的局部读回绕次数是基于所述第三存储区域的第一读指针确定的。
10.根据权利要求7所述的方法,其特征在于,所述方法还包括:
确定所述第三存储区域中已被占用的空间大小等于所述第三存储区域的空间大小,并且确定第四存储区域的状态为可读取状态,其中所述第四存储区域为与所述第三存储区域邻接的下一个存储区域;
更新所述全局读指针,以使得更新后的所述全局读指针指向所述第四存储区域。
11.根据权利要求10所述的方法,其特征在于,所述确定第四存储区域的状态为可读取状态包括:
确定所述第四存储区域中已被写入的局部写回绕次数等于所述全局读回绕次数加1;
其中,所述全局读回绕次数是根据所述全局读指针确定的;
所述第四存储区域中已被写入的局部写回绕次数是基于所述第四存储区域的第二写指针确定的,所述第四存储区域的第二写指针是在当前的数据写入模式为第一模式的情形下所获取的。
12.根据权利要求10所述的方法,其特征在于,所述确定第四存储区域的状态为可读取状态包括:
确定所述第四存储区域中已被写入的局部写回绕次数大于或等于所述第三存储区域中已被占用的局部读回绕次数与目标增量之和;
其中,所述第四存储区域中已被写入的局部写回绕次数是基于所述第四存储区域的第二写指针确定的,所述第四存储区域的第二写指针是在当前的数据写入模式为第二模式的情形下所获取的;
所述第三存储区域中已被占用的局部读回绕次数是基于所述第三存储区域的第一读指针确定的,所述目标增量值是基于所述第三存储区域的位置确定的。
13.根据权利要求12所述的方法,其特征在于,所述方法还包括:
通过针对所述第四存储区域实施MAX操作,以将所述第四存储区域中已被占用的局部读回绕次数设置为所述第四存储区域中已被写入的局部写回绕次数。
14.一种数据写入装置,设置于电子设备,其特征在于,所述装置包括:
确定模块,用于确定待写入循环存储队列的第一数据;
第一获取模块,用于获取所述循环存储队列的全局写指针,所述循环存储队列包括多个存储区域,每个存储区域包括多个子区域,所述全局写指针指向所述多个存储区域中的第一存储区域;
第二获取模块,用于获取所述第一存储区域的第一写指针,根据所述第一存储区域的第一写指针确定所述第一存储区域中已被分配的空间大小;
分配模块,用于确定所述第一存储区域中已被分配的空间大小小于所述第一存储区域的空间大小,则通过针对所述第一存储区域实施FAA操作,以在所述第一存储区域中分配第一子区域;
写入模块,用于将所述第一数据写入所述第一子区域中。
15.一种数据读取装置,设置于电子设备,其特征在于,所述装置包括:
第三获取模块,用于获取存储有待读取数据的循环存储队列的全局读指针,所述循环存储队列包括多个存储区域,每个存储区域包括多个子区域,所述全局读指针指向所述多个存储区域中的第三存储区域;
第四获取模块,用于获取所述第三存储区域的第一写指针和第二写指针,根据所述第三存储区域的第一写指针确定所述第三存储区域中已被分配的空间大小,根据所述第三存储区域的第二写指针确定所述第三存储区域中已被写入的空间大小;
占用模块,用于确定所述第三存储区域中已被写入的空间大小等于所述第三存储区域中已被分配的空间大小,则通过针对所述第三存储区域实施MAX操作,以在所述第三存储区域中占用第二子区域;
读取模块,用于读取所述第二子区域中存储的第二数据。
16.一种电子设备,其特征在于,包括:
存储器,用于存储由所述电子设备的一个或多个处理器执行的指令;
处理器,当所述处理器执行所述存储器中的所述指令时,可使得所述电子设备执行权利要求1~5任一项所述的数据写入方法或权利要求6~13任一项所述的数据读取方法。
17.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有指令,该指令在计算机上执行时使得计算机执行权利要求1~5任一项所述的数据写入方法或权利要求6~13任一项所述的数据读取方法。
CN202210806780.3A 2022-07-08 2022-07-08 数据写入方法、读取方法、装置、电子设备以及存储介质 Pending CN117407148A (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202210806780.3A CN117407148A (zh) 2022-07-08 2022-07-08 数据写入方法、读取方法、装置、电子设备以及存储介质
PCT/CN2023/094808 WO2024007745A1 (zh) 2022-07-08 2023-05-17 数据写入方法、读取方法、装置、电子设备以及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210806780.3A CN117407148A (zh) 2022-07-08 2022-07-08 数据写入方法、读取方法、装置、电子设备以及存储介质

Publications (1)

Publication Number Publication Date
CN117407148A true CN117407148A (zh) 2024-01-16

Family

ID=89454341

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210806780.3A Pending CN117407148A (zh) 2022-07-08 2022-07-08 数据写入方法、读取方法、装置、电子设备以及存储介质

Country Status (2)

Country Link
CN (1) CN117407148A (zh)
WO (1) WO2024007745A1 (zh)

Citations (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020078317A1 (en) * 2000-12-19 2002-06-20 Matsushita Electric Industrial Co., Ltd. First-in, first-out (FIFO) memory with moving boundary
CN101800867A (zh) * 2010-01-19 2010-08-11 深圳市同洲电子股份有限公司 一种实现环形缓冲区的方法、装置及数字电视接收终端
US20130067160A1 (en) * 2011-09-12 2013-03-14 Microsoft Corporation Producer-consumer data transfer using piecewise circular queue
WO2014201408A1 (en) * 2013-06-13 2014-12-18 Travelport, Lp Queuing data for multiple readers and writers
CN106790599A (zh) * 2016-12-29 2017-05-31 中国人民解放军国防科学技术大学 一种基于多核无锁环形缓冲区的共生虚拟机通信方法
CN108733344A (zh) * 2018-05-28 2018-11-02 深圳市道通智能航空技术有限公司 数据读写方法、装置以及环形队列
CN110704335A (zh) * 2019-09-03 2020-01-17 苏州浪潮智能科技有限公司 一种基于异步环形缓冲区的数据读取、写入方法及装置
CN112491979A (zh) * 2020-11-12 2021-03-12 苏州浪潮智能科技有限公司 一种网卡数据包缓存管理方法、装置、终端及存储介质
US20210109857A1 (en) * 2019-10-15 2021-04-15 Sling Media Pvt. Ltd. Lock-free sharing of live-recorded circular buffer resources
CN113064743A (zh) * 2021-04-15 2021-07-02 张荣晋 一种环形缓冲区读写方法和装置
CN113138839A (zh) * 2021-04-23 2021-07-20 深圳市科思科技股份有限公司 环形队列缓冲区及其运行方法、计算机可读存储介质
CN114048152A (zh) * 2021-11-24 2022-02-15 深圳市华宝电子科技有限公司 一种数据缓存方法、装置、电子设备和存储介质
CN114490439A (zh) * 2022-02-11 2022-05-13 武汉中旗生物医疗电子有限公司 基于无锁环形共享内存的数据写入、读取、通信方法

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5548728A (en) * 1994-11-04 1996-08-20 Canon Information Systems, Inc. System for reducing bus contention using counter of outstanding acknowledgement in sending processor and issuing of acknowledgement signal by receiving processor to indicate available space in shared memory
JP2008293484A (ja) * 2007-04-27 2008-12-04 Panasonic Corp バッファメモリ共有装置
CN115934023A (zh) * 2021-08-31 2023-04-07 华为技术有限公司 数据处理方法、数据处理装置以及相关设备

Patent Citations (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020078317A1 (en) * 2000-12-19 2002-06-20 Matsushita Electric Industrial Co., Ltd. First-in, first-out (FIFO) memory with moving boundary
CN101800867A (zh) * 2010-01-19 2010-08-11 深圳市同洲电子股份有限公司 一种实现环形缓冲区的方法、装置及数字电视接收终端
US20130067160A1 (en) * 2011-09-12 2013-03-14 Microsoft Corporation Producer-consumer data transfer using piecewise circular queue
WO2014201408A1 (en) * 2013-06-13 2014-12-18 Travelport, Lp Queuing data for multiple readers and writers
CN106790599A (zh) * 2016-12-29 2017-05-31 中国人民解放军国防科学技术大学 一种基于多核无锁环形缓冲区的共生虚拟机通信方法
CN108733344A (zh) * 2018-05-28 2018-11-02 深圳市道通智能航空技术有限公司 数据读写方法、装置以及环形队列
CN110704335A (zh) * 2019-09-03 2020-01-17 苏州浪潮智能科技有限公司 一种基于异步环形缓冲区的数据读取、写入方法及装置
US20210109857A1 (en) * 2019-10-15 2021-04-15 Sling Media Pvt. Ltd. Lock-free sharing of live-recorded circular buffer resources
CN112491979A (zh) * 2020-11-12 2021-03-12 苏州浪潮智能科技有限公司 一种网卡数据包缓存管理方法、装置、终端及存储介质
CN113064743A (zh) * 2021-04-15 2021-07-02 张荣晋 一种环形缓冲区读写方法和装置
CN113138839A (zh) * 2021-04-23 2021-07-20 深圳市科思科技股份有限公司 环形队列缓冲区及其运行方法、计算机可读存储介质
CN114048152A (zh) * 2021-11-24 2022-02-15 深圳市华宝电子科技有限公司 一种数据缓存方法、装置、电子设备和存储介质
CN114490439A (zh) * 2022-02-11 2022-05-13 武汉中旗生物医疗电子有限公司 基于无锁环形共享内存的数据写入、读取、通信方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
无: "A quick introduction to the ring buffer data structure", Retrieved from the Internet <URL:https://www.francofernando.com/blog/data> *
杨泽林;李先发;: "基于双指针环形缓冲区的数据采集系统设计", 仪表技术与传感器, no. 11, 15 November 2016 (2016-11-15) *

Also Published As

Publication number Publication date
WO2024007745A1 (zh) 2024-01-11

Similar Documents

Publication Publication Date Title
US20180011748A1 (en) Post-retire scheme for tracking tentative accesses during transactional execution
EP1960878B1 (en) Coordinating access to memory locations for hardware transactional memory transactions and software transactional memory transactions
CN101059783B (zh) 事务型存储器的虚拟化
CN105339908B (zh) 用于支持持久存储器的方法和装置
US6141734A (en) Method and apparatus for optimizing the performance of LDxL and STxC interlock instructions in the context of a write invalidate protocol
US8495299B2 (en) Non-blocking data transfer via memory cache manipulation
US20130091331A1 (en) Methods, apparatus, and articles of manufacture to manage memory
JP5647203B2 (ja) メモリページ管理
JP4599172B2 (ja) フリーバッファプールを使用することによるメモリの管理
EP3740872B1 (en) Decoupling trace data streams using cache coherence protocol data
TW201403599A (zh) 用於改良記憶體存取之次序的系統、裝置及方法
US10152278B2 (en) Logical to physical sector size adapter
US6950909B2 (en) System and method for reducing contention in a multi-sectored cache
US11609786B2 (en) Hierarchical register file device based on spin transfer torque-random access memory
US9606923B2 (en) Information processing device with shared memory, memory order guarantee method using counters fence instructions in relation to cache-oriented requests, and recording medium storing program
CN116361232A (zh) 片上缓存的处理方法、装置、芯片及存储介质
US20230057633A1 (en) Systems, methods, and apparatus for transferring data between interconnected devices
WO2007135532A2 (en) Method and system for managing buffers pool
CN116149554B (zh) 一种基于risc-v及其扩展指令的数据存储处理系统及其方法
CN117407148A (zh) 数据写入方法、读取方法、装置、电子设备以及存储介质
US9417805B2 (en) Exporting computational capabilities into a block-oriented disk memory
CN115934023A (zh) 数据处理方法、数据处理装置以及相关设备
CN112559389A (zh) 存储控制装置、处理装置、计算机系统和存储控制方法
CN113448897B (zh) 适用于纯用户态远端直接内存访问的优化方法
US11914516B1 (en) Memory side cache request handling

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