CN116257359A - 数据处理方法及装置、存储介质及电子设备 - Google Patents
数据处理方法及装置、存储介质及电子设备 Download PDFInfo
- Publication number
- CN116257359A CN116257359A CN202310225628.0A CN202310225628A CN116257359A CN 116257359 A CN116257359 A CN 116257359A CN 202310225628 A CN202310225628 A CN 202310225628A CN 116257359 A CN116257359 A CN 116257359A
- Authority
- CN
- China
- Prior art keywords
- pointer
- address
- memory
- data
- descriptor
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5022—Mechanisms to release resources
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种数据处理方法及装置、存储介质及电子设备,该方法包括:在对动态数组中的数据进行处理时,先处理读取到的描述符数据中记录的未完成的写入操作,然后再进行后续的处理,由此可以保证多个线程对动态数组进行处理时数据语义的正确性,避免数据出现错乱,并且通过使用未停用指针记录列表和停用指针记录列表来实现不同的线程读取相同的指针地址不会释放内存,由此可以保证不同的线程处理数组时不会复用之前已经被释放的内存地址,从而避免ABA问题。
Description
技术领域
本发明涉及数据处理技术领域,特别涉及一种数据处理方法及装置、存储介质及电子设备。
背景技术
随着计算机技术的发展,为了提高数据的处理效率,系统通常支持多个同时线程对进行数据处理,从而实现系统的高并发。系统实现高并发后会存在多个线程处理一个数组的数据的情况,在此情况下,容易出现线程1因堵塞、资源获取慢等问题等待执行,使得对数组的写入操作未执行,而在线程1在等待执行的期间,有一个线程2对数组进行了操作,使得数组的数据发生了改变,这容易导致在线程1结束等待后执行对数组的写入操作时,数据出现错乱情况。
发明内容
有鉴于此,本发明实施例提供一种数据处理方法及装置、存储介质及电子设备,本发明在对数组处理时,先执行该数组中存在未完成的写入操作,然后再对数组进行处理,由此可以确保数组中的数据的语义的正确性,避免数据错乱。
为实现上述目的,本发明实施例提供如下技术方案:
一种数据处理方法,包括:
当接收到调用方对动态数组发送的插入请求时,将所述动态数组的描述符指针当前指向的地址确定为第一指针地址;
确定与所述第一指针地址对应的第一描述符数据,以及将所述第一指针地址存入预设的未停用指针记录列表;
执行所述第一描述符数据中记录的未完成的写入操作后,为所述调用方提供的插入数据确定分配内存,以及确定所述插入数据的插入位置;
基于所述插入数据和所述插入位置生成第二描述符数据和所述第二描述符数据的第二指针地址,将所述第二指针地址存入所述未停用指针记录列表;
当将所述描述符指针指向的地址更新为第二指针地址时,将所述第一指针地址从所述未停用指针记录列表移动至预设的停用指针记录列表,以及将所述第二指针地址从所述未停用指针记录列表移除,并执行更新后的描述符指针所指向的地址的数据中记录的写入操作。
一种数据处理装置,包括:
第一确定单元,用于当接收到调用方对动态数组发送的插入请求时,将所述动态数组的描述符指针当前指向的地址确定为第一指针地址;
第二确定单元,用于确定与所述第一指针地址对应的第一描述符数据,以及将所述第一指针地址存入预设的未停用指针记录列表;
执行单元,用于执行所述第一描述符数据中记录的未完成的写入操作后,为所述调用方提供的插入数据确定分配内存,以及确定所述插入数据的插入位置;
生成单元,用于基于所述插入数据和所述插入位置生成第二描述符数据和所述第二描述符数据的第二指针地址,将所述第二指针地址存入所述未停用指针记录列表;
移除单元,用于当将所述描述符指针指向的地址更新为第二指针地址时,将所述第一指针地址从所述未停用指针记录列表移动至预设的停用指针记录列表,以及将所述第二指针地址从所述未停用指针记录列表移除,并执行更新后的描述符指针所指向的地址的数据中记录的写入操作。
一种存储介质,所述存储介质包括存储的指令,其中,在所述指令运行时控制所述存储介质所在的设备执行如上所述的数据处理方法。
一种电子设备,包括存储器,以及一个或者一个以上的指令,其中一个或者一个以上指令存储于存储器中,且经配置以由一个或者一个以上处理器执行如上所述的数据处理方法。
与现有技术相比,本发明具有以下优点:
本发明提供一种数据处理方法及装置、存储介质及电子设备,该方法包括:当接收到调用方对动态数组发送的插入请求时,基于动态数组的描述符指针当前指向的地址确定第一指针地址,基于第一指针地址确定第一描述符数据,将第一指针地址放入未停用指针记录列表;执行第一描述符数据中记录的未完成的写入操作后,为调用方提供的插入数据生成第二描述符数据和第二描述符数据的第二指针地址,将第二指针地址存入未停用指针记录列表中,在将第二指针地址更新为描述符指针所指向的地址后,将第一指针地址放入停用指针记录列表,然后将第二指针地址从未停用指针记录列表移除,然后执行更新后的描述符指针所指向的地址的数据中记录的写入操作。由此,在对数组进行处理时,先执行数组中记录的未完成的写入操作,然后再对数组执行后续的操作,由此可以确保数组中的数据处理时的语义正确,并且有效避免数据出现错乱,并且在处理的过程中通过使用未停用指针记录列表和停用指针记录列表来实现不同的线程读取相同的指针地址不会释放内存,由此可以保证不同的线程处理数组时不会复用之前已经被释放的内存地址,从而避免出现ABA问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为现有技术的ABA问题的场景示例图;
图2为本发明提供的一种数据处理方法的方法流程图;
图3为本发明实施例提供的动态数组内部数据存储结构示意图;
图4为本发明实施例提供的动态数组的数据结构UML图;
图5为本发明实施例提供的危险指针实现原理说明图;
图6为本发明实施例提供的危险指针内存管理数据结构示例图;
图7为本发明实施例提供的为调用方提供的插入数据确定分配内存的方法流程图;
图8为本发明另一实施例提供的为分桶分配内存操作的流程图;
图9为本发明实施例提供的执行未完成的写入操作的方法流程图;
图10为本发明实施例提供的删除动态数组的数据的方法流程图;
图11为本发明另一实施例提供的删除动态数组的数据的方法流程图;
图12为本发明另一实施例提供的在动态数组中插入数据的方法流程图;
图13为本发明实施例提供的一种数据处理装置的结构示意图;
图14为本发明实施例提供的一种电子设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本申请中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
由背景技术可知,系统在实现高并发时,易出现在线程1等待执行的期间线程2对线程1要执行写入操作的数组进行了操作,导致数据的数据发生变化,在线程1恢复后执行数组的写入操作时容易使数据出现错乱。
背景技术中提及的数组是一种常用的数据结构,是由相同类型的元素(element)的集合所組成的数据结构,分配一块连续的内存来存储,用于实现高性能队列、异步处理提高性能等。一个数组可以有一个生产者和一个消费者,简称一读一写,也可以有多个生产者和多个消费者,简称多读多写。无论一读一写模式或多读多写模式,在多线程环境中都可能会面临对数组同一元素的并发读写问题,并发读写会引起数据错乱,从而数组不能正确工作。
为了解决并发读写问题,一般会引入锁,如pthread的互斥锁或系统更低级的原子锁。锁的引入解决了并发读写问题,然而会产生新的问题即性能降低问题,对数组的并发操作越多性能降低的越多,从而使数组不能满足性能需要。为此有人引入了一读一写无锁数组的概念,即数组并发操作不用锁,这种方式性能很高,但仅用于一读一写并发模式。于是有人继续改造提出了多读一写、一读多写模式或多读多写模式,一些实现实际使用的是低级的原子锁,比pthread的互斥锁性能高些,但仍然有并发性能问题,并不是真正的无锁数组,有些实现并未达到真正的并发,在并发时会有数据错误问题。
对于无锁数据结构,目前的技术方案主要以链表或环形缓冲区的方式实现,这种实现不支持高效的元素随机访问,且数据存储空间无法满足新的需求时不支持动态分配新的可用内存。另外目前主流的无锁队列实现底层均单独使用CAS指令实现,无法检测到同步过程中间状态的A->B->A变化,此时出现了ABA问题,参照图1,为ABA问题的场景示例图,由图所示,线程1无法检测到线程2通过使用CAS指令将A换成C,有将C换成A的过程,线程1最终读取到的还是A,导致具体实现时有语义上的瑕疵,因此需要新的数据结构以实现语义上完全正确且更加高效的多线程并发同步。
为解决上述问题,本发明提供一种数据处理方法及装置、存储介质及电子设备,本发明在处理数据时,需要动态数组的描述符数据中记载的为完成的写入操作执行完成后,再执行后续的操作,先执行未完成的写入操作可以确保数组中的数据语义的正确性,从而避免数据混乱,除此之外,本发明还可以提供一种支持无锁并发写入操作且内存可动态分配的数据结构,解决无锁数据结构同步较困难的两个问题,ABA问题和内存回收问题,其中ABA问题可以理解为同步语义不正确的问题,在高并发场景下提供更好的并发写入速度以及更高效的内存回收性能。
本发明可用于众多通用或专用的计算装置环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器装置、包括以上任何装置或设备的分布式计算环境等等。
参照图2,为本发明提供的一种数据处理方法的方法流程图,具体说明如下所述:
S101、当接收到调用方对动态数组发送的插入请求时,将动态数组的描述符指针当前指向的地址确定为第一指针地址。
需要说明的是,当系统接收到调用方对动态数组发送的插入请求时,系统启动一个线程调用动态数组的插入接口实现与该插入请求对应的逻辑,具体如线程将动态数组的描述符指针当前指向的地址确定为第一指针地址。
需要说明的是,本发明提及的动态数组为动态两级数组,动态数组由指针数组组成,其中数组第1个元素指向可容纳2个元素的连续内存块,第2个元素指向可容纳4个元素的连续内存块,第3个元素指向可容纳8个元素的连续内存块,第n个元素指向可容纳2n个元素的连续内存块,依此类推。参照图3,为本发明实施例提供的动态数组内部数据存储结构示意图,图中的分桶0为数组第1个元素,分桶0指向的0-0和0-1为可容纳2个元素的连续内存块,分桶1为数组第二个元素,分桶1指向的1-0、1-1、1-2以及1-3为可容纳4个元素的连续内存块,分桶N为数组第N-1个元素,指向可容纳2n个元素的连续内存块,以此类推,此处不再举例说明。
需要说明的是,本发明所应用的动态数组在支持动态扩容的同时可以在常数时间内计算出第n个元素对应的内部分桶号以及分桶内的实际内存偏移地址,从而实现数组元素的随机访问,并且还避免了数组扩容时的元素移动操作,从而可以更加容易地实现无锁扩容操作。
参照图4,为本发明实施例提供的动态数组的数据结构UML图,对图4中的各部分进行说明,动态数组为上文描述的动态数组,该动态数组为无锁数组。内部存储数组:涉及到实现细节的内部存储数组,初始容量为8,每个元素存储每个第2级数组的首元素地址。描述符:写操作描述符的抽象基类,记录执行一次写入操作需要的基本信息,包括数组大小。写操作描述符:记录一次写入操作需要的具体信息,包括数组大小、写入位置、原值以及写入值、操作是否成功。危险指针:负责描述符数据结构的生命周期管理,包括分配与释放。危险指针管理器:维护危险指针的对外API。HP线程本地数据:每个读/写动态数组的线程使用thread_local_storage方式存储的该线程危险指针使用情况,其中,thread_local_storage方式可以通过使用C++11的thread_local关键字实现。
HP线程本地数据中的HP为HP列表,可以称为危险指针列表,该列表为存储单个线程使用中的指针列表,该列表由数组实现;k为存储单个线程使用中的指针列表的存储最大容量;Retired为Retired列表,可以称为停用指针列表,Retired列表为单个线程使用完毕,待释放内存的指针列表;rnode:危险指针内部保存的危险指针列表的其中一个节点。
S102、确定与第一指针地址对应的第一描述符数据,以及将第一指针地址存入预设的未停用指针记录列表。
需要说明的是,线程在确定与第一指针地址对应的第一描述符数据后,就将第一指针地址存入预设的未停用指针记录列表,需要说明的是,此处的未停用指针记录列表为上文中提及的HP列表,即危险指针列表。进一步的,未停用指针记录列表保存在线程的线程危险指针管理器中,线程危险指针管理器中还包括停用指针列表,即Retired列表。
每个线程均存在线程危险指针管理器,每个线程的线程危险指针管理器可以通过危险指针管理器进行管理。
参照图5,为本发明实施例提供的危险指针实现原理说明图,图中的危险指针为上文中的HP列表,表示某个读/写线程使用到的可能被多个不同线程同时读写,存在并发风险的指针列表;待释放指针列表为Retired列表,表示要删除的指针列表。
参照图6,为本发明实施例提供的危险指针内存管理数据结构示例图,如图所示,线程0至线程P-1中均存在线程危险指针管理器,其中,线程危险指针管理器中包含HP列表和Retired列表,每个线程危险指针管理器由危险指针管理器进行管理。
优选的,描述符指针中保存的是描述符数据的地址,描述符指针中保存的地址所对应的是数据是一种保存在堆上的数据结构,可以称为描述符数据结构。
一个描述符数据结构中只会记录一个写入操作,优选的,记录的写入操作优先为未完成的写入操作,进一步的,当描述符数据结构中没有记录写入操作时,该描述符数据结构的内容为空。
S103、执行第一描述符数据中记录的未完成的写入操作后,为调用方提供的插入数据确定分配内存,以及确定插入数据的插入位置。
需要说明的是,在执行第一描述符数据中记录的未完成的写入操作之前,可以先判断第一描述符数据中是否记录了未完成的写入操作,当记录了未完成的写入操作,则执行记录的未完成的写入操作。进一步的,当第一描述符数据中没有记录未完成的写入操作,则第一描述符数据关于未完成的写入操作的内容为空,需要说明的是,确定第一描述符数据中是否记录了未完成的写入操作的方式可以是通过第一描述符数据中记录的写入操作的complete字段中记录的内容确定,当写入操作的complete字段记录为未完成时,可确定第一描述符数据中记录的写入操作为未完成。
优选的,当第一描述符数据中没有记录未完成的写入操作,则可以直接为调用方提供的插入数据确定分配内存,以及确定插入数据的插入位置。此处的插入数据可以是该线程需要执行的写入操作的相关信息。
需要说明的是,插入数据为调用方通过插入接口AIP输入的传参,插入数据的插入位置为调用方要求的插入位置,此处的插入位置为后续生成描述符数据的地址。
优选的,在确定调用方提供插入数据的分配内存的过程中,需要确定插入数据所属的分桶,以及插入数据在该分桶内的位置。优选的,此处确定的位置为插入数据中的内容要保存的地址。
参照图7,为本发明实施例提供的为调用方提供的插入数据确定分配内存的方法流程图,具体说明如下所述:
S201、确定插入数据所属的分桶,并获取分桶的内存地址指针。
先计算出插入数据所属的分桶,进一步的,还可以确定插入数据在该分桶内的偏移位置。优选的,在计算插入数据所属的分桶时,可以先确定分桶的编号,然后将与该编号对应的分桶确定为插入数据所属的分桶。
在确定插入数据所属的分桶后,需要确定分桶是否已经分配内存,在确定分桶是否已经分配内存时,需要通过分桶的内存地址指针进行判断。
S202、判断内存地址指针是否为空;当确定内存地址指针不为空时,执行S203;当确定内存地址指针为空时,执行S204。
S203、确定内存地址指针指向的内存,并将该内存确定为分桶的分配内存。
当内存地址指针不为空时,说明已经为该分桶分配了内存,此时该内存即为分桶的分配内存。
S204、确定分桶的内存大小,并确定与内存大小对应的内存块。
当内存地址指针为空时,可以确定尚未为分桶分配内存,此时需要给该分桶分配内存。为分桶分配内存时,需要先确定分桶的内存大小,优选的,分桶的内存大小为该分桶的前一个分桶的内存的两倍,例如前一个分桶的内存为1MB,则该分桶的内存大小为2MB。
确定与内存大小对应的内存块,此时内存块的内存容量等于分桶的内存大小,该内存块是连续的内存块。
S205、基于内存块的地址信息更新内存地址指针,当内存地址指针更新成功时,确定内存块为分桶的分配内存。
使用CAS指令更新内存地址指针,即将内存块的地址信息更新至内存地址指针,当内存地址指针更新成功时,该内存块即为分桶的分配内存;当内存地址指针更新不成功时,将该内存块释放。进一步的,当CAS指令执行成功,返回true的时候,确定内存地址指针更新成功。
需要说明的是,分桶的分配内存由连续的内存块组成。
当确定分桶尚未存在分配内存时,本发明还提供了另一分配内存的流程,具体参考图8,该图为本发明另一实施例提供的为分桶分配内存操作的流程图,具体说明如下所述:
S301、计算分桶的内存大小。
优选的,分桶的内存大小为上一个分桶的两倍内存大小。
S302、堆上分配分桶的内存块。
该内存块的内容容量与S301的内存大小相同。
S303、调用CAS指令更新分桶指针。
S304、判断分桶指针是否更新成功,当不成功时,执行S305;当成功时,结束流程。
S305、释放步骤S302中的内存块。
本发明为分桶分配内存块,从而确保分桶有对应的存储空间,以便后续在分配的内存块中存储数据。
S104、基于插入数据和插入位置生成第二描述符数据和第二描述符数据的第二指针地址,将第二指针地址存入未停用指针记录列表。
需要说明的是,此处的插入位置为调用方要求的插入位置,在生成的第二描述符数据中包含了插入数据中的写入操作的描述信息,例如写入操作的所属分桶,以及在该分桶中插入的具体位置、写入的具体数值等内容。
需要说明的是,第二指针地址为第二描述符数据所存储的地址。
S105、当将描述符指针指向的地址更新为第二指针地址时,将第一指针地址从未停用指针记录列表移动至预设的停用指针记录列表,以及将第二指针地址从未停用指针记录列表移除,并执行更新后的描述符指针所指向的地址的数据中记录的写入操作。
执行CAS CPU指令对描述符指针指向的地址进行更新,通过指向CAS CPU执行将描述符指针地址指向的地址更新为第二指针地址,当CAS指令返回相应的成功代码时,描述符指针所指向的地址成功的更新为第二指针地址。
在描述符指针所指向的地址更新为第二指针地址时,可以将第一指针地址从未停用指针记录列表移动至停用指针记录列表,以便后续将第一指针地址所指向的内存块释放。
需要说明的是,将描述符指针指向的地址更新为第二指针地址,以及将第一指针地址从未停用指针记录列表移动至停用指针记录列表,以及将第二指针地址从未停用指针记录列表移除后,可以执行更新后的描述符指针所指向的地址的数据中记录的写入操作。
进一步的,当描述符指针指向的地址未更新为第二指针地址时,需要将第二指针地址放入停用指针记录列表,以及释放未停用指针记录列表中的第一指针地址。进一步的,当线程未停止工作,或是有新的线程基于插入请求进行工作时,可以从将动态数组的描述符指针当前指向的地址确定为第一指针地址的步骤开始执行。
本发明实施例提供的方法中,当接收到调用方对动态数组发送的插入请求时,基于动态数组的描述符指针当前指向的地址确定第一指针地址,基于第一指针地址确定第一描述符数据,将第一指针地址放入未停用指针记录列表;执行第一描述符数据中记录的未完成的写入操作后,为调用方提供的插入数据生成第二描述符数据和第二描述符数据的第二指针地址,将第二指针地址存入未停用指针记录列表中,在将第二指针地址更新为描述符指针所指向的地址后,将第一指针地址放入停用指针记录列表,然后将第二指针地址从未停用指针记录列表移除,然后执行更新后的描述符指针所指向的地址的数据中记录的写入操作。由此,在对数组进行处理时,先执行数组中记录的未完成的写入操作,然后再对数组执行后续的操作,由此可以确保数组中的数据处理时的语义正确,并且有效避免数据出现错乱,并且在处理的过程中通过使用未停用指针记录列表和停用指针记录列表来实现不同的线程读取相同的指针地址不会释放内存,由此可以保证不同的线程处理数组时不会复用之前已经被释放的内存地址,从而避免出现ABA问题。
参照图9,为本发明实施例提供的执行未完成的写入操作的方法流程图,具体说明如下所述:
S401、确定存在未完成的写入操作。
S402、计算写入操作所属分桶。
S403、计算写入操作在所属分桶的写入位置。
S404、读取写入操作描述符中的写入信息。
S405、使用CAS指令将写入信息更新至写入位置中。
S406、将写操作描述符标记为完成写入。
当确定描述符数据中记录了未完成的写入操作时,需要执行该写入操作,执行写入操作的流程如S402至S406。需要说明的是,计算写入操作所属分桶,然后确定写入操作在该分桶的写入位置,然后确定写入操作的写入操作符中的写入信息,写入信息为需要写入分桶的写入位置的信息,然后执行CAS指令,以将写入信息写入该写入位置。
优选的,执行未完成的写入操作的过程还可以如下所述:读取第一描述符数据中记录的未完成的写入操作的记录信息;基于记录信息确定写入分桶,以及确定在分桶中的写入位置;将记录信息中的写入信息更新至写入位置所对应的内存中,并将该写入操作标记为完成。需要说明的是,记录信息可以为写入操作的写入操作描述符信息。
需要说明的是,本发明中提及的执行写入操作的过程均可参照上述的流程。
通过执行写入操作,可以在数组中写入数据,从而对数组中的数据记性处理。
参照图10,为本发明实施例提供的删除动态数组的数据的方法流程图,具体说明如下所述:
S501、接收调用方对所述动态数组发送的删除请求。
接收到调用方发送删除请求后,可以启用对应的流程实现该删除请求的数据处理逻辑,具体为可以调用数组中与删除请求对应的接口实现对应的数据处理逻辑。
S502、将动态数组的描述符指针当前指向的地址确定为第三指针地址。
S503、确定与第三指针地址对应的第三描述符数据,以及将第三指针地址存入预设的未停用指针记录列表。
需要说明的是,此处的第三指针地址可能与第一指针相同,也可能不同。
S504、执行第三描述符数据中记录的未完成的写入操作后,在动态数组中确定删除数据,并将删除数据从动态数组中删除,得到新的动态数组。
执行未完成的写入操作的流程具体可以参考上文所述的内容,此处不再进行赘述。
在动态数组中确定删除数据时,先确定分桶号和偏移位置,基于分桶号确定目标分桶,然后基于偏移位置读取目标分桶的二级数组的最后一个元素,并将该元素作为删除数据。
需要说明的是,将删除数据从动态数组中删除可以是从动态数组中读取出该数据,然后就可以得到新的动态数组。
S505、基于新的动态数组生成第四描述符数据以及第四描述符数据的第四指针地址,并将第四指针地址存入未停用指针记录列表。
需要说明的是,新的动态数组的大小=原来的动态数组大小-1,此处的原来的动态数组为还包含删除数据的动态数组。
生成的第四描述符数据中包含新的动态数组的大小。
S506、当将描述符指针指向的地址更新为第四指针地址时,将第三指针地址从未停用指针记录列表移动至停用指针记录列表,以及将四指针地址从未停用指针记录列表移除,并返回删除数据。
优选的,当描述符指针指向的地址未更新为第四指针地址时,将第四指针地址存入停用指针记录列表;释放未停用指针记录列表中的第三指针地址。进一步的,当线程未停止工作,或是有线程基于删除请求开始工作时,可以从将动态数组的描述符指针当前指向的地址确定为第三指针地址开始执行。
本发明实施例提供的方法中,在执行删除操作时使用了未停用指针记录列表和停用指针记录列表,可以将线程正在访问不愿被释放的内存对象保存在未停用指针记录列表中,由此可以保证不同线程并发读写动态数组的描述符数据时不会复用之前已经被释放的内存地址,避免ABA问题。
参照图11,为本发明另一实施例提供的删除动态数组的数据的方法流程图,具体说明如下所述:
S601、将动态数组的描述符指针当前指向的地址确定为第三指针地址,并确定与第三指针地址对应的第三描述符数据。
S602、将第三指针地址存入预设的未停用指针记录列表。
S603、执行第三描述符数据中记录的未完成的写入操作。
S604、从动态数组中读取最后一个元素。
需要说明的是,从动态数组中读取的最后一个元素从动态数组中根据计算出来的分桶号和偏移位置读取内部二级数组的最后一个元素。
S605、将读取最后一个元素后的数组确定为新的动态数组,根据新的动态数组大小生成第四描述符数据和第四描述符数据的第四指针地址。
S606、将第四指针地址放入HP列表中。
S607、使用CAS指令更新描述符指针所指向的地址。
S608、判断描述符指针指向的地址是否更新成功,当更新成功时,执行S609;当更新不成功时,执行S612。
S609、将第三指针地址放入Retired列表中。
S610、将第四指针地址从HP列表中移除。
S611、返回读取的最后一个元素。
S612、将第四指针地址放入Retired列表中。
S613、将第三指针地址从HP列表中移除。
需要说明的是,将第三指针地址从HP列表中移除后,当线程还没有结束时,可以返回执行S601;优选的,当有新的线程开始工作时也从S601开始。
本发明在删除数据时也使用Retired列表和HP列表,可以保证不同线程并发读写动态数组的描述符数据时不会复用之前已经被释放的堆内存地址,从而避免了因为不同线程间共享了已标记为回收并复用的内存块导致的ABA问题,避免数据出现错乱。
参照图12,为本发明另一实施例提供的在动态数组中插入数据的方法流程图,具体说明如下所述:
S701、将动态数组的描述符指针当前指向的地址确定为第一指针地址,并确定与第一指针地址对应的第一描述符数据。
S702、将第一指针地址存入预设的未停用指针记录列表。
S703、执行第一描述符数据中记录的未完成的写入操作。
S704、计算插入操作所属的分桶与分桶内位置。
S705、判断分桶是否已分配内存,当未分配内存时,执行S706;当已分配内存时,执行S707。
S706、为分桶分配内存。
S707、根据插入元素与插入位置生成第二描述符数据和第二描述符数据的第二指针地址。
S708、将第二指针地址放入HP列表中。
S709、使用CAS指令更新描述符指针所指向的地址。
S710、判断描述符指针所指向的地址是否更新成功,当更新成功时,执行S711;当更新未成功时,执行S714。
S711、将第一指针地址放入Retired列表中。
S712、将第二指针地址从HP列表中移除。
S713、执行更新后的描述符指针所指向的地址的数据中包含的写入操作。
S714、将第二指针地址放入Retired列表中。
S715、将第一指针地址从HP列表中释放。
需要说明的是,在将第一指针地址从HP列表中释放后,可以返回执行S701。
关于插入数据的说明可以参照上文的相关说明,此处不再进行赘述。
本发明提供的数据处理方案中,提出了一种支持无锁动态扩容的数据结构,即动态数组。本发明提供的动态数组与使用环形缓冲区的无锁队列设计相比,本文的两级数组支持动态扩容的特性。数组扩容时多个请求扩容的线程维护各自独立的堆内存块,一旦发现新空间已经被其它线程分配完毕则释放已经分配的本线程堆内存块,从而实现无锁的数组动态扩容。本发明还提出了一种作为写入代理的描述符数据,需要说明的是,本发明的描述符数据也可称为描述符数据结构,动态数组的插入/删除操作提交到描述符数据结构中,该结构作为代理层用于记录最新一次提交的写入操作,可以解决数组动态扩容重新申请额外内存空间时的并发写入问题。进一步的,描述符数据结构记录的数据变动操作通过CPU的CAS指令实现无锁写入,与常规使用互斥量或者读写锁的阻塞同步机制相比不会出现多个线程消耗CPU时间空转的情况,因而具有更高的并发写效率。
本发明还提供了无等待(wait-free)的描述符数据结构内存管理机制。通过引入危险指针管理上述的描述符数据结构的内存动态释放,从而提供一种比传统的非阻塞引用计数方式(lock-free)更高级别的无等待内存回收管理机制,因此在高并发场景下能够提供更好的并发写入速度以及更高效的内存回收性能。
本发明解决了一般无锁实现方法中CAS指令同步产生的ABA问题。通过使用危险指针的读写管理接口以及线程局部存储特性保证被不同线程读取中的同一描述符数据结构不会被释放内存,因而保证了不同线程并发读写动态数组的描述符数据结构时不会复用之前已经被释放的堆内存地址,从而避免因为不同线程间共享了已标记为回收并复用的内存块而出现的ABA问题。
本发明提供的数据处理方案中,提供了线程安全的无锁动态数组和危险指针管理器,并在无锁动态数组中定义描述符数据结构,以及使用危险指针管理器来对线程对动态数据进行读写操作时的内存进行管理,基于描述符数据结构解决了无锁数组动态扩容问题,同时结合危险指针内存管理方式实现了非阻塞、且支持多读多写和动态扩容的线程安全数组,提供比常规使用同步读写锁的动态数组更高的并发写性能。
本发明与常规使用CAS指令实现的无锁队列相比,提供队列不支持的随机访问和动态扩容特性。本发明提供比常规使用同步读写锁的动态数组更高的并发写性能,以及更加高效的内存管理机制。
基于上述两点,本发明通过封装描述符数据结构和危险指针内存管理机制,提供了一组对外的动态数组元素数据操作API,具体如:
1)读取元素操作Read:用于返回数组的第i个位置的元素;
2)写入元素操作Write:用于修改数组的第i个位置的元素;
3)随机访问操作(At):访问数组的第N个元素;
4)插入操作(Push_back):从数组尾部插入一个新元素;
5)删除操作(Pop_back):从数组尾部删除一个新元素,并返回该元素值;
6)扩容操作(Reserve):为数组提供可容纳N个额外的存储空间;
7)读取数组大小操作(Size):获取数组的大小。
需要说明的是,Push_back和Pop_back操作描述符数据结构的内部内存管理中引入了危险指针(Hazard Pointer),集成到描述符的危险指针数据结构UML图可以参考图4。动态数组中每个读/写数组元素的内部操作线程均需使用危险指针管理器数据结构,其中危险指针管理器使用线程局部存储变量以实现线程间独立的读写原子操作,其实现原理如图5所示。具体实现方案为:每个数组元素读/写线程的危险指针管理器由大小为K的危险指针记录数组HP以及大小为R的停用危险指针记录数组Retired组成,危险指针管理器具体内部数据结构如图6所示。
危险指针管理器具体的内存数据释放流程为:
a)使用线程局部数据保存正在使用的共享内存(数据结构元素)列表,以及要删除的共享内存列表,分别记为HP,Retired。
b)每一个线程都将本身正在访问不愿被释放的内存对象保存在HP列表中,使用后取出。
c)当任何线程删除内存对象,把对象放入Retired列表。
d)当Retired列表中元素数量达到阈值K,扫描HP列表和Retired,释放在Retired列表中存在且HP列表中不存在的元素。
以上描述中HP列表是单写多读,而Retired列表是单写单读的,因而上述流程操作的实现仅依赖原子性读写,而未采用任何重量级的CAS同步原语,因而该操作流程是无等待(wait-free)的,比基于CAS指令的无锁实现(lock-free)更加高效。
下面将分别提供各个API的具体定义,其中内部分配新桶操作AllocBucket和内部写入操作CompleteWrite是动态数组实现细节依赖的内部操作。下列算法中的First_Bucket_Size表示第1个分桶的大小,默认取值为8,HighestBit表示整型数取值为1的最高位位置,^,&,.分别表示指针的解引用,取地址,访问指针对象的成员操作。HP.insert表示从HP列表()中插入指定的指针元素,HP.remove表示从HP列表删除指定的指针元素,Retired.insert表示从Retired列表中插入指定的指针元素,Retired.remove表示从Retired列表删除指定的指针元素。
以下是读取指定位置元素API接口的算法伪码:
读取元素Readvector,i
return At(vector,i)^
上述的内容仅为读取指定位置元素API接口的算法伪码的其中一种示例,本发明不一一进行举例说明。
以下是写入指定位置元素API接口的算法伪码:
写入指定元素Write vector,i,elem
return At(vector,i)^←elem
上述的内容仅为写入指定位置元素API接口的算法伪码的其中一种示例,本发明不一一进行举例说明。
以下是访问指定位置元素API接口操作的算法伪码:
访问指定位置元素At Vector,i
pos←pos+First_Bucket_Size
hibit←HighestBit(pos)
idx←pos xor 2hibit
retrun&vector.memory[hibit-HighestBit(First_Bucket_Size)][idx]
上述的内容仅为访问指定位置元素API接口操作的算法伪码的其中一种示例,本发明不一一进行举例说明。
以下是插入新元素push_backAPI接口的算法伪码:
插入新元素push_backvector,elem
上述的内容仅为插入新元素push_back API接口的算法伪码的其中一种示例,本发明不一一进行举例说明。需要说明的是,插入新元素push_back API接口的具体流程参见图12,相关说明参照上文的内容,此处不再进行赘述。
以下是数组内部完成写入操作的算法伪码:
内部写入操作CompleteWrite vector,writeop
上述的内容仅为数组内部完成写入操作的算法伪码的其中一种示例,本发明不一一进行举例说明。需要说明的是,数组内部完成写入操作的流程可以参照图9,相关内容可以参照上文的说明,此处不再进行赘述。
以下是弹出尾部元素pop_backAPI接口的算法伪码:
弹出尾部元素pop_back vector
上述的内容仅为数组内部完成写入操作的算法伪码的其中一种示例,本发明不一一进行举例说明。需要说明的是,弹出尾部元素的中文流程可以参见图11,相关说明可以参照上文的内容,此处不再进行赘述。
以下是数组扩容API接口的算法伪码:
扩容Reserve vector,size
上述的内容仅为数组扩容API接口的算法伪码的其中一种示例,本发明不一一进行举例说明。
以下是内部分配新桶操作的算法伪码:
内部分配新桶AllocBucketvector,bucket
上述的内容仅为内部分配新桶操作的算法伪码的其中一种示例,本发明不一一进行举例说明。
以下是获取数组大小操作API接口的算法伪码:
获取数组大小Size vector
上述的内容仅为获取数组大小操作API接口的算法伪码的其中一种示例,本发明不一一进行举例说明。
与图1所示的方法相对应的,本发明还提供一种数据处理装置,该装置可以配置在系统中,用于支持图1所示的方法的具体实现。
参照图13,为本发明实施例提供的一种数据处理装置的结构示意图,具体说明如下所述:
第一确定单元801,用于当接收到调用方对动态数组发送的插入请求时,将所述动态数组的描述符指针当前指向的地址确定为第一指针地址;
第二确定单元802,用于确定与所述第一指针地址对应的第一描述符数据,以及将所述第一指针地址存入预设的未停用指针记录列表;
执行单元803,用于执行所述第一描述符数据中记录的未完成的写入操作后,为所述调用方提供的插入数据确定分配内存,以及确定所述插入数据的插入位置;
生成单元804,用于基于所述插入数据和所述插入位置生成第二描述符数据和所述第二描述符数据的第二指针地址,将所述第二指针地址存入所述未停用指针记录列表;
移除单元805,用于当将所述描述符指针指向的地址更新为第二指针地址时,将所述第一指针地址从所述未停用指针记录列表移动至预设的停用指针记录列表,以及将所述第二指针地址从所述未停用指针记录列表移除,并执行更新后的描述符指针所指向的地址的数据中记录的写入操作。
在本发明提供的另一实施中,该装置的执行单元803,包括:
第一确定子单元,用于确定所述插入数据所属的分桶,并获取所述分桶的内存地址指针;
判断子单元,用于判断所述内存地址指针是否为空;
第二确定子单元,用于当确定所述内存地址指针不为空时,确定所述内存地址指针指向的内存,并将该内存确定为所述分桶的分配内存;
第三确定子单元,用于当确定所述内存地址指针为空时,确定所述分桶的内存大小,并确定与所述内存大小对应的内存块;
第四确定子单元,用于基于所述内存块的地址信息更新所述内存地址指针,当所述内存地址指针更新成功时,确定所述内存块为所述分桶的分配内存。
在本发明提供的另一实施中,该装置还包括:
第一存入单元,用于当所述描述符指针指向的地址未更新为第二指针地址时,将所述第二指针地址放入所述停用指针记录列表;
第一释放单元,用于释放所述未停用指针记录列表中的第一指针地址。
在本发明提供的另一实施中,该装置的执行单元803,包括:
读取子单元,用于读取所述第一描述符数据中记录的未完成的写入操作的记录信息;
第五确定子单元,用于基于所述记录信息确定写入分桶,以及确定在所述写入分桶中的写入位置;
更新子单元,用于将所述记录信息中的写入信息更新至所述写入位置所对应的内存中,并将该写入操作标记为完成。
在本发明提供的另一实施中,该装置还包括:
接收单元,用于接收所述调用方对所述动态数组发送的删除请求;
第三确定单元,用于将所述动态数组的描述符指针当前指向的地址确定为第三指针地址;
第四确定单元,用于确定与所述第三指针地址对应的第三描述符数据,以及将所述第三指针地址存入预设的未停用指针记录列表;
删除单元,用于执行所述第三描述符数据中记录的未完成的写入操作后,在所述动态数组中确定删除数据,并将所述删除数据从所述动态数组中删除,得到新的动态数组;
第二存入单元,用于基于所述新的动态数组生成第四描述符数据以及所述第四描述符数据的第四指针地址,并将所述第四指针地址存入所述未停用指针记录列表;
移动单元,用于当将所述描述符指针指向的地址更新为所述第四指针地址时,将所述第三指针地址从所述未停用指针记录列表移动至所述停用指针记录列表,以及将所述四指针地址从所述未停用指针记录列表移除,并返回所述删除数据。
在本发明提供的另一实施中,该装置还包括:
第三存入单元,用于当所述描述符指针指向的地址未更新为所述第四指针地址时,将所述第四指针地址存入所述停用指针记录列表;
第二释放单元,用于释放所述未停用指针记录列表中的第三指针地址。
一种存储介质,所述存储介质包括存储的指令,其中,在所述指令运行时控制所述存储介质所在的设备执行如上所述的数据处理方法。
一种电子设备,包括存储器,以及一个或者一个以上的指令,其中一个或者一个以上指令存储于存储器中,且经配置以由一个或者一个以上处理器执行如上所述的数据处理方法。
本发明实施例还提供了一种存储介质,所述存储介质包括存储的指令,其中,在所述指令运行时控制所述存储介质所在的设备执行上述数据处理方法。
本发明实施例还提供了一种电子设备,其结构示意图如图14所示,具体包括存储器901,以及一个或者一个以上的指令902,其中一个或者一个以上指令902存储于存储器901中,且经配置以由一个或者一个以上处理器903执行所述一个或者一个以上指令902执行上述数据处理方法。
上述各个实施例的具体实施过程及其衍生方式,均在本发明的保护范围之内。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的系统及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种数据处理方法,其特征在于,包括:
当接收到调用方对动态数组发送的插入请求时,将所述动态数组的描述符指针当前指向的地址确定为第一指针地址;
确定与所述第一指针地址对应的第一描述符数据,以及将所述第一指针地址存入预设的未停用指针记录列表;
执行所述第一描述符数据中记录的未完成的写入操作后,为所述调用方提供的插入数据确定分配内存,以及确定所述插入数据的插入位置;
基于所述插入数据和所述插入位置生成第二描述符数据和所述第二描述符数据的第二指针地址,将所述第二指针地址存入所述未停用指针记录列表;
当将所述描述符指针指向的地址更新为第二指针地址时,将所述第一指针地址从所述未停用指针记录列表移动至预设的停用指针记录列表,以及将所述第二指针地址从所述未停用指针记录列表移除,并执行更新后的描述符指针所指向的地址的数据中记录的写入操作。
2.根据权利要求1所述的方法,其特征在于,所述为所述调用方提供的插入数据确定分配内存,包括:
确定所述插入数据所属的分桶,并获取所述分桶的内存地址指针;
判断所述内存地址指针是否为空;
当确定所述内存地址指针不为空时,确定所述内存地址指针指向的内存,并将该内存确定为所述分桶的分配内存;
当确定所述内存地址指针为空时,确定所述分桶的内存大小,并确定与所述内存大小对应的内存块;
基于所述内存块的地址信息更新所述内存地址指针,当所述内存地址指针更新成功时,确定所述内存块为所述分桶的分配内存。
3.根据权利要求1所述的方法,其特征在于,还包括:
当所述描述符指针指向的地址未更新为第二指针地址时,将所述第二指针地址放入所述停用指针记录列表;
释放所述未停用指针记录列表中的第一指针地址。
4.根据权利要求1所述的方法,其特征在于,所述执行所述第一描述符数据中记录的未完成的写入操作,包括:
读取所述第一描述符数据中记录的未完成的写入操作的记录信息;
基于所述记录信息确定写入分桶,以及确定在所述写入分桶中的写入位置;
将所述记录信息中的写入信息更新至所述写入位置所对应的内存中,并将该写入操作标记为完成。
5.根据权利要求1所述的方法,其特征在于,还包括:
接收所述调用方对所述动态数组发送的删除请求;
将所述动态数组的描述符指针当前指向的地址确定为第三指针地址;
确定与所述第三指针地址对应的第三描述符数据,以及将所述第三指针地址存入预设的未停用指针记录列表;
执行所述第三描述符数据中记录的未完成的写入操作后,在所述动态数组中确定删除数据,并将所述删除数据从所述动态数组中删除,得到新的动态数组;
基于所述新的动态数组生成第四描述符数据以及所述第四描述符数据的第四指针地址,并将所述第四指针地址存入所述未停用指针记录列表;
当将所述描述符指针指向的地址更新为所述第四指针地址时,将所述第三指针地址从所述未停用指针记录列表移动至所述停用指针记录列表,以及将所述四指针地址从所述未停用指针记录列表移除,并返回所述删除数据。
6.根据权利要求5所述的方法,其特征在于,还包括:
当所述描述符指针指向的地址未更新为所述第四指针地址时,将所述第四指针地址存入所述停用指针记录列表;
释放所述未停用指针记录列表中的第三指针地址。
7.一种数据处理装置,其特征在于,包括:
第一确定单元,用于当接收到调用方对动态数组发送的插入请求时,将所述动态数组的描述符指针当前指向的地址确定为第一指针地址;
第二确定单元,用于确定与所述第一指针地址对应的第一描述符数据,以及将所述第一指针地址存入预设的未停用指针记录列表;
执行单元,用于执行所述第一描述符数据中记录的未完成的写入操作后,为所述调用方提供的插入数据确定分配内存,以及确定所述插入数据的插入位置;
生成单元,用于基于所述插入数据和所述插入位置生成第二描述符数据和所述第二描述符数据的第二指针地址,将所述第二指针地址存入所述未停用指针记录列表;
移除单元,用于当将所述描述符指针指向的地址更新为第二指针地址时,将所述第一指针地址从所述未停用指针记录列表移动至预设的停用指针记录列表,以及将所述第二指针地址从所述未停用指针记录列表移除,并执行更新后的描述符指针所指向的地址的数据中记录的写入操作。
8.根据权利要求7所述的装置,其特征在于,所述执行单元,包括:
第一确定子单元,用于确定所述插入数据所属的分桶,并获取所述分桶的内存地址指针;
判断子单元,用于判断所述内存地址指针是否为空;
第二确定子单元,用于当确定所述内存地址指针不为空时,确定所述内存地址指针指向的内存,并将该内存确定为所述分桶的分配内存;
第三确定子单元,用于当确定所述内存地址指针为空时,确定所述分桶的内存大小,并确定与所述内存大小对应的内存块;
第四确定子单元,用于基于所述内存块的地址信息更新所述内存地址指针,当所述内存地址指针更新成功时,确定所述内存块为所述分桶的分配内存。
9.一种存储介质,其特征在于,所述存储介质包括存储的指令,其中,在所述指令运行时控制所述存储介质所在的设备执行如权利要求1-6任意一项所述的数据处理方法。
10.一种电子设备,其特征在于,包括存储器,以及一个或者一个以上的指令,其中一个或者一个以上指令存储于存储器中,且经配置以由一个或者一个以上处理器执行如权利要求1-6任意一项所述的数据处理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310225628.0A CN116257359A (zh) | 2023-03-09 | 2023-03-09 | 数据处理方法及装置、存储介质及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310225628.0A CN116257359A (zh) | 2023-03-09 | 2023-03-09 | 数据处理方法及装置、存储介质及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116257359A true CN116257359A (zh) | 2023-06-13 |
Family
ID=86684155
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310225628.0A Pending CN116257359A (zh) | 2023-03-09 | 2023-03-09 | 数据处理方法及装置、存储介质及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116257359A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116483586A (zh) * | 2023-06-21 | 2023-07-25 | 广东广宇科技发展有限公司 | 一种基于动态数组的数据高效处理方法 |
-
2023
- 2023-03-09 CN CN202310225628.0A patent/CN116257359A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116483586A (zh) * | 2023-06-21 | 2023-07-25 | 广东广宇科技发展有限公司 | 一种基于动态数组的数据高效处理方法 |
CN116483586B (zh) * | 2023-06-21 | 2023-09-26 | 广东广宇科技发展有限公司 | 一种基于动态数组的数据高效处理方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7949839B2 (en) | Managing memory pages | |
US6490666B1 (en) | Buffering data in a hierarchical data storage environment | |
KR102093523B1 (ko) | 순차적인 순서의 스왑 파일을 이용한 작업 세트 스와핑 기법 | |
CN110727675B (zh) | 一种链表的处理方法及装置 | |
US6170045B1 (en) | Cross-system data piping using an external shared memory | |
CN111309289B (zh) | 一种内存池管理组件 | |
US20160267005A1 (en) | Memory reclamation on a computing device | |
CN116257359A (zh) | 数据处理方法及装置、存储介质及电子设备 | |
US8185693B2 (en) | Cache-line aware collection for runtime environments | |
US7991976B2 (en) | Permanent pool memory management method and system | |
JP2006503361A (ja) | データ処理装置及びデータ処理装置内の少なくとも2つの処理手段を同期させる方法 | |
KR101590764B1 (ko) | 컴퓨팅 시스템 및 컴퓨팅 시스템의 메모리 관리 방법 | |
US6092166A (en) | Cross-system data piping method using an external shared memory | |
US6691121B1 (en) | Method and apparatus for online and dynamic extension of IMS data entry databases | |
US9418175B2 (en) | Enumeration of a concurrent data structure | |
JPWO2019008715A1 (ja) | データロードプログラム、データロード方法およびデータロード装置 | |
US6061771A (en) | Cross-system data piping system using an external shared memory | |
CN113590536B (zh) | 一种数据存储方法、系统、电子设备及存储介质 | |
GB2516091A (en) | Method and system for implementing a dynamic array data structure in a cache line | |
JP4131579B2 (ja) | データ管理システムおよびデータ管理方法 | |
CN114817185A (zh) | 一种基于消息驱动的异步日志处理方法 | |
CN118069071A (zh) | 资源访问控制方法、装置、计算机设备和存储介质 | |
Aggarwal et al. | Expander: Lock-free cache for a concurrent data structure | |
JPH0337748A (ja) | 主記憶を利用した外部記憶アクセス方式 | |
CA2232702A1 (en) | Cross-system data piping using an external shared memory |
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 |