CN111666330A - 数据的读写方法和装置 - Google Patents
数据的读写方法和装置 Download PDFInfo
- Publication number
- CN111666330A CN111666330A CN201910168960.1A CN201910168960A CN111666330A CN 111666330 A CN111666330 A CN 111666330A CN 201910168960 A CN201910168960 A CN 201910168960A CN 111666330 A CN111666330 A CN 111666330A
- Authority
- CN
- China
- Prior art keywords
- storage unit
- target storage
- data
- queue
- module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
-
- 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)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种数据的读写方法和装置。其中,该方法包括:数据写入模块从存储队列中查找到目标存储单元,其中,存储队列包括多个存储单元,每个存储单元至少包括:用于存放元素的第一字段和用于存放读写标识的第二字段;数据写入模块根据目标存储单元的第二字段判断目标存储单元是否为空;在目标存储单元为空的情况下,数据写入模块将待写入元素写入目标存储单元的第一字段,并将目标存储单元的第二字段更改为第一预设值,其中,第一预设值用于表示目标存储单元已被写入元素。本发明解决了JDK自带的阻塞队列在高并发的情况下容易发生乱序冲突,导致并发效率较低的技术问题。
Description
技术领域
本发明涉及数据处理领域,具体而言,涉及一种数据的读写方法和装置。
背景技术
分布式数据库系统是指利用高速计算机网络,将物理上分散的多个数据存储单元连接起来组成一个逻辑上统一的数据库。分布式数据库的基本思想是原来集中式数据库中的数据分散存储到多个通过网络连接的数据存储节点上,以获取更大的存储容量和更高的访问量。但分布式数据库在面对高并发的情况下,多线程并行运行且无法保证各个线程间指令的运行顺序,因此容易发生乱序冲突的问题。
针对JDK自带的阻塞队列在高并发的情况下容易发生乱序冲突,导致并发效率较低的问题,目前尚未提出有效的解决方案。
发明内容
本发明实施例提供了一种数据的读写方法和装置,以至少解决JDK自带的阻塞队列在高并发的情况下容易发生乱序冲突,导致并发效率较低的技术问题。
根据本发明实施例的一个方面,提供了一种数据的读写方法,包括:数据写入模块从存储队列中查找到目标存储单元,其中,存储队列包括多个存储单元,每个存储单元至少包括:用于存放元素的第一字段和用于存放读写标识的第二字段;数据写入模块根据目标存储单元的第二字段判断目标存储单元是否为空;在目标存储单元为空的情况下,数据写入模块将待写入元素写入目标存储单元的第一字段,并将目标存储单元的第二字段更改为第一预设值,其中,第一预设值用于表示目标存储单元已被写入元素。
根据本发明实施例的另一方面,还提供了一种数据的读写方法,包括:数据读取模块从存储队列中查找目标存储单元,其中,存储队列包括多个存储单元,每个存储单元包括:用于存放元素的第一字段和用于存放读写标识的第二字段;数据读取模块根据目标存储单元的第二字段判断目标存储单元是否已被写入;在目标存储单元已被写入元素的情况下,数据读取模块读取目标存储单元内的元素,并将目标存储单元的第二字段更改为第一预设值,其中,第一预设值用于表示目标存储单元为空。
根据本发明实施例的另一方面,还提供了一种数据的读写装置,包括:查找模块,用于数据写入模块从存储队列中查找到目标存储单元,其中,存储队列包括多个存储单元,每个存储单元至少包括:用于存放元素的第一字段和用于存放读写标识的第二字段;判断模块,用于数据写入模块根据目标存储单元的第二字段判断目标存储单元是否为空;写入模块,用于在目标存储单元为空的情况下,数据写入模块将待写入元素写入目标存储单元的第一字段,并将目标存储单元的第二字段更改为第一预设值,其中,第一预设值用于表示目标存储单元已被写入元素。
根据本发明实施例的另一方面,还提供了一种数据的读写装置,包括:查找模块,用于数据读取模块从存储队列中查找目标存储单元,其中,存储队列包括多个存储单元,每个存储单元包括:用于存放元素的第一字段和用于存放读写标识的第二字段;判断模块,用于数据读取模块根据目标存储单元的第二字段判断目标存储单元是否已被写入;写入模块,用于在目标存储单元已被写入元素的情况下,数据读取模块读取目标存储单元内的元素,并将目标存储单元的第二字段更改为第一预设值,其中,第一预设值用于表示目标存储单元为空。
在本发明实施例中的存储单元中包括用于存储元素的字段和用于存储读写标识的字段,在数据写入模块向存储队列的存储单元中写入元素之前,通过存储单元的读写标识确定该单元是否为空,从而确定是否访问该存储单元以向其写入元素,进而可以避免数据读取模块还未从存储单元读取元素,数据写入模块就先于数据读取模块访问存储单元所导致的乱序冲突的情况,解决了JDK自带的阻塞队列在高并发的情况下容易发生乱序冲突,导致并发效率较低的技术问题,提高了并发效率。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1示出了一种用于实现数据的读写方法的计算机终端(或移动设备)的硬件结构框图;
图2是根据本申请实施例1的数据的读写方法的流程图;
图3是根据本申请实施例1的一种分布式数据库的阻塞队列的示意图;
图4是根据本申请实施例1的一种数据写入模块向存储队列写入元素的示意图;
图5是相差倍数为2^n的线程乱序访问同一个Hub的示意图;
图6是根据本申请实施例1的一种相差倍数为2^n的线程读写数据的示意图;
图7是根据本申请实施例2的一种数据的读写方法的流程;
图8是根据本申请实施例2的一种数据读取模块读取存储队列元素的示意图;
图9是根据本申请实施例3的一种数据的读写装置的示意图;
图10是根据本申请实施例4的一种数据的读写装置的示意图;以及
图11是根据本申请实施例5的一种计算机终端的结构框图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
首先,在对本申请实施例进行描述的过程中出现的部分名词或术语适用于如下解释:
Queue:即队列,是一种常见的数据结构,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行取出操作的端称为队头。
元素:用于表示对队列进行插入和取出操作的基本单位。
有界队列:指的是队列的一种特殊形式,队列的长度存在上限。当队列中的元素个数等于队列长度时,队列为满的状态。
Producer:即生产者,本申请中的生产者用于表示对队列进行插入操作的行为模块。
Consumer:即消费者,本申请中的消费者用于表示对队列进行取出操作的行为模块。
BlockingQueue:即阻塞队列,阻塞队列在队列的基础上,支持阻塞等待。当队列为空时,消费者等待队列中有元素时再取出。当队列为满时,生产者等待队列不为满时再插入。
Handler:Lindorm的内部对象,负责执行请求。一个Handler对应于一个线程。
JDK:即Java Development Kit,JDK是整个Java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。
RPC模块:即Remote Procedure Call,RPC是远程过程调用的简称,RPC模块是实现远程过程调用的程序模块。
Cacheline:高速缓存块,CPU从内存读取或写入数据的最小单位。X86CPU一般Cacheline大小为64Byte。
Lindorm:一种面向海量数据在线处理的分布式数据库。
LindormBlockingQueue:是本申请提出的一种兼容JDK BlockingQueue接口的阻塞队列。主要用于Lindorm内部RPC模块与Handler进行RPC请求暂存与传递。
false-sharing-padding:false-sharing是伪共享,指的是计算机体系架构中,cpu会以cacheline为最小单位,将内存数据缓存到cpu cache中,同时对相邻的无关变量做修改。由于它们可能处于同一cacheline中,导致性能的衰退。false-sharing-padding指的是通过对变量前后增加无意义的填充空间,使其独占一cacheline,避免false-sharing。
cacheline dirty read:一种基于cpu cache的优化策略。指部分场合不需要知道内存中共享变量的精确值时,允许从cpu cache中进行脏读。这种策略可以加速程序的运行。
实施例1
根据本发明实施例,还提供了一种数据的读写方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
本申请实施例一所提供的方法实施例可以在移动终端、计算机终端或者类似的运算装置中执行。图1示出了一种用于实现数据的读写方法的计算机终端(或移动设备)的硬件结构框图。如图1所示,计算机终端10(或移动设备10)可以包括一个或多个(图中采用102a、102b,……,102n来示出)处理器102(处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)、用于存储数据的存储器104、以及用于通信功能的传输模块106。除此以外,还可以包括:显示器、输入/输出接口(I/O接口)、通用串行总线(USB)端口(可以作为I/O接口的端口中的一个端口被包括)、网络接口、电源和/或相机。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,计算机终端10还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。
应当注意到的是上述一个或多个处理器102和/或其他数据处理电路在本文中通常可以被称为“数据处理电路”。该数据处理电路可以全部或部分的体现为软件、硬件、固件或其他任意组合。此外,数据处理电路可为单个独立的处理模块,或全部或部分的结合到计算机终端10(或移动设备)中的其他元件中的任意一个内。如本申请实施例中所涉及到的,该数据处理电路作为一种处理器控制(例如与接口连接的可变电阻终端路径的选择)。
存储器104可用于存储应用软件的软件程序以及模块,如本发明实施例中的数据的读写方法对应的程序指令/数据存储装置,处理器102通过运行存储在存储器104内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的数据的读写方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至计算机终端10。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
传输装置106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括计算机终端10的通信供应商提供的无线网络。在一个实例中,传输装置106包括一个网络适配器(Network Interface Controller,NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输装置106可以为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。
显示器可以例如触摸屏式的液晶显示器(LCD),该液晶显示器可使得用户能够与计算机终端10(或移动设备)的用户界面进行交互。
此处需要说明的是,在一些可选实施例中,上述图1所示的计算机设备(或移动设备)可以包括硬件元件(包括电路)、软件元件(包括存储在计算机可读介质上的计算机代码)、或硬件元件和软件元件两者的结合。应当指出的是,图1仅为特定具体实例的一个实例,并且旨在示出可存在于上述计算机设备(或移动设备)中的部件的类型。
在上述运行环境下,本申请提供了如图2所示的数据的读写方法。图2是根据本申请实施例1的数据的读写方法的流程图。
步骤S21,数据写入模块从存储队列中查找到目标存储单元,其中,存储队列包括多个存储单元,每个存储单元至少包括:用于存放元素的第一字段和用于存放读写标识的第二字段。
具体的,上述数据写入模块可以是RPCReader。存储队列既可以是应用在分布式数据库中的阻塞队列,该队列为一个有界队列。上述读写标识是用于表征存储单元的读写状态的标识,用于数据写入模块或数据读取模块根据该标识来确定存储单元当前的读写状态。存储单元的读写状态用于表示其状态是否允许被读取或被写入元素。
数据写入模块确定目标存储单元,可以是根据队列的规则,每次确定当前的存储单元的下一个存储单元为目标存储单元。
图3是根据本申请实施例1的一种分布式数据库的阻塞队列的示意图,结合图3所示,在一种可选的实施例中,存储队列可以使用一个长度为2^n的数组作为存储结构。数组中总共有2^n个Hub(存储单元)。每个Hub由value(第一字段)与code(第二字段)两个字段构成。value用于存放数据写入模块写入的元素,code用于存放生产者与消费者模式下的访问控制标识,即上述读写标识。
步骤S23,数据写入模块根据目标存储单元的第二字段判断目标存储单元是否为空。
数据写入模块确定目标存储单元后,读取目标存储单元的第二字段中的内容,并根据第二字段的内容确定目标存储单元是否为空。仍以Hub包括value与code为例,数据写入模块取出目标Hub,并读取Hub的code字段,根据Hub的code字段来确定目标单元是否为空。
在一种可选的实施例中,code中的内容可以为A或B两种。code值为A表示Hub为空,code值为B表示Hub已被写入元素。数据写入模块读取Hub的code值后,判断其是否为A,从而可以确定该Hub是否为空。
步骤S25,在目标存储单元为空的情况下,数据写入模块将待写入元素写入目标存储单元的第一字段,并将目标存储单元的第二字段更改为第一预设值,其中,第一预设值用于表示目标存储单元已被写入元素。
在上述步骤中,仅当数据写入模块确定目标存储单元为空的情况下,向存储单元写入元素。如果目标存储单元不为空,则数据写入模块可以确定新的目标存储单元,并进入确定新的目标存储单元是否为空的步骤,直至查找到为空的存储单元。
在数据写入模块将待写入元素写入目标存储单元后,该目标存储单元的状态已经发生变更,因此数据写入模块还需要更改目标存储单元的第二字段中的读写标识,以更改目标存储单元的状态。
在一种可选的实施例中,结合图3所示,仍以code值为A表示Hub为空,code值为B表示Hub已被写入元素为例。队列在初始状态下,存储队列中的Hub均为空,因此Hub对应的code值均为A。数据写入模块在向Hub的value中写入一个元素后,还需要将该Hub的code值更改为B。在非初始状态下,Producer(数据写入模块)检测目标Hub的code值是否为A,如果目标Hub的code值为A,则确定目标Hub为空,因此Producer将待写入的元素写入目标Hub的value中,并该Hub的code值更改为B。
需要说明的是,如果一个存储单元被写入了元素,但在数据读取模块读取该存储单元中的元素之前,数据写入模块确定了该存储单元为目标存储单元,则数据写入模块对其第二字段进行检测即可确定目标存储单元不为空,因此数据写入模块会重新查找新的目标存储单元,从而避免了乱序冲突。
还需要说明的是,本实施例的上述存储队列是一个类,其接口完全兼容JDK标准的BlockingQueue。无需付出额外学习成本即可使用。
本申请实施例中的存储单元中包括用于存储元素的字段和用于存储读写标识的字段,在数据写入模块向存储队列的存储单元中写入元素之前,通过存储单元的读写标识确定该单元是否为空,从而确定是否访问该存储单元以向其写入元素,进而可以避免数据读取模块还未从存储单元读取元素,数据写入模块就先于数据读取模块访问存储单元所导致的乱序冲突的问题,进而提高并发效率。
由此,本申请上述实施例解决了JDK自带的阻塞队列在高并发的情况下容易发生乱序冲突,导致并发效率较低的技术问题。
作为一种可选的实施例,在数据写入模块从存储队列中查找目标存储单元之前,上述方法还包括:数据写入模块判断存储队列是否存在允许插入元素的空间;如果存储队列存在允许插入元素的空间,则进入数据写入模块从存储队列中查找目标存储单元的步骤。
当存储队列为满时,不允许数据写入模块继续写入,因此数据写入模块在确定目标存储模块之前,还需要存储队列是否已满。
在一种可选的实施例中,Producer在获取到待写入元素后,首先判断存储队列是否已满,如果存储队列已满,则不存在允许插入元素的空间,如果存储队列未满,则确定存在允许插入元素的空间。
作为一种可选的实施例,数据写入模块判断存储队列是否存在允许插入元素的空间,包括:数据写入模块读取数据写入指针的当前值和数据读取指针的当前值;数据写入模块获取数据写入指针的当前值和数据读取指针的当前值之间的差值;数据写入模块将差值与存储队列的队列长度进行比对;如果差值小于队列长度,则确定存储队列存在允许插入元素的空间;如果差值等于存储队列的队列长度,则确定存储队列不存在允许插入元素的空间。
在上述方案中,数据写入模块具有对应的数据写入指针,数据读取模块具有对应的数据读取指针。数据写入指针指向数据写入模块将元素放入存储队列的最后一个存储单元,而数据读取指针指向数据读取模块将元素取出存储队列的最后一个存储单元。两个指针的值均可以为long型并单调递增。数据写入模块仅修改数据写入指针,数据读取模块仅修改数据读取指针。
数据写入模块可以从缓存中获取数据写入指针和数据读取指针,并通过与位运算确定数据写入指针与数据读取指针所指向的存储单元,与对队列的长度取模相比,与位运算即为确定指针在存储队列中的偏移量,运算消耗较小,进而能够加速运算过程。
在一种可选的实施例中,数据写入指针为Produced指针,数据读取指针为Consumed指针,存储队列的队列长度为2^n。在Producer确定目标存储单元前,现读取Produced指针和Consumed指针的差值。如果Produced指针和Consumed指针的差值小于2^n,则确定存储的队列不满,如果Produced指针和Consumed指针的差值等于2^n,则确定存储的队列已满。
作为一种可选的实施例,数据写入模块从存储队列中查找目标存储单元,包括:数据写入模块通过比较并交换操作,在数据写入指针的当前值的基础上加一,得到目标值;数据写入模块确定目标值在存储队列中所指示的存储单元为目标存储单元。
比较并交换操作为CAS操作,上述方案通过数据读取指针与数据写入指针将各个线程间的临界区缩小至对数据读取指针和数据写入指针变量的CAS修改上。在上述方案中,数据是无锁的,因此需要进行CAS操作来确保数据写入模块获取的指针是最新的指针。具体的,本申请上述的比较并操作过程可以是,数据写入模块从缓存中获取数据写入指针和数据读取指针后,将从缓存中获取的数据写入指针与内存中的数据写入指针进行比对,由于内存中保存的是最新的指针,因此如果比对结果为一致,则可以确定数据写入模块从缓存获取的数据写入指针为最新的指针,由此可以进行加一操作,得到目标值。
而如果不对结果为不一致,则确定数据写入指针已经发生变化,因此如果CAS操作失败,则数据写入模块需要重新从内存中读取数据写入指针和数据读取指针。
在一种可选的实施例中,Producer在CAS操作成功后,在指针的当前位置加1,得到目标存储单元的指针,结合图3所示,Producer的指针Produced加1后指向Hub:2,则Hub:2为Producer的目标存储单元。
作为一种可选的实施例,数据写入模块根据目标存储单元的第二字段判断目标存储单元是否为空,包括:数据写入模块读取目标存储单元的第二字段,判断目标存储单元的读写标识是否为第二预设值,其中,数据读取模块从目标存储单元读取数据后,将目标存储单元的第二字段更改为第二预设值;如果目标存储单元的读写标识为第二预设值,则确定目标存储单元为空;如果目标存储单元的读写标识不为第二预设值,则确定目标存储单元不为空。
在上述方案中,为数据读取模块从存储单元中读取元素后,将存储单元第二字段更改为第二预设值,因此当数据写入模块检测到目标存储单元的第二字段的读写标识为第二预设值时,则说明数据读取模块已经将目标存储单元的元素进行了读取,当数据写入模块检测到目标存储单元的第二字段的读写标识不为第二预设值时,则说明目标存储单元中的元素还未被数据读取单元读取,因此无法写入数据。
需要说明的是,当存储队列在初始状态时,每个存储单元的第二字段的读写标识均可以设置为第二预设值。
作为一种可选的实施例,对第一预设值与二的n次方之差取反,得到第二预设值,其中,n用于表示存储队列的队列长度。
在上述方案中,第一预设值根据第二预设值确定。
在一种可选的实施例中,如果第一预设值为p,则第二预设值为-(p-2^n),其中,‘-’用于表示取反位操作。
作为一种可选的实施例,第一预设值为目标存储单元的单元标识。
具体的,目标存储单元的单元标识用于表示存储单元在存储队列中的位置,结合图3所示,对于具有2^n个存储单元的存储队列,其单元标识由0至(2^n-1),第一预设值即为目标存储单元的单元标识。
在一种可选的实施例中,结合图3所示,目标存储单元为Hub:2的存储单元,则第一预设值p=2,第二预设值为-(2-2^n)。在该示例中,当数据写入模块确定目标存储单元中第二字段的读写标识为-(2-2^n)时,则将元素写入目标存储单元,并将目标存储单元的第二字段的读写标识修改为2。
作为一种可选的实施例,存储队列所属的存储结构还包括数据写入链表,如果存储队列不存在允许插入元素的空间,则数据写入模块生成等待写入对象,并将等待写入对象插入数据写入链表。
在上述方案中,该存储结构还包括数据写入链表,用于当存储队列已满时,数据写入模块生成数据写入对象,并将数据写入对象保存在数据写入链表中,等待数据读取模块的唤醒。
在一种可选的实施例中,结合图3所示,数据写入链表为ProducerParker,支持无锁且并发安全,当Producer发现队列满时,则生成Parker,放置到ProducerParker链表尾部,并将线程设置为闲置状态。
作为一种可选的实施例,存储队列所属的存储结构还包括数据读取链表,如果存储队列不存在允许读取的元素,则数据读取模块生成等待读取对象,并将等待读取对象插入数据读取链表。
在上述方案中,该存储结构还包括数据读取链表,用于当存储队列已空时,数据读取模块生成数据读取对象,并将数据写入对象保存在数据读取链表中,等待数据写入模块的唤醒。
在一种可选的实施例中,结合图3所示,数据写入链表为ConsumerParkers,支持无锁且并发安全,当Consumer发现队列为空时,则生成Parker,放置到ConsumerParkers链表尾部,并将线程设置为闲置状态。
上述方案基于自管理的ConsumerParkers与ProducerParkers无锁链表实现Blocking,进而降低了额Consumer或Producer在等待时的开销,提升了资源利用效率。
作为一种可选的实施例,在数据写入模块将待写入元素写入目标存储单元的第一字段,并将目标存储单元的第二字段更改为第一预设值之后,上述方法还包括:数据写入模块查找数据读取链表中是否包括等待读取对象;如果数据读取链表中包括等待读取对象,则唤醒等待读取对象对应的数据读取模块进行数据读取。
在上述方案中,数据写入模块在每次向存储队列写入元素之后,都可以检查数据读取链表中是否有等待的数据读取对象,并在数据读取链表中存在数据读取对象时,将该数据读取对象唤醒,由数据读取对象对应的数据读取模块来读取队列中的元素。
图4是根据本申请实施例1的一种数据写入模块向存储队列写入元素的示意图,下面结合图4对上述实施例中的数据的读写方法进行说明。
S51,Producer读取Produced与Consumed指针,并判断Produced与Consumed的差值是否小于队列长度,如果Produced与Consumed的差值小于队列长度,则进入步骤S52,否则进入步骤S56。
在上述步骤中,如果Produced与Consumed的差值小于队列长度,则说明队列有空间可以插入元素,否则,说明队列已经没有空间。
S52,Producer通过CAS操作将Produced指针加1,得到的值为p。如果CAS操作失败,则返回步骤S51,否则继续执行步骤S53。
S53,Producer将p所对应的Hub取出。并以spin的方式等待直到Hub中code字段的值改变成为-(p-2^n)。(‘-’是取反位操作)。
上述步骤用于确定Hub中当元素已被Consumed读取,Hub的状态为空,允许Producer写入元素。
S54,Producer将Hub中value字段的值设置为被插入的元素。并将code字段修改为p。
S55,Producer检查ConsuemrParkers链表,如检测到ConsuemrParkers链表中存在等待的Parker,则将ConsumerParks中的第一个Parker取出并唤醒其中线程。
S56,Producer生成一个Parker对象,并将其插入ProducerParkers链表队尾,等待Consumer唤醒。当Producer被唤醒后,返回步骤S51继续执行。
需要说明的是,在高并发情况下多线程并行运行,各个线程间的指令运行顺序是无法保证的,因此可能会出现如下两种乱序冲突的情况:a)Producer与Consumer对同一个指针值的Hub的访问存在乱序冲突。原因是在多线程运行的程序中,各个线程间的指令运行顺序是无法保证的,Consumer可能先于Producer访问Hub,Producer没有修改Hub.value时,Consumer访问Hub会取不到元素。b)相差倍数为2^n的线程,可能会乱序访问同一个Hub。如图5所示,(甲)(乙)(丙)(丁)4个线程,(甲)(乙)分别需要写和读下标为2的Hub。(丙)(丁)分别需要写和读下标为18的Hub。由于数组大小为16,因此这4个线程实际访问的是同一个Hub。
本申请上述实施例中的LindormBlockingQueue使用code这一字段来解决冲突。Producer和Consumer有两条规则:1Producer必须等待code为-(p-2^n)时,才可以继续操作。操作完成后,将code修改为p;2Consumer必须等待code为c时,才可以继续操作。操作完成后,将code修改为-c。
结合图6所示,甲需要先等待code为-(-14)时,才可以写入元素,并修改code为2;
乙等待到code为2时,才读取元素,并修改为-2;
丙等待code为~2时,写入元素,并修改为18;
丁等待code为18时,读取元素,并修改为-18;
如此,则解决了上述a)和b)两类乱序冲突问题。
还需要说明的是,对于Consumed与Produced指针,Hub中的code值,均可以使用了false sharing padding技术与cacheline dirty read技术进行优化。从而进一步提高了并发能力,减少了线程间冲突。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例的方法。
实施例2
根据本发明实施例,还提供了一种数据的读写方法的实施例,图7是根据本申请实施例2的一种数据的读写方法的流程,如图7所示所示,该方法包括:
步骤S71,数据读取模块从存储队列中查找目标存储单元,其中,存储队列包括多个存储单元,每个存储单元包括:用于存放元素的第一字段和用于存放读写标识的第二字段。
具体的,上述数据读取模块可以是Handler。存储队列既可以是应用在分布式数据库中的阻塞队列,该队列为一个有界队列。上述读写标识是用于表征存储单元的读写状态的标识,用于数据写入模块或数据读取模块根据该标识来确定存储单元当前的读写状态。存储单元的读写状态用于表示其状态是否允许被读取或被写入元素。
数据读取模块查找目标存储单元,可以是根据队列的规则,每次确定当前的存储单元的下一个存储单元为目标存储单元。
图4是根据本申请实施例1的一种分布式数据库的阻塞队列的示意图,结合图4所示,在一种可选的实施例中,存储队列可以使用一个长度为2^n的数组作为存储结构。数组中总共有2^n个Hub(存储单元)。每个Hub由value(第一字段)与code(第二字段)两个字段构成。value用于存放数据写入模块写入的元素,code用于存放生产者与消费者模式下的访问控制标识,即上述读写标识。
步骤S73,数据读取模块根据目标存储单元的第二字段判断目标存储单元是否已被写入。
数据读取模块查找到目标存储单元后,读取目标存储单元的第二字段中的内容,并根据第二字段的内容确定目标存储单元是否已被写入元素。仍以Hub包括value与code为例,数据读取模块取出目标Hub,并读取Hub的code字段,根据Hub的code字段来确定目标单元是否已被写入元素。
在一种可选的实施例中,code中的内容可以为A或B两种。code值为A表示Hub为空,code值为B表示Hub已被写入元素。数据读取模块读取Hub的code值后,判断其是否为B,从而可以确定该Hub是否已被写入元素。
步骤S75,在目标存储单元已被写入元素的情况下,数据读取模块读取目标存储单元内的元素,并将目标存储单元的第二字段更改为第一预设值,其中,第一预设值用于表示目标存储单元为空。
在上述步骤中,仅当数据读取模块确定目标存储单元已被写入元素的情况下,从存储单元中读取元素。如果目标存储单元不为空,则数据读取模块可以确定新的目标存储单元,并进入确定新的目标存储单元是否被写入元素的步骤,直至查找到为空的存储单元。
在数据读取模块从目标存储单元中读取元素后,该目标存储单元的状态已经发生变更,因此数据读取模块还需要更改目标存储单元的第二字段中的读写标识,以更改目标存储单元的状态。
在一种可选的实施例中,结合图4所示,仍以code值为A表示Hub为空,code值为B表示Hub已被写入元素为例。Consumer(数据读取模块)检测目标Hub的code值是否为B,如果目标Hub的code值为B,则确定目标Hub已被写入元素,因此Consumer从Hub的value中读取元素,并该Hub的code值更改为A。
需要说明的是,如果一个存储单元被写入了元素,但在数据读取模块读取该存储单元中的元素之前,数据写入模块确定了该存储单元为目标存储单元,则数据写入模块对其第二字段进行检测即可确定目标存储单元不为空,因此数据写入模块会重新查找新的目标存储单元,从而避免了乱序冲突。
本申请实施例中的存储单元中包括用于存储元素的字段和用于存储读写标识的字段,在数据读取模块读取存储队列存储单元中的元素之前,通过存储单元的读写标识确定该单元是否包括已写入的元素,从而确定是否访问该存储单元以从中读取元素,进而可以避免数据写入模块还未向存储单元写入元素,数据读取模块就先于数据写入模块访问存储单元所导致的乱序冲突的问题,进而提高并发效率。
由此,本申请上述实施例解决了JDK自带的阻塞队列在高并发的情况下容易发生乱序冲突,导致并发效率较低的技术问题。
作为一种可选的实施例,在数据读取模块从存储队列中查找目标存储单元之前,上述方法还包括:数据读取模块判断存储队列是否存在允许读取的元素;如果存储队列存在允许读取的元素,则进入数据读取模块读取目标存储单元内的元素的步骤。
当存储队列为空时,不允许数据读取模块继续读取,因此数据读取模块在查找目标存储模块之前,还需要存储队列是否为空。
在一种可选的实施例中,Consumer在接收到数据读取任务后,首先判断存储队列是否为空,如果存储队列为空,则不存在允许读取元素的空间,如果存储队列不为空,则确定存在允许读取元素的空间。
作为一种可选的实施例,数据读取模块判断存储队列是否存在允许读取的元素,包括:数据读取模块读取数据写入指针的当前值和数据读取指针的当前值;数据读取模块获取数据写入指针的当前值和数据读取指针的当前值之间的差值;如果差值大于零,则确定存储队列存在允许读取的元素;如果差值等于存储队列的队列长度,则确定存储队列不存在允许读取的元素。
在上述方案中,数据写入模块具有对应的数据写入指针,数据读取模块具有对应的数据读取指针。数据写入指针指向数据写入模块将元素放入存储队列的最后一个存储单元,而数据读取指针指向数据读取模块将元素取出存储队列的最后一个存储单元。两个指针的值均可以为long型并单调递增。数据写入模块仅修改数据写入指针,数据读取模块仅修改数据读取指针。
数据写入模块可以从缓存中获取数据写入指针和数据读取指针,并通过与位运算确定数据写入指针与数据读取指针所指向的存储单元,与对队列的长度取模相比,与位运算即为确定指针在存储队列中的偏移量,运算消耗较小,进而能够加速运算过程。
在一种可选的实施例中,数据写入指针为Produced指针,数据读取指针为Consumed指针,存储队列的队列长度为2^n。在Producer确定目标存储单元前,现读取Produced指针和Consumed指针的差值。如果Produced指针和Consumed指针的差值大于零,则确定存在允许读取的元素,如果Produced指针和Consumed指针的差值等于=0,则确定不存在允许读取的元素。
作为一种可选的实施例,其特征在于,数据读取模块从存储队列中查找目标存储单元,包括:数据读取模块通过比较并交换操作,在数据读取指针的当前值的基础上加一,得到目标值;数据读取模块确定目标值在存储队列中所指示的存储单元为目标存储单元。
比较并交换操作为CAS操作,在上述方案中,数据是无锁的,因此需要进行CAS操作来确保数据读取模块获取的指针是最新的指针。具体的,本申请上述的比较并操作过程可以是,数据读取模块从缓存中获取数据写入指针和数据读取指针后,将从缓存中获取的数据读取指针与内存中的数据读取指针进行比对,由于内存中保存的是最新的指针,因此如果比对结果为一致,则可以确定数据读取模块从缓存获取的数据读取指针为最新的指针,由此可以进行加一操作,得到目标值。
而如果不对结果为不一致,则确定数据读取指针已经发生变化,因此如果CAS操作失败,则数据读取模块需要重新从内存中读取数据写入指针和数据读取指针。
在一种可选的实施例中,Producer在CAS操作成功后,在指针的当前位置加1,得到目标存储单元的指针,结合图4所示,Consumer的指针Consumed加1后指向Hub:1,则Hub:1为Producer的目标存储单元。
作为一种可选的实施例,数据读取模块根据目标存储单元的第二字段判断目标存储单元是否已被写入,包括:数据读取模块读取目标存储单元的第二字段,判断目标存储单元的读写标识是否为第二预设值,其中,数据写入模块将元素写入目标存储单元后,将目标存储单元的第二字段更改为第二预设值;如果目标存储单元的读写标识为第二预设值,则确定目标存储单元已被写入;如果目标存储单元的读写标识不为第二预设值,则确定目标存储单元未被写入。
数据写入模块读取目标存储单元的第二字段,判断目标存储单元的读写标识是否为第二预设值,其中,数据读取模块从目标存储单元读取数据后,将目标存储单元的第二字段更改为第二预设值;
如果目标存储单元的读写标识为第二预设值,则确定目标存储单元为空;
如果目标存储单元的读写标识不为第二预设值,则确定目标存储单元不为空。
在上述方案中,为数据写入模块向存储单元写入元素后,将存储单元第二字段更改为第二预设值,因此当数据读取模块检测到目标存储单元的第二字段的读写标识为第二预设值时,则说明数据写入模块已经向目标存储单元写入了元素,当数据读取模块检测到目标存储单元的第二字段的读写标识不为第二预设值时,则说明目标存储单元还未被写入元素,因此无法进行读取。
作为一种可选的实施例,对第一预设值与第二预设值互为相反数。
在一种可选的实施例中,如果第一预设值为c,则第二预设值为-c,其中,‘-’用于表示取反位操作。
作为一种可选的实施例,第二预设值为目标存储单元的单元标识。
具体的,目标存储单元的单元标识用于表示存储单元在存储队列中的位置,结合图4所示,对于具有2^n个存储单元的存储队列,其单元标识由0至(2^n-1),第一预设值即为目标存储单元的单元标识。
在一种可选的实施例中,结合图4所示,目标存储单元为Hub:1的存储单元,则第一预设值p=-1,第二预设值为1。在该示例中,当数据读取单元确定目标存储单元中第二字段的读写标识为1时,读取目标存储单元中的元素,并将目标存储单元的第二字段的读写标识修改为-1。
作为一种可选的实施例,存储队列所属的存储结构还包括数据读取链表,如果存储队列不存在允许读取的元素,则数据读取模块生成等待读取对象,并将等待读取对象插入数据读取链表。
在上述方案中,该存储结构包括数据读取链表,用于当存储队列已空时,数据读取模块生成数据读取对象,并将数据写入对象保存在数据读取链表中,等待数据写入模块的唤醒。
在一种可选的实施例中,结合图4所示,数据写入链表为ConsumerParkers,支持无锁且并发安全,当Consumer发现队列为空时,则生成Parker,放置到ConsumerParkers链表尾部,并将线程设置为闲置状态。
作为一种可选的实施例,存储队列所属的存储结构还包括数据写入链表,如果存储队列不存在允许插入元素的空间,则数据写入模块生成等待写入对象,并将等待写入对象插入数据写入链表。
在上述方案中,该存储结构还包括数据写入链表,用于当存储队列已满时,数据写入模块生成数据写入对象,并将数据写入对象保存在数据写入链表中,等待数据读取模块的唤醒。
在一种可选的实施例中,结合图4所示,数据写入链表为ProducerParker,支持无锁且并发安全,当Producer发现队列满时,则生成Parker,放置到ProducerParker链表尾部,并将线程设置为闲置状态。
作为一种可选的实施例,在数据读取模块读取目标存储单元内的元素,并将目标存储单元的第二字段更改为第一预设值之后,上述方法还包括:数据读取模块查找数据写入链表中是否包括等待写入对象;如果数据写入链表中包括等待写入对象,则唤醒等待写入对象对应的数据写入模块进行数据写入。
在上述方案中,数据读取模块在每次从存储队列读取元素之后,都可以检查数据写入链表中是否有等待写入的数据写入对象,并在数据写入链表中存在数据写入对象时,将该数据写入对象唤醒,由数据写入对象对应的数据写入模块将元素写入存储队列中。
图8是根据本申请实施例2的一种数据读取模块读取存储队列元素的示意图,下面结合图8对上述实施例中的数据的读写方法进行说明。
S81,Consumer读取Produced与Consumed指针,并判断Produced与Consumed的差值是否大于0,Produced与Consumed的差值大于0,则进入步骤S82,否则进入步骤S86。
在上述步骤中,如果Produced与Consumed的差值大于0,则说明队列中有元素可以获取,否则,说明队列已经没有剩余元素。
S82,Consumer尝试通过CAS操作,将Consumed指针加1,得到的值为c。如果CAS操作失败,则返回步骤S81,否则继续执行步骤S83。
S83,Consumer将c所对应的Hub取出。并以spin的方式等待直到Hub中code字段的值改变成为c。
S84,Consumer将Hub中value字段的值设置为空,并将code字段修改为-c。
S85,Consumer检查ProducerParkers链表,如检测到ProducerParkers链表有Parker,则将ProducerParkers中的第一个Parker取出并唤醒其中线程。
S86,Consumer生成一个Parker对象,并将其插入ConsumerParkers链表队尾,等待Producer唤醒。当Consuemr被唤醒后,返回步骤S81继续执行。
实施例3
根据本发明实施例,还提供了一种用于实施实施例1中的数据的读写方法的数据的读写装置,图9是根据本申请实施例3的一种数据的读写装置的示意图,如图9所示,该装置900包括:
查找模块902,用于数据写入模块从存储队列中查找到目标存储单元,其中,存储队列包括多个存储单元,每个存储单元至少包括:用于存放元素的第一字段和用于存放读写标识的第二字段。
判断模块904,用于数据写入模块根据目标存储单元的第二字段判断目标存储单元是否为空。
写入模块906,用于在目标存储单元为空的情况下,数据写入模块将待写入元素写入目标存储单元的第一字段,并将目标存储单元的第二字段更改为第一预设值,其中,第一预设值用于表示目标存储单元已被写入元素。
此处需要说明的是,上述查找模块902发送模块102对应于实施例1中的步骤S21至步骤S25,两个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。
作为一种可选的实施例,上述装置还包括:确定模块,用于在数据写入模块从存储队列中查找目标存储单元之前,数据写入模块判断存储队列是否存在允许插入元素的空间;进入模块,用于如果存储队列存在允许插入元素的空间,则进入数据写入模块从存储队列中查找目标存储单元的步骤。
作为一种可选的实施例,确定模块包括:第一获取子模块,用于数据写入模块读取数据写入指针的当前值和数据读取指针的当前值;第二获取子模块,用于数据写入模块获取数据写入指针的当前值和数据读取指针的当前值之间的差值;比对子模块,用于数据写入模块将差值与存储队列的队列长度进行比对;第一确定子模块,用于如果差值小于队列长度,则确定存储队列存在允许插入元素的空间;第二确定子模块,用于如果差值等于存储队列的队列长度,则确定存储队列不存在允许插入元素的空间。
作为一种可选的实施例,查找模块包括:操作子模块,用于数据写入模块通过比较并交换操作,在数据写入指针的当前值的基础上加一,得到目标值;第三确定子模块,用于数据写入模块确定目标值在存储队列中所指示的存储单元为目标存储单元。
作为一种可选的实施例,判断模块包括:判断子模块,用于数据写入模块读取目标存储单元的第二字段,判断目标存储单元的读写标识是否为第二预设值,其中,数据读取模块从目标存储单元读取数据后,将目标存储单元的第二字段更改为第二预设值;第四确定子模块,用于如果目标存储单元的读写标识为第二预设值,则确定目标存储单元为空;第五确定子模块,用于如果目标存储单元的读写标识不为第二预设值,则确定目标存储单元不为空。
作为一种可选的实施例,对第一预设值与二的n次方之差取反,得到第二预设值,其中,n用于表示存储队列的队列长度。
作为一种可选的实施例,第一预设值为目标存储单元的单元标识。
作为一种可选的实施例,存储队列所属的存储结构还包括数据写入链表,如果存储队列不存在允许插入元素的空间,则数据写入模块生成等待写入对象,并将等待写入对象插入数据写入链表。
作为一种可选的实施例,存储队列所属的存储结构还包括数据读取链表,如果存储队列不存在允许读取的元素,则数据读取模块生成等待读取对象,并将等待读取对象插入数据读取链表。
作为一种可选的实施例,上述装置还包括:再次查找模块,用于在数据写入模块将待写入元素写入目标存储单元的第一字段,并将目标存储单元的第二字段更改为第一预设值之后,数据写入模块查找数据读取链表中是否包括等待读取对象;唤醒模块,用于如果数据读取链表中包括等待读取对象,则唤醒等待读取对象对应的数据读取模块进行数据读取。
实施例4
根据本发明实施例,还提供了一种用于实施实施例2中的数据的读写方法的数据的读写装置,图10是根据本申请实施例4的一种数据的读写装置的示意图,如图10所示,该装置100包括:
查找模块102,用于数据读取模块从存储队列中查找目标存储单元,其中,存储队列包括多个存储单元,每个存储单元包括:用于存放元素的第一字段和用于存放读写标识的第二字段。
判断模块104,用于数据读取模块根据目标存储单元的第二字段判断目标存储单元是否已被写入。
读取模块106,用于在目标存储单元已被写入元素的情况下,数据读取模块读取目标存储单元内的元素,并将目标存储单元的第二字段更改为第一预设值,其中,第一预设值用于表示目标存储单元为空。
此处需要说明的是,上述查找模块102、判断模块104和读取模块106对应于实施例2中的步骤S71至步骤S75,两个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例一所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在实施例一提供的计算机终端10中。
作为一种可选的实施例,上述装置还包括:确定模块,用于在数据读取模块从存储队列中查找目标存储单元之前,数据读取模块判断存储队列是否存在允许读取的元素;进入模块,用于如果存储队列存在允许读取的元素,则进入数据读取模块读取目标存储单元内的元素的步骤。
作为一种可选的实施例,确定模块包括:第一获取子模块,用于数据读取模块读取数据写入指针的当前值和数据读取指针的当前值;第二获取子模块,用于数据读取模块获取数据写入指针的当前值和数据读取指针的当前值之间的差值;第一确定子模块,用于如果差值大于零,则确定存储队列存在允许读取的元素;第二确定子模块,用于如果差值等于存储队列的队列长度,则确定存储队列不存在允许读取的元素。
作为一种可选的实施例,查找模块包括:操作子模块,用于数据读取模块通过比较并交换操作,在数据读取指针的当前值的基础上加一,得到目标值;第三确定子模块,用于数据读取模块确定目标值在存储队列中所指示的存储单元为目标存储单元。
作为一种可选的实施例,判断模块包括:判断子模块,用于数据读取模块读取目标存储单元的第二字段,判断目标存储单元的读写标识是否为第二预设值,其中,数据写入模块将元素写入目标存储单元后,将目标存储单元的第二字段更改为第二预设值;第四确定子模块,用于如果目标存储单元的读写标识为第二预设值,则确定目标存储单元已被写入;第五确定子模块,用于如果目标存储单元的读写标识不为第二预设值,则确定目标存储单元未被写入。
作为一种可选的实施例,对第一预设值与第二预设值互为相反数。
作为一种可选的实施例,第二预设值为目标存储单元的单元标识。
作为一种可选的实施例,存储队列所属的存储结构还包括数据读取链表,如果存储队列不存在允许读取的元素,则数据读取模块生成等待读取对象,并将等待读取对象插入数据读取链表。
作为一种可选的实施例,存储队列所属的存储结构还包括数据写入链表,如果存储队列不存在允许插入元素的空间,则数据写入模块生成等待写入对象,并将等待写入对象插入数据写入链表。
作为一种可选的实施例,上述装置还包括:再次查找模块,用于在数据读取模块读取目标存储单元内的元素,并将目标存储单元的第二字段更改为第一预设值之后,数据读取模块查找数据写入链表中是否包括等待写入对象;唤醒模块,用于如果数据写入链表中包括等待写入对象,则唤醒等待写入对象对应的数据写入模块进行数据写入。
实施例5
本发明的实施例可以提供一种计算机终端,该计算机终端可以是计算机终端群中的任意一个计算机终端设备。可选地,在本实施例中,上述计算机终端也可以替换为移动终端等终端设备。
可选地,在本实施例中,上述计算机终端可以位于计算机网络的多个网络设备中的至少一个网络设备。
在本实施例中,上述计算机终端可以执行数据的读写方法中以下步骤的程序代码:数据写入模块从存储队列中查找到目标存储单元,其中,存储队列包括多个存储单元,每个存储单元至少包括:用于存放元素的第一字段和用于存放读写标识的第二字段;数据写入模块根据目标存储单元的第二字段判断目标存储单元是否为空;在目标存储单元为空的情况下,数据写入模块将待写入元素写入目标存储单元的第一字段,并将目标存储单元的第二字段更改为第一预设值,其中,第一预设值用于表示目标存储单元已被写入元素。
可选地,图11是根据本发明实施例5的一种计算机终端的结构框图。如图11所示,该计算机终端A可以包括:一个或多个(图中仅示出一个)处理器1102、存储器1104、以及外设接口1106。
其中,存储器可用于存储软件程序以及模块,如本发明实施例中的数据的读写方法和装置对应的程序指令/模块,处理器通过运行存储在存储器内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的数据的读写方法。存储器可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器可进一步包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至终端A。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
处理器可以通过传输装置调用存储器存储的信息及应用程序,以执行下述步骤:数据写入模块从存储队列中查找到目标存储单元,其中,存储队列包括多个存储单元,每个存储单元至少包括:用于存放元素的第一字段和用于存放读写标识的第二字段;数据写入模块根据目标存储单元的第二字段判断目标存储单元是否为空;在目标存储单元为空的情况下,数据写入模块将待写入元素写入目标存储单元的第一字段,并将目标存储单元的第二字段更改为第一预设值,其中,第一预设值用于表示目标存储单元已被写入元素。
可选的,上述处理器还可以执行如下步骤的程序代码:在数据写入模块从存储队列中查找目标存储单元之前,数据写入模块判断存储队列是否存在允许插入元素的空间;如果存储队列存在允许插入元素的空间,则进入数据写入模块从存储队列中查找目标存储单元的步骤。
可选的,上述处理器还可以执行如下步骤的程序代码:数据写入模块读取数据写入指针的当前值和数据读取指针的当前值;数据写入模块获取数据写入指针的当前值和数据读取指针的当前值之间的差值;数据写入模块将差值与存储队列的队列长度进行比对;如果差值小于队列长度,则确定存储队列存在允许插入元素的空间;如果差值等于存储队列的队列长度,则确定存储队列不存在允许插入元素的空间。
可选的,上述处理器还可以执行如下步骤的程序代码:数据写入模块通过比较并交换操作,在数据写入指针的当前值的基础上加一,得到目标值;数据写入模块确定目标值在存储队列中所指示的存储单元为目标存储单元。
可选的,上述处理器还可以执行如下步骤的程序代码:数据写入模块读取目标存储单元的第二字段,判断目标存储单元的读写标识是否为第二预设值,其中,数据读取模块从目标存储单元读取数据后,将目标存储单元的第二字段更改为第二预设值;如果目标存储单元的读写标识为第二预设值,则确定目标存储单元为空;如果目标存储单元的读写标识不为第二预设值,则确定目标存储单元不为空。
可选的,对第一预设值与二的n次方之差取反,得到第二预设值,其中,n用于表示存储队列的队列长度。
可选的,第一预设值为目标存储单元的单元标识。
可选的,存储队列所属的存储结构还包括数据写入链表,如果存储队列不存在允许插入元素的空间,则数据写入模块生成等待写入对象,并将等待写入对象插入数据写入链表。
可选的,存储队列所属的存储结构还包括数据读取链表,如果存储队列不存在允许读取的元素,则数据读取模块生成等待读取对象,并将等待读取对象插入数据读取链表。
可选的,上述处理器还可以执行如下步骤的程序代码:在数据写入模块将待写入元素写入目标存储单元的第一字段,并将目标存储单元的第二字段更改为第一预设值之后,数据写入模块查找数据读取链表中是否包括等待读取对象;如果数据读取链表中包括等待读取对象,则唤醒等待读取对象对应的数据读取模块进行数据读取。
采用本发明实施例,提供了一种数据的读写方法的方案。本申请实施例中的存储单元中包括用于存储元素的字段和用于存储读写标识的字段,在数据写入模块向存储队列的存储单元中写入元素之前,通过存储单元的读写标识确定该单元是否为空,从而确定是否访问该存储单元以向其写入元素,进而可以避免数据读取模块还未从存储单元读取元素,数据写入模块就先于数据读取模块访问存储单元所导致的乱序冲突的情况,解决了JDK自带的阻塞队列在高并发的情况下容易发生乱序冲突,导致并发效率较低的技术问题,提高了并发效率。
本领域普通技术人员可以理解,图11所示的结构仅为示意,计算机终端也可以是智能手机(如Android手机、iOS手机等)、平板电脑、掌声电脑以及移动互联网设备(MobileInternet Devices,MID)、PAD等终端设备。图11其并不对上述电子装置的结构造成限定。例如,计算机终端A还可包括比图11中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图11所示不同的配置。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(Read-Only Memory,ROM)、随机存取器(RandomAccess Memory,RAM)、磁盘或光盘等。
实施例6
本发明的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于保存上述实施例一所提供的数据的读写方法所执行的程序代码。
可选地,在本实施例中,上述存储介质可以位于计算机网络中计算机终端群中的任意一个计算机终端中,或者位于移动终端群中的任意一个移动终端中。
可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:数据写入模块从存储队列中查找到目标存储单元,其中,存储队列包括多个存储单元,每个存储单元至少包括:用于存放元素的第一字段和用于存放读写标识的第二字段;数据写入模块根据目标存储单元的第二字段判断目标存储单元是否为空;在目标存储单元为空的情况下,数据写入模块将待写入元素写入目标存储单元的第一字段,并将目标存储单元的第二字段更改为第一预设值,其中,第一预设值用于表示目标存储单元已被写入元素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (24)
1.一种数据的读写方法,其特征在于,包括:
数据写入模块从存储队列中查找到目标存储单元,其中,所述存储队列包括多个存储单元,每个存储单元至少包括:用于存放元素的第一字段和用于存放读写标识的第二字段;
所述数据写入模块根据所述目标存储单元的第二字段判断所述目标存储单元是否为空;
在所述目标存储单元为空的情况下,所述数据写入模块将待写入元素写入所述目标存储单元的第一字段,并将所述目标存储单元的第二字段更改为第一预设值,其中,所述第一预设值用于表示所述目标存储单元已被写入元素。
2.根据权利要求1所述的方法,其特征在于,在所述数据写入模块从存储队列中查找目标存储单元之前,所述方法还包括:
所述数据写入模块判断所述存储队列是否存在允许插入元素的空间;
如果所述存储队列存在允许插入元素的空间,则进入所述数据写入模块从存储队列中查找目标存储单元的步骤。
3.根据权利要求2所述的方法,其特征在于,所述数据写入模块判断所述存储队列是否存在允许插入元素的空间,包括:
所述数据写入模块读取数据写入指针的当前值和数据读取指针的当前值;
所述数据写入模块获取所述数据写入指针的当前值和数据读取指针的当前值之间的差值;
所述数据写入模块将所述差值与所述存储队列的队列长度进行比对;
如果所述差值小于所述队列长度,则确定所述存储队列存在允许插入元素的空间;
如果所述差值等于所述存储队列的队列长度,则确定所述存储队列不存在允许插入元素的空间。
4.根据权利要求3所述的方法,其特征在于,数据写入模块从存储队列中查找目标存储单元,包括:
所述数据写入模块通过比较并交换操作,在所述数据写入指针的当前值的基础上加一,得到目标值;
所述数据写入模块确定所述目标值在存储队列中所指示的存储单元为所述目标存储单元。
5.根据权利要求1所述的方法,其特征在于,所述数据写入模块根据所述目标存储单元的第二字段判断所述目标存储单元是否为空,包括:
所述数据写入模块读取所述目标存储单元的第二字段,判断所述目标存储单元的读写标识是否为第二预设值,其中,数据读取模块从所述目标存储单元读取数据后,将所述目标存储单元的第二字段更改为所述第二预设值;
如果所述目标存储单元的读写标识为所述第二预设值,则确定所述目标存储单元为空;
如果所述目标存储单元的读写标识不为所述第二预设值,则确定所述目标存储单元不为空。
6.根据权利要求5所述的方法,其特征在于,对所述第一预设值与二的n次方之差取反,得到所述第二预设值,其中,n用于表示所述存储队列的队列长度。
7.根据权利要求6所述的方法,其特征在于,所述第一预设值为所述目标存储单元的单元标识。
8.根据权利要求2所述的方法,其特征在于,所述存储队列所属的存储结构还包括数据写入链表,如果所述存储队列不存在允许插入元素的空间,则所述数据写入模块生成等待写入对象,并将所述等待写入对象插入所述数据写入链表。
9.根据权利要求1所述的方法,其特征在于,所述存储队列所属的存储结构还包括数据读取链表,如果所述存储队列不存在允许读取的元素,则数据读取模块生成等待读取对象,并将所述等待读取对象插入所述数据读取链表。
10.根据权利要求9所述的方法,其特征在于,在所述数据写入模块将待写入元素写入所述目标存储单元的第一字段,并将所述目标存储单元的第二字段更改为第一预设值之后,所述方法还包括:
所述数据写入模块查找所述数据读取链表中是否包括所述等待读取对象;
如果所述数据读取链表中包括所述等待读取对象,则唤醒所述等待读取对象对应的数据读取模块进行数据读取。
11.一种数据的读写方法,其特征在于,包括:
数据读取模块从存储队列中查找目标存储单元,其中,所述存储队列包括多个存储单元,每个存储单元包括:用于存放元素的第一字段和用于存放读写标识的第二字段;
所述数据读取模块根据所述目标存储单元的第二字段判断所述目标存储单元是否已被写入;
在所述目标存储单元已被写入元素的情况下,所述数据读取模块读取所述目标存储单元内的元素,并将所述目标存储单元的第二字段更改为第一预设值,其中,所述第一预设值用于表示所述目标存储单元为空。
12.根据权利要求11所述的方法,其特征在于,在所述数据读取模块从存储队列中查找目标存储单元之前,所述方法还包括:
所述数据读取模块判断所述存储队列是否存在允许读取的元素;
如果所述存储队列存在允许读取的元素,则进入所述数据读取模块读取所述目标存储单元内的元素的步骤。
13.根据权利要求12所述的方法,其特征在于,所述数据读取模块判断所述存储队列是否存在允许读取的元素,包括:
所述数据读取模块读取数据写入指针的当前值和数据读取指针的当前值;
所述数据读取模块获取所述数据写入指针的当前值和数据读取指针的当前值之间的差值;
如果所述差值大于零,则确定所述存储队列存在允许读取的元素;
如果所述差值等于所述存储队列的队列长度,则确定所述存储队列不存在允许读取的元素。
14.根据权利要求13所述的方法,其特征在于,数据读取模块从存储队列中查找目标存储单元,包括:
所述数据读取模块通过比较并交换操作,在所述数据读取指针的当前值的基础上加一,得到目标值;
所述数据读取模块确定所述目标值在存储队列中所指示的存储单元为所述目标存储单元。
15.根据权利要求11所述的方法,其特征在于,所述数据读取模块根据所述目标存储单元的第二字段判断所述目标存储单元是否已被写入,包括:
所述数据读取模块读取所述目标存储单元的第二字段,判断所述目标存储单元的读写标识是否为第二预设值,其中,数据写入模块将元素写入所述目标存储单元后,将所述目标存储单元的第二字段更改为所述第二预设值;
如果所述目标存储单元的读写标识为所述第二预设值,则确定所述目标存储单元已被写入;
如果所述目标存储单元的读写标识不为所述第二预设值,则确定所述目标存储单元未被写入。
16.根据权利要求15所述的方法,其特征在于,对所述第一预设值与所述第二预设值互为相反数。
17.根据权利要求16所述的方法,其特征在于,所述第二预设值为所述目标存储单元的单元标识。
18.根据权利要求12所述的方法,其特征在于,所述存储队列所属的存储结构还包括数据读取链表,如果所述存储队列不存在允许读取的元素,则所述数据读取模块生成等待读取对象,并将所述等待读取对象插入所述数据读取链表。
19.根据权利要求11所述的方法,其特征在于,所述存储队列所属的存储结构还包括数据写入链表,如果所述存储队列不存在允许插入元素的空间,则数据写入模块生成等待写入对象,并将所述等待写入对象插入所述数据写入链表。
20.根据权利要求19所述的方法,其特征在于,在所述数据读取模块读取所述目标存储单元内的元素,并将所述目标存储单元的第二字段更改为第一预设值之后,所述方法还包括:
所述数据读取模块查找所述数据写入链表中是否包括所述等待写入对象;
如果所述数据写入链表中包括所述等待写入对象,则唤醒所述等待写入对象对应的数据写入模块进行数据写入。
21.一种数据的读写装置,其特征在于,包括:
查找模块,用于数据写入模块从存储队列中查找到目标存储单元,其中,所述存储队列包括多个存储单元,每个存储单元至少包括:用于存放元素的第一字段和用于存放读写标识的第二字段;
判断模块,用于所述数据写入模块根据所述目标存储单元的第二字段判断所述目标存储单元是否为空;
写入模块,用于在所述目标存储单元为空的情况下,所述数据写入模块将待写入元素写入所述目标存储单元的第一字段,并将所述目标存储单元的第二字段更改为第一预设值,其中,所述第一预设值用于表示所述目标存储单元已被写入元素。
22.一种数据的读写装置,其特征在于,包括:
查找模块,用于数据读取模块从存储队列中查找目标存储单元,其中,所述存储队列包括多个存储单元,每个存储单元包括:用于存放元素的第一字段和用于存放读写标识的第二字段;
判断模块,用于所述数据读取模块根据所述目标存储单元的第二字段判断所述目标存储单元是否已被写入;
写入模块,用于在所述目标存储单元已被写入元素的情况下,所述数据读取模块读取所述目标存储单元内的元素,并将所述目标存储单元的第二字段更改为第一预设值,其中,所述第一预设值用于表示所述目标存储单元为空。
23.一种存储介质,其特征在于,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行如下步骤:数据写入模块从存储队列中查找到目标存储单元,其中,所述存储队列包括多个存储单元,每个存储单元至少包括:用于存放元素的第一字段和用于存放读写标识的第二字段;所述数据写入模块根据所述目标存储单元的第二字段判断所述目标存储单元是否为空;在所述目标存储单元为空的情况下,所述数据写入模块将待写入元素写入所述目标存储单元的第一字段,并将所述目标存储单元的第二字段更改为第一预设值,其中,所述第一预设值用于表示所述目标存储单元已被写入元素。
24.一种处理器,其特征在于,所述处理器用于运行程序,其中,所述程序运行时执行如下步骤:数据写入模块从存储队列中查找到目标存储单元,其中,所述存储队列包括多个存储单元,每个存储单元至少包括:用于存放元素的第一字段和用于存放读写标识的第二字段;所述数据写入模块根据所述目标存储单元的第二字段判断所述目标存储单元是否为空;在所述目标存储单元为空的情况下,所述数据写入模块将待写入元素写入所述目标存储单元的第一字段,并将所述目标存储单元的第二字段更改为第一预设值,其中,所述第一预设值用于表示所述目标存储单元已被写入元素。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910168960.1A CN111666330B (zh) | 2019-03-06 | 2019-03-06 | 数据的读写方法和装置 |
TW108143104A TW202034154A (zh) | 2019-03-06 | 2019-11-27 | 資料的讀寫方法和裝置 |
PCT/CN2020/076106 WO2020177549A1 (zh) | 2019-03-06 | 2020-02-21 | 数据的读写方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910168960.1A CN111666330B (zh) | 2019-03-06 | 2019-03-06 | 数据的读写方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111666330A true CN111666330A (zh) | 2020-09-15 |
CN111666330B CN111666330B (zh) | 2023-05-02 |
Family
ID=72338177
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910168960.1A Active CN111666330B (zh) | 2019-03-06 | 2019-03-06 | 数据的读写方法和装置 |
Country Status (3)
Country | Link |
---|---|
CN (1) | CN111666330B (zh) |
TW (1) | TW202034154A (zh) |
WO (1) | WO2020177549A1 (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631957A (zh) * | 2020-12-14 | 2021-04-09 | 深兰人工智能(深圳)有限公司 | 数据采集方法、装置、电子设备及存储介质 |
WO2022252419A1 (zh) * | 2021-06-04 | 2022-12-08 | 广东汇天航空航天科技有限公司 | 一种数据存储方法和装置 |
CN116795322A (zh) * | 2023-06-21 | 2023-09-22 | 广州市玄武无线科技股份有限公司 | 一种多标签队列实现方法、装置、电子设备及存储介质 |
WO2024066561A1 (zh) * | 2022-09-26 | 2024-04-04 | 声龙(新加坡)私人有限公司 | 查找空闲存储的装置、方法及芯片 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113672406B (zh) * | 2021-08-24 | 2024-02-06 | 北京天融信网络安全技术有限公司 | 数据传输处理方法、装置、电子设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070169123A1 (en) * | 2005-12-30 | 2007-07-19 | Level 3 Communications, Inc. | Lock-Free Dual Queue with Condition Synchronization and Time-Outs |
CN102045258A (zh) * | 2010-12-22 | 2011-05-04 | 北京星网锐捷网络技术有限公司 | 数据缓存管理方法及装置 |
WO2017185579A1 (zh) * | 2016-04-26 | 2017-11-02 | 杭州海康威视数字技术股份有限公司 | 一种数据存储方法及装置 |
CN109101528A (zh) * | 2018-06-21 | 2018-12-28 | 深圳市买买提信息科技有限公司 | 数据处理方法、数据处理装置及电子设备 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101162608B (zh) * | 2006-10-10 | 2010-12-01 | 北京华旗资讯数码科技有限公司 | 闪存的存储块的标识方法 |
US9501407B1 (en) * | 2011-09-16 | 2016-11-22 | Altera Corporation | First-in-first-out memory with dual memory banks |
CN104142979B (zh) * | 2014-07-15 | 2017-07-25 | 武汉理工大学 | 一种实现rfid标签存储管理的索引方法 |
CN104281535B (zh) * | 2014-09-24 | 2017-11-17 | 北京兆易创新科技股份有限公司 | 一种映射表在内存中的处理方法和装置 |
-
2019
- 2019-03-06 CN CN201910168960.1A patent/CN111666330B/zh active Active
- 2019-11-27 TW TW108143104A patent/TW202034154A/zh unknown
-
2020
- 2020-02-21 WO PCT/CN2020/076106 patent/WO2020177549A1/zh active Application Filing
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070169123A1 (en) * | 2005-12-30 | 2007-07-19 | Level 3 Communications, Inc. | Lock-Free Dual Queue with Condition Synchronization and Time-Outs |
CN102045258A (zh) * | 2010-12-22 | 2011-05-04 | 北京星网锐捷网络技术有限公司 | 数据缓存管理方法及装置 |
WO2017185579A1 (zh) * | 2016-04-26 | 2017-11-02 | 杭州海康威视数字技术股份有限公司 | 一种数据存储方法及装置 |
CN109101528A (zh) * | 2018-06-21 | 2018-12-28 | 深圳市买买提信息科技有限公司 | 数据处理方法、数据处理装置及电子设备 |
Non-Patent Citations (1)
Title |
---|
张小强;彭林;彭元喜;谢伦国;: "一种基于目录的软件事务性内存实现算法" * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112631957A (zh) * | 2020-12-14 | 2021-04-09 | 深兰人工智能(深圳)有限公司 | 数据采集方法、装置、电子设备及存储介质 |
CN112631957B (zh) * | 2020-12-14 | 2024-04-05 | 深兰人工智能(深圳)有限公司 | 数据采集方法、装置、电子设备及存储介质 |
WO2022252419A1 (zh) * | 2021-06-04 | 2022-12-08 | 广东汇天航空航天科技有限公司 | 一种数据存储方法和装置 |
WO2024066561A1 (zh) * | 2022-09-26 | 2024-04-04 | 声龙(新加坡)私人有限公司 | 查找空闲存储的装置、方法及芯片 |
CN116795322A (zh) * | 2023-06-21 | 2023-09-22 | 广州市玄武无线科技股份有限公司 | 一种多标签队列实现方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
WO2020177549A1 (zh) | 2020-09-10 |
TW202034154A (zh) | 2020-09-16 |
CN111666330B (zh) | 2023-05-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111666330B (zh) | 数据的读写方法和装置 | |
US7447870B2 (en) | Device for identifying data characteristics for flash memory | |
TWI403954B (zh) | 具有指令集之電子系統、微控制器及其指令執行方法 | |
CN111767143A (zh) | 交易数据处理方法、装置、设备及系统 | |
CN101495959A (zh) | 组合微处理器内的多个寄存器单元的方法和系统 | |
CN113849433A (zh) | 一种总线控制器的执行方法、装置、总线控制器、计算机设备和存储介质 | |
CN111813517B (zh) | 任务队列的分配方法、装置、计算机设备及介质 | |
WO2024055571A1 (zh) | 一种namespace设置方法、装置及可读存储介质 | |
EP1760580A1 (en) | Processing operation information transfer control system and method | |
CN114780248A (zh) | 资源访问方法、装置、计算机设备及存储介质 | |
CN115840618B (zh) | 一种hypervisor中虚拟机模拟设备寄存器的访问方法及装置 | |
US11200203B1 (en) | Accessing files stored in a firmware volume from a pre-boot application | |
CN111381881A (zh) | 一种基于ahb总线接口的低功耗指令缓存方法及装置 | |
CN107943923B (zh) | 电报码数据库的构建方法、电报码识别方法及装置 | |
US7418529B2 (en) | Method and apparatus for communicating with an embedded controller which includes a reference to metadata objects within a computing device | |
CN115269199A (zh) | 数据处理方法、装置、电子设备及计算机可读存储介质 | |
CN112068948B (zh) | 数据散列方法、可读存储介质和电子设备 | |
US9086895B1 (en) | Controlling hardware driver selection | |
CN105659216B (zh) | 多核处理器系统的缓存目录处理方法和目录控制器 | |
US20040205701A1 (en) | Computer system, virtual machine, runtime representation of object, storage media and program transmission apparatus | |
CN115221360A (zh) | 树形结构配置方法和系统 | |
CN103186977B (zh) | 微处理器中实现遥控信号发射指令控制的电路结构 | |
CN108733678B (zh) | 一种数据搜索的方法、装置和相关设备 | |
US20060075309A1 (en) | Variable writing through a fixed programming interface | |
US20220147351A1 (en) | Instruction transmitting unit, instruction execution unit, and related apparatus and method |
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 |