CN110287044B - 无锁共享内存处理方法、装置、电子设备及可读存储介质 - Google Patents
无锁共享内存处理方法、装置、电子设备及可读存储介质 Download PDFInfo
- Publication number
- CN110287044B CN110287044B CN201910591481.0A CN201910591481A CN110287044B CN 110287044 B CN110287044 B CN 110287044B CN 201910591481 A CN201910591481 A CN 201910591481A CN 110287044 B CN110287044 B CN 110287044B
- Authority
- CN
- China
- Prior art keywords
- data
- shared memory
- area
- block
- mapping
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000003672 processing method Methods 0.000 title claims abstract description 32
- 238000012545 processing Methods 0.000 claims abstract description 37
- 238000000034 method Methods 0.000 claims abstract description 26
- 238000000605 extraction Methods 0.000 claims abstract description 21
- 238000013507 mapping Methods 0.000 claims description 65
- 238000012217 deletion Methods 0.000 claims description 10
- 230000037430 deletion Effects 0.000 claims description 10
- 238000003491 array Methods 0.000 claims description 6
- 238000007493 shaping process Methods 0.000 claims description 5
- 238000004364 calculation method Methods 0.000 claims description 3
- 238000011161 development Methods 0.000 abstract description 3
- 238000010586 diagram Methods 0.000 description 10
- 238000004590 computer program Methods 0.000 description 8
- 230000006870 function Effects 0.000 description 7
- 230000003287 optical effect Effects 0.000 description 3
- 230000000903 blocking effect Effects 0.000 description 2
- 238000004891 communication Methods 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 238000006467 substitution reaction Methods 0.000 description 2
- 230000002159 abnormal effect Effects 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 238000004064 recycling Methods 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 238000012552 review Methods 0.000 description 1
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/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
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
本申请实施例提供一种无锁共享内存处理方法、装置、电子设备及可读存储介质,通过内存映射的方式将共享内存文件映射到共享内存区域中,并根据映射完成后的映射返回值将得到的共享内存区域中对应的映射区域的起始指针地址和偏移记录指针地址记录到数据业务对应的应用程序的内存中。在此基础上,运用原子更新的原子数据结构,并通过数据划分为索引区、哈希数组数据区、提取池以及存储数据区的多个原子整型的方法,从而无需为每个进程或线程设定私有检索数据,在数据高并发处理时占用内存更小,使得在直播业务中,能够为高速发展业务提供高并发的数据读写服务,并为内存数据库提供高并发高性能的读写与存储方案。
Description
技术领域
本申请涉及计算机技术领域,具体而言,涉及一种无锁共享内存处理方法、装置、电子设备及可读存储介质。
背景技术
直播业务并发量大,数据更新和读取频繁,传统的锁竞争下的并发读写存在瓶颈。另外,传统单一的数据读写模式,已不再满足直播业务飞速增长、读写并发请求庞大的需求。
发明内容
有鉴于此,本申请实施例的目的在于提供一种无锁共享内存处理方法、装置、电子设备及可读存储介质,以解决或者改善上述问题。
根据本申请实施例的一个方面,提供一种电子设备,可以包括一个或多个存储介质和一个或多个与存储介质通信的处理器。一个或多个存储介质存储有处理器可执行的机器可执行指令。当电子设备运行时,处理器执行所述机器可执行指令,以执行下述的无锁共享内存处理方法。
根据本申请实施例的另一方面,提供一种无锁共享内存处理方法,应用于电子设备,所述方法包括:
针对每个数据业务,配置该数据业务的内存配置数据,所述内存配置数据包括所需的数据块大小、数据块数量以及共享内存文件路径;
根据所述数据块大小和数据块数量计算该数据业务所需的共享内存空间;
根据所述共享内存文件路径打开共享内存文件,并根据所述共享内存空间,通过预设的内存映射方式将所述共享内存文件映射到共享内存区域中,并获取映射完成后的映射返回值;
根据所述映射返回值得到所述共享内存区域中对应的映射区域的起始指针地址和偏移记录指针地址,并将所述起始指针地址和偏移记录指针地址记录到所述数据业务对应的应用程序的内存中;
对所述共享内存区域进行辅助数据的原子映射后,为所述共享内存区域分配索引区、哈希数组数据区、提取池以及存储数据区的原子数据结构,以完成该数据业务的无锁共享内存处理。
根据本申请实施例的另一方面,提供一种无锁共享内存处理装置,应用于电子设备,所述装置包括:
数据配置模块,用于针对每个数据业务,配置该数据业务的内存配置数据,所述内存配置数据包括所需的数据块大小、数据块数量以及共享内存文件路径;
计算模块,用于根据所述数据块大小和数据块数量计算该数据业务所需的共享内存空间;
内存映射模块,用于根据所述共享内存文件路径打开共享内存文件,并根据所述共享内存空间,通过预设的内存映射方式将所述共享内存文件映射到共享内存区域中,并获取映射完成后的映射返回值;
地址记录模块,用于根据所述映射返回值得到所述共享内存区域中对应的映射区域的起始指针地址和偏移记录指针地址,并将所述起始指针地址和偏移记录指针地址记录到所述数据业务对应的应用程序的内存中;
分配模块,用于对所述共享内存区域进行辅助数据的原子映射后,为所述共享内存区域分配索引区、哈希数组数据区、提取池以及存储数据区的原子数据结构,以完成该数据业务的无锁共享内存处理。
根据本申请实施例的另一方面,提供一种可读存储介质,该可读存储介质上存储有机器可执行指令,该计算机程序被处理器运行时可以执行上述的无锁共享内存处理方法的步骤。
基于上述任一方面,本申请实施例通过内存映射的方式将共享内存文件映射到共享内存区域中,并根据映射完成后的映射返回值将得到的共享内存区域中对应的映射区域的起始指针地址和偏移记录指针地址记录到数据业务对应的应用程序的内存中。在此基础上,运用原子更新的原子数据结构,并通过数据划分为索引区、哈希数组数据区、提取池以及存储数据区的多个原子整型的方法,从而无需为每个进程或线程设定私有检索数据,在数据高并发处理时占用内存更小,使得在直播业务中,能够为高速发展业务提供高并发的数据读写服务,并为内存数据库提供高并发高性能的读写与存储方案。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1示出了本申请实施例所提供的无锁共享内存处理方法的流程示意图之一;
图2示出了图1中所示的步骤S150包括的各个子步骤的流程示意图;
图3示出了本申请实施例所提供的无锁共享内存处理方法的流程示意图之二;
图4示出了本申请实施例所提供的用于执行上述的无锁共享内存处理方法的电子设备的结构示意框图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,应当理解,本申请中附图仅起到说明和描述的目的,并不用于限定本申请的保护范围。另外,应当理解,示意性的附图并未按实物比例绘制。本申请中使用的流程图示出了根据本申请实施例的一些实施例实现的操作。应该理解,流程图的操作可以不按顺序实现,没有逻辑的上下文关系的步骤可以反转顺序或者同时实施。此外,本领域技术人员在本申请内容的指引下,可以向流程图添加一个或多个其他操作,也可以从流程图中移除一个或多个操作。
另外,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
服务器大多是一个多核处理设备,针对服务器的性能调优最主要的方式便是并行编程,使得服务器可以并行处理一些共享数据。例如,服务器可以采用对冲突加锁的方式,即多个并行对象(线程或进程)对同一份数据进行访问(读写)。其中,为了保护服务器的数据区,在当前存在一个对象对某份数据块进行操作的时候,另外一个对象需要阻塞等待。
而无锁数据结构则不需要等待,可以并发进行,从而通过减少阻塞和等待,以改进服务器的并发性和可扩展性。加锁的数据结构在异常情况下可能会导致服务器的死锁问题,此外,如果加锁力度太大,还会导致所有线程或进程阻塞,导致后续解锁和解锁时的资源消耗和上下文切换消耗,从而出现优先级反转以及锁护送的现象。无锁的数据结构,相较于上述有锁的数据结构,可以减少资源消耗(某种意义上也就是时间消耗),并且可以消除条件竞争,阻塞,死锁,可组合性不足带来的潜在问题。然而,发明人在研究中发现,目前无锁的数据结构,需要为每个进程或线程设定私有检索数据,在数据高并发处理时,占用内存较大。
为此,基于上述技术问题的发现,发明人提出下述技术方案以解决或者改善上述问题。需要注意的是,以上现有技术中的方案所存在的缺陷,均是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本申请实施例针对上述问题所提出的解决方案,都应该是发明人在发明创造过程中对本申请做出的贡献,而不应当理解为本领域技术人员所公知的技术内容。
图1示出了本申请实施例提供的无锁共享内存处理方法的流程示意图,应当理解,在其它实施例中,本实施例的无锁共享内存处理方法其中部分步骤的顺序可以不以图1及以下具体实施例的顺序为限制,例如可以根据实际需要相互交换,或者其中的部分步骤也可以省略或删除。该无锁共享内存处理方法的详细步骤介绍如下。
步骤S110,针对每个数据业务,配置该数据业务的内存配置数据。
本实施例中,以直播场景为例,数据业务可以包括直播视频业务、直播语音业务、直播订单业务等多种业务,针对不同的数据业务可以配置对应的内存配置数据。其中,所述内存配置数据可以包括该数据业务所需的数据块大小、数据块数量以及共享内存文件路径。
步骤S120,根据所述数据块大小和数据块数量计算该数据业务所需的共享内存空间。
步骤S130,根据所述共享内存文件路径打开共享内存文件,并根据所述共享内存空间,通过预设的内存映射方式将所述共享内存文件映射到共享内存区域中,并获取映射完成后的映射返回值。
示例性地,该预设的内存映射方式可以是mmap方式,mmap可以将共享内存文件映射到共享内存区域中对应的进程的地址空间中,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系,在实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存。在完成所述共享内存文件映射后,会返回一个mmap返回值,作为该映射返回值。
步骤S140,根据所述映射返回值得到所述共享内存区域中对应的映射区域的起始指针地址和偏移记录指针地址,并将所述起始指针地址和偏移记录指针地址记录到所述数据业务对应的应用程序的内存中。
步骤S150,对所述共享内存区域进行辅助数据的原子映射后,为所述共享内存区域分配索引区、哈希数组数据区、提取池以及存储数据区的原子数据结构,以完成该数据业务的无锁共享内存处理。
基于上述设计,本申请通过内存映射的方式将所述共享内存文件映射到共享内存区域中,并根据映射完成后的映射返回值将得到的共享内存区域中对应的映射区域的起始指针地址和偏移记录指针地址记录到所述数据业务对应的应用程序的内存中,在此基础上运用原子更新的原子数据结构,并通过数据划分为索引区、哈希数组数据区、提取池以及存储数据区的多个原子整型的方法,从而无需为每个进程或线程设定私有检索数据,在数据高并发处理时占用内存更小,使得在直播业务中,能够为高速发展业务提供高并发的数据读写服务,并为内存数据库提供高并发高性能的读写与存储方案。
在一种可能的实施方式中,针对步骤S150,对所述共享内存区域进行辅助数据的原子映射的方式可以是:
生成所述共享内存区域的备注信息区;
在所述备注信息区中的第一个字节的位置配置标记值;
在所述备注信息区中的第二个字节的位置配置当前的数据容量;
所述备注信息区中的第三个字节的位置配置数据块大小;
所述备注信息区中的第四个字节的位置配置数据块数量;
分别通过所述应用程序的内存中的四个原子的int型指针分别指向所述第一个字节、所述第二个字节、所述第三个字节以及第四个字节数据的数据字节块,以通过所述四个原子的int型指针类型分别控制所述第一个字节、所述第二个字节、所述第三个字节以及第四个字节的无锁读写。
详细地,生成的所述共享内存区域的备注信息区为空白区,在该空白区中的第一个字节、第二个字节、第三个字节以及第四个字节的配置方式如下:
数据块数量:s_blockCount=((au64*)m_mem.data())+2;
数据块大小:s_blockSize=((au64*)m_mem.data())+1;
标记值:s_flags=(au32*)m_mem.data();
当前的数据容量:s_cnt=((au32*)m_mem.data())+1;
接着,通过所述四个原子的int型指针类型分别控制所述第一个字节、所述第二个字节、所述第三个字节以及第四个字节的无锁读写的配置过程如下:
au32*s_flags;
au32*s_cnt;
au64*s_blockSize;
au64*s_blockCount;
在此基础上,进一步地,请结合参阅图2,在一种可能的实施方式中,该步骤S150可以通过如下子步骤实现:
子步骤S151,为所述共享内存区域分配索引区,并在所述索引区中分配用于数据索引的多个VerIdx数组以及校验信息列表,所述VerIdx数组中存储有每个数据块的编号对应的哈希值,所述校验信息列表包括根据哈希桶的数量得到的存储字节以及所述存储字节添加16个字节后的扩展字段。
子步骤S152,为所述共享内存区域分配哈希数组数据区,并对所述哈希数组数据区进行原子映射,通过数据链表记录每个数据块的元数据,其中,所述元数据通过原子整形进行存储,所述元数据包括数据块长度、数据块版本号、数据块标识、数据块哈希值、数据块删除标记以及数据块引用计数中的一种或者多种的组合。其中,上述的多种的组合可以是两种或者两种以上的组合。
子步骤S153,为所述共享内存区域分配提取池,所述提取池通过64位原子指针指向下一个可以写入的内存区域,并记录下一个数据块的位置,所述提取池对应的原子整形指针队列中记录了全局的数据块信息以及每个数据块的下一个数据块的标识信息。
子步骤S154,为所述共享内存区域分配存储数据区,所述存储数据区的大小等于所述哈希桶的数量与大小的乘积。
如此,通过上述设计,通过运用原子更新的原子数据结构,并通过数据划分为索引区、哈希数组数据区、提取池以及存储数据区的多个原子整型的方法,从而无需为每个进程或线程设定私有检索数据。
在前述描述的基础上,下面结合图3对基于上述对该数据业务的无锁共享内存处理后的数据结构的应用层面进行示例性描述,请参阅图3,在该步骤S150之后,本实施例提供的无锁共享内存处理方法还可以包括如下步骤:
步骤S160,在接收到针对数据业务的并发数据处理请求时,根据所述并发数据处理请求获得待处理数据的标识号。
详细地,在接收到针对数据业务的并发数据处理请求时,对于不同的数据业务,都对应有一个与待处理数据相关的标识号FLAG。
步骤S160,计算所述标识号对应的哈希值,并根据所述哈希值对所述待处理数据执行对应的操作。
本实施例中,计算所述标识号对应的哈希值的方式可以通过如下代码执行:
u32 hash=CncrHsh::HashBytes(key,klen);
在一种可能的示例中,若所述并发数据处理请求为数据写入请求,则本步骤首先根据所述哈希值计算所述待处理数据所需的数据块数量,然后从上述配置的提取池中提取与所述数据块数量对应的空闲数据块,并将所述空闲数据块的信息写入到所述哈希数组数据区中。接着,将所述待处理数据写入到所述存储数据区中与所述空闲数据块对应的数据区中,从而完成了数据写入,最后将所述空闲数据块的信息写入到所述索引区中的VerIdx数组中(数据查询入口),以便于用户进行数据查询。如此,完成了所述待处理数据的并发写入。
例如,如果从上述配置的提取池中提取与所述数据块数量对应的空闲数据为数据块0、数据块1以及数据块2,然后将数据块0、数据块1以及数据块2的信息写入到所述哈希数组数据区中,并将所述待处理数据写入到所述存储数据区中与数据块0、数据块1以及数据块2对应的数据区中,最后将数据块0、数据块1以及数据块2的信息写入到所述索引区中的VerIdx数组中。
在另一种可能的示例中,若所述并发数据处理请求为数据读取请求,则本步骤首先根据所述哈希值从所述索引区的VerIdx数组中获得对应的数据块的编号和版本号,然后根据所述数据块的编号从所述哈希数组数据区中获取所述数据块对应的Brief信息块,该Brief信息块可以是指记录所述数据块的基本摘要信息的信息块。接着,判断所述哈希值是否与所述Brief信息块的哈希值相同、所述待处理数据的标识号的长度是否与所述Brief信息块的标识号的长度相同以及所述数据块的版本号是否与所述Brief信息块的版本号相同。如果所述哈希值与所述Brief信息块的哈希值相同、所述待处理数据的标识号的长度与所述Brief信息块的标识号的长度相同,且所述数据块的版本号与所述Brief信息块的版本号相同,则判断所述数据块的标识号是否与所述Brief信息块的标识号相同。如果所述数据块的标识号与所述Brief信息块的标识号相同,则从所述Brief信息块中获得需要所述待处理数据并读取出去。
此外,在上述判断过程中,如果所述哈希值与所述Brief信息块的哈希值不同、或者所述待处理数据的标识号的长度与所述Brief信息块的标识号的长度不同,或者所述数据块的版本号与所述Brief信息块的版本号不同,则从所述索引区的VerIdx数组中记载下一个数据块的编号和版本号,并返回执行判断所述哈希值是否与所述Brief信息块的哈希值相同、所述待处理数据的标识号的长度是否与所述Brief信息块的标识号的长度相同以及所述数据块的版本号是否与所述Brief信息块的版本号相同的步骤。
在另一种可能的示例中,若所述并发数据处理请求为数据删除请求,则本步骤可以根据所述哈希值将所述索引区的VerIdx数组中对应的拟标记数据块进行删除标记,并且在检测到当前存在对所述拟标记数据块的数据读取请求时,如果检测到所述拟标记数据块存在删除标记,则返回已删除提示信息。如果在检测到当前不存在对所述拟标记数据块的数据读取请求时,则将所述哈希数组数据区中的所述拟标记数据块对应的Brief信息块进行删除标记,而后将所述Brief信息块的版本号标记为0,并对所述Brief信息块中的数据进行回收。如此,在实际删除时通过将所述索引区的VerIdx数组中对应的拟标记数据块进行删除标记,这样当存在数据读取请求需要读取该拟标记数据块时,如果检测到该拟标记数据块存在删除标记,则返回该拟标记数据块中的信息已经删除,不再执行下一步数据读取步骤。
图4示出了本申请实施例提供的用于实现上述无锁共享内存处理方法的电子设备100的示意图,所述电子设备100可以是用于提供主播服务的服务器。本实施例中,该电子设备100可以包括存储介质110、处理器120以及无锁共享内存处理装置130。
其中,处理器120可以是一个通用的中央处理器(Central Processing Unit,CPU),微处理器,特定应用集成电路(Application-Specific Integrated Circuit,ASIC),或一个或多个用于控制上述方法实施例提供的无锁共享内存处理方法的程序执行的集成电路。
存储介质110可以是ROM或可存储静态信息和指令的其他类型的静态存储设备,RAM或者可存储信息和指令的其他类型的动态存储设备,也可以是电可擦可编程只读存储器(Electrically Erasable Programmabler-Only Memory,EEPROM)、只读光盘(Compactdisc Read-Only Memory,CD-ROM)或其他光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质或者其他磁存储设备、或者能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。存储介质110可以是独立存在,通过通信总线与处理器120相连接。存储介质110也可以和处理器集成在一起。其中,存储介质110用于存储执行本申请方案的应用程序代码,例如图4中所示的无锁共享内存处理装置130,并由处理器120来控制执行。处理器120用于执行存储介质110中存储的应用程序代码,例如无锁共享内存处理装置130,以执行上述方法实施例的无锁共享内存处理方法。
本申请可以根据上述方法实施例对无锁共享内存处理装置130进行功能模块的划分,例如,可以对应各个功能划分各个功能模块,也可以将两个或两个以上的功能集成在一个处理模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。需要说明的是,本申请中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。比如,在采用对应各个功能划分各个功能模块的情况下,图4示出的无锁共享内存处理装置130只是一种装置示意图。详细地,无锁共享内存处理装置130可包括数据配置模块131、计算模块132、内存映射模块133、地址记录模块134以及分配模块135,下面分别对该无锁共享内存处理装置130的各个功能模块的功能进行详细阐述。
数据配置模块131,用于针对每个数据业务,配置该数据业务的内存配置数据,所述内存配置数据包括所需的数据块大小、数据块数量以及共享内存文件路径。可以理解,该数据配置模块131可以用于执行上述步骤S110,关于该数据配置模块131的详细实现方式可以参照上述对步骤S110有关的内容。
计算模块132,用于根据所述数据块大小和数据块数量计算该数据业务所需的共享内存空间。可以理解,该计算模块132可以用于执行上述步骤S120,关于该计算模块132的详细实现方式可以参照上述对步骤S120有关的内容。
内存映射模块133,用于根据所述共享内存文件路径打开共享内存文件,并根据所述共享内存空间,通过预设的内存映射方式将所述共享内存文件映射到共享内存区域中,并获取映射完成后的映射返回值。可以理解,该内存映射模块133可以用于执行上述步骤S130,关于该内存映射模块133的详细实现方式可以参照上述对步骤S130有关的内容。
地址记录模块134,用于根据所述映射返回值得到所述共享内存区域中对应的映射区域的起始指针地址和偏移记录指针地址,并将所述起始指针地址和偏移记录指针地址记录到所述数据业务对应的应用程序的内存中。可以理解,该地址记录模块134可以用于执行上述步骤S140,关于该地址记录模块134的详细实现方式可以参照上述对步骤S140有关的内容。
分配模块135,用于对所述共享内存区域进行辅助数据的原子映射后,为所述共享内存区域分配索引区、哈希数组数据区、提取池以及存储数据区的原子数据结构,以完成该数据业务的无锁共享内存处理。可以理解,该分配模块135可以用于执行上述步骤S150,关于该分配模块135的详细实现方式可以参照上述对步骤S150有关的内容。
由于本申请实施例提供的无锁共享内存处理装置130是上述无锁共享内存处理方法的另一种实现形式,且无锁共享内存处理装置130可用于执行上述实施例所提供的无锁共享内存处理方法,因此其所能获得的技术效果可参考上述方法实施例,在此不再赘述。
进一步地,基于同一发明构思,本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述无锁共享内存处理方法的步骤。
具体地,该存储介质能够为通用的存储介质,如移动磁盘、硬盘等,该存储介质上的计算机程序被运行时,能够执行上述无锁共享内存处理方法。
本申请实施例是参照根据本申请实施例的方法、设备(如图4的电子设备100)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
尽管在此结合各实施例对本申请进行了描述,然而,在实施所要求保护的本申请过程中,本领域技术人员通过查看所述附图、公开内容、以及所附权利要求书,可理解并实现所述公开实施例的其他变化。在权利要求中,“包括”一词不排除其他组成部分或步骤,“一”或“一个”不排除多个的情况。单个处理器或其他单元可以实现权利要求中列举的若干项功能。相互不同的从属权利要求中记载了某些措施,但这并不表示这些措施不能组合起来产生良好的效果。
以上所述,仅为本申请的各种实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应所述以权利要求的保护范围为准。
Claims (11)
1.一种无锁共享内存处理方法,其特征在于,应用于电子设备,所述方法包括:
针对每个数据业务,配置该数据业务的内存配置数据,所述内存配置数据包括所需的数据块大小、数据块数量以及共享内存文件路径;
根据所述数据块大小和数据块数量计算该数据业务所需的共享内存空间;
根据所述共享内存文件路径打开共享内存文件,并根据所述共享内存空间,通过预设的内存映射方式将所述共享内存文件映射到共享内存区域中,并获取映射完成后的映射返回值;
根据所述映射返回值得到所述共享内存区域中对应的映射区域的起始指针地址和偏移记录指针地址,并将所述起始指针地址和偏移记录指针地址记录到所述数据业务对应的应用程序的内存中;
对所述共享内存区域进行辅助数据的原子映射后,为所述共享内存区域分配索引区、哈希数组数据区、提取池以及存储数据区的原子数据结构,以完成该数据业务的无锁共享内存处理;
所述为所述共享内存区域分配索引区、哈希数组数据区、提取池以及存储数据区的原子数据结构的步骤,包括:
为所述共享内存区域分配索引区,并在所述索引区中分配用于数据索引的多个VerIdx数组以及校验信息列表,所述VerIdx数组中存储有每个数据块的编号对应的哈希值;
为所述共享内存区域分配哈希数组数据区,并对所述哈希数组数据区进行原子映射,通过数据链表记录每个数据块的元数据;
为所述共享内存区域分配提取池,所述提取池对应的原子整形指针队列中记录了全局的数据块信息以及每个数据块的下一个数据块的标识信息;
为所述共享内存区域分配存储数据区,所述存储数据区的大小等于哈希桶的数量与大小的乘积。
2.根据权利要求1所述的无锁共享内存处理方法,其特征在于,所述对所述共享内存区域进行辅助数据的原子映射的步骤,包括:
生成所述共享内存区域的备注信息区;
在所述备注信息区中的第一个字节的位置配置标记值;
在所述备注信息区中的第二个字节的位置配置当前的数据容量;
所述备注信息区中的第三个字节的位置配置数据块大小;
所述备注信息区中的第四个字节的位置配置数据块数量;
分别通过所述应用程序的内存中的四个原子的int型指针分别指向所述第一个字节、所述第二个字节、所述第三个字节以及第四个字节数据的数据字节块,以通过所述四个原子的int型指针类型分别控制所述第一个字节、所述第二个字节、所述第三个字节以及第四个字节的无锁读写。
3.根据权利要求1所述的无锁共享内存处理方法,其特征在于,所述校验信息列表包括根据哈希桶的数量得到的存储字节以及所述存储字节添加16个字节后的扩展字段;
所述元数据通过原子整形进行存储,所述元数据包括数据块长度、数据块版本号、数据块标识、数据块哈希值、数据块删除标记以及数据块引用计数中的一种或者多种的组合;
所述提取池通过64位原子指针指向下一个可以写入的内存区域,并记录下一个数据块的位置。
4.根据权利要求1-3中任意一项所述的无锁共享内存处理方法,其特征在于,所述方法还包括:
在接收到针对数据业务的并发数据处理请求时,根据所述并发数据处理请求获得待处理数据的标识号;
计算所述标识号对应的哈希值,并根据所述哈希值对所述待处理数据执行对应的操作。
5.根据权利要求4所述的无锁共享内存处理方法,其特征在于,若所述并发数据处理请求为数据写入请求,则根据所述哈希值对所述待处理数据执行对应的操作的步骤,包括:
根据所述哈希值计算所述待处理数据所需的数据块数量;
从配置的提取池中提取与所述数据块数量对应的空闲数据块,并将所述空闲数据块的信息写入到所述哈希数组数据区中;
将所述待处理数据写入到所述存储数据区中与所述空闲数据块对应的数据区中;
将所述空闲数据块的信息写入到所述索引区中的VerIdx数组中。
6.根据权利要求4所述的无锁共享内存处理方法,其特征在于,若所述并发数据处理请求为数据读取请求,则根据所述哈希值对所述待处理数据执行对应的操作的步骤,包括:
根据所述哈希值从所述索引区的VerIdx数组中获得对应的数据块的编号和版本号;
根据所述数据块的编号从所述哈希数组数据区中获取所述数据块对应的Brief信息块;
判断所述哈希值是否与所述Brief信息块的哈希值相同、所述待处理数据的标识号的长度是否与所述Brief信息块的标识号的长度相同以及所述数据块的版本号是否与所述Brief信息块的版本号相同;
如果所述哈希值与所述Brief信息块的哈希值相同、所述待处理数据的标识号的长度与所述Brief信息块的标识号的长度相同,且所述数据块的版本号与所述Brief信息块的版本号相同,则判断所述数据块的标识号是否与所述Brief信息块的标识号相同;
如果所述数据块的标识号与所述Brief信息块的标识号相同,则从所述Brief信息块中获得需要所述待处理数据并读取出去。
7.根据权利要求6所述的无锁共享内存处理方法,其特征在于,所述方法还包括:
如果所述哈希值与所述Brief信息块的哈希值不同、或者所述待处理数据的标识号的长度与所述Brief信息块的标识号的长度不同,或者所述数据块的版本号与所述Brief信息块的版本号不同,则从所述索引区的VerIdx数组中记载下一个数据块的编号和版本号,并返回执行判断所述哈希值是否与所述Brief信息块的哈希值相同、所述待处理数据的标识号的长度是否与所述Brief信息块的标识号的长度相同以及所述数据块的版本号是否与所述Brief信息块的版本号相同的步骤。
8.根据权利要求4所述的无锁共享内存处理方法,其特征在于,若所述并发数据处理请求为数据删除请求,则根据所述哈希值对所述待处理数据执行对应的操作的步骤,包括:
根据所述哈希值将所述索引区的VerIdx数组中对应的拟标记数据块进行删除标记;
在检测到当前存在对所述拟标记数据块的数据读取请求时,如果检测到所述拟标记数据块存在删除标记,则返回已删除提示信息;
在检测到当前不存在对所述拟标记数据块的数据读取请求时,将所述哈希数组数据区中的所述拟标记数据块对应的Brief信息块进行删除标记;
将所述Brief信息块的版本号标记为0,并对所述Brief信息块中的数据进行回收。
9.一种无锁共享内存处理装置,其特征在于,应用于电子设备,所述装置包括:
数据配置模块,用于针对每个数据业务,配置该数据业务的内存配置数据,所述内存配置数据包括所需的数据块大小、数据块数量以及共享内存文件路径;
计算模块,用于根据所述数据块大小和数据块数量计算该数据业务所需的共享内存空间;
内存映射模块,用于根据所述共享内存文件路径打开共享内存文件,并根据所述共享内存空间,通过预设的内存映射方式将所述共享内存文件映射到共享内存区域中,并获取映射完成后的映射返回值;
地址记录模块,用于根据所述映射返回值得到所述共享内存区域中对应的映射区域的起始指针地址和偏移记录指针地址,并将所述起始指针地址和偏移记录指针地址记录到所述数据业务对应的应用程序的内存中;
分配模块,用于对所述共享内存区域进行辅助数据的原子映射后,为所述共享内存区域分配索引区、哈希数组数据区、提取池以及存储数据区的原子数据结构,以完成该数据业务的无锁共享内存处理;
所述分配模块用于通过以下方式分配所述原子数据结构:
为所述共享内存区域分配索引区,并在所述索引区中分配用于数据索引的多个VerIdx数组以及校验信息列表,所述VerIdx数组中存储有每个数据块的编号对应的哈希值;
为所述共享内存区域分配哈希数组数据区,并对所述哈希数组数据区进行原子映射,通过数据链表记录每个数据块的元数据;
为所述共享内存区域分配提取池,所述提取池对应的原子整形指针队列中记录了全局的数据块信息以及每个数据块的下一个数据块的标识信息;
为所述共享内存区域分配存储数据区,所述存储数据区的大小等于哈希桶的数量与大小的乘积。
10.一种电子设备,其特征在于,所述电子设备包括机器可读存储介质及处理器,所述机器可读存储介质存储有机器可执行指令,所述处理器在执行所述机器可执行指令时使所述电子设备实现权利要求1-8中任意一项所述的无锁共享内存处理方法。
11.一种可读存储介质,其特征在于,所述可读存储介质中存储有机器可执行指令,所述机器可执行指令被执行时实现权利要求1-8中任意一项所述的无锁共享内存处理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910591481.0A CN110287044B (zh) | 2019-07-02 | 2019-07-02 | 无锁共享内存处理方法、装置、电子设备及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910591481.0A CN110287044B (zh) | 2019-07-02 | 2019-07-02 | 无锁共享内存处理方法、装置、电子设备及可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110287044A CN110287044A (zh) | 2019-09-27 |
CN110287044B true CN110287044B (zh) | 2021-08-03 |
Family
ID=68020275
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910591481.0A Active CN110287044B (zh) | 2019-07-02 | 2019-07-02 | 无锁共享内存处理方法、装置、电子设备及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110287044B (zh) |
Families Citing this family (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110674052B (zh) * | 2019-09-30 | 2022-03-22 | 广州虎牙科技有限公司 | 内存管理方法、服务器及可读存储介质 |
CN110933448B (zh) * | 2019-11-29 | 2022-07-12 | 广州市百果园信息技术有限公司 | 直播列表服务***及方法 |
CN111092865B (zh) * | 2019-12-04 | 2022-08-19 | 全球能源互联网研究院有限公司 | 一种安全事件分析方法及*** |
CN113127415B (zh) * | 2019-12-31 | 2024-02-27 | 浙江宇视科技有限公司 | 实时流文件的处理方法、装置、介质及电子设备 |
CN113157199A (zh) * | 2020-01-22 | 2021-07-23 | 阿里巴巴集团控股有限公司 | 快照占用空间计算方法、装置、电子设备及存储介质 |
CN112306695A (zh) * | 2020-11-19 | 2021-02-02 | 中国民航信息网络股份有限公司 | 数据的处理方法、装置、电子设备及计算机存储介质 |
CN112463333A (zh) * | 2020-12-03 | 2021-03-09 | 北京浪潮数据技术有限公司 | 一种基于多线程并发的数据存取方法、装置和介质 |
CN112463306A (zh) * | 2020-12-03 | 2021-03-09 | 南京机敏软件科技有限公司 | 一种虚拟机中共享盘数据一致性的方法 |
CN112328435B (zh) * | 2020-12-07 | 2023-09-12 | 武汉绿色网络信息服务有限责任公司 | 目标数据备份和恢复的方法、装置、设备及存储介质 |
CN112732194B (zh) * | 2021-01-13 | 2022-08-19 | 同盾科技有限公司 | 非规则数据存储方法、装置及存储介质 |
CN112947856B (zh) * | 2021-02-05 | 2024-05-03 | 彩讯科技股份有限公司 | 一种内存数据的管理方法、装置、计算机设备及存储介质 |
CN113194266A (zh) * | 2021-04-28 | 2021-07-30 | 深圳迪乐普数码科技有限公司 | 图像序列帧实时渲染方法、装置、计算机设备及存储介质 |
CN113535437B (zh) * | 2021-08-03 | 2023-04-07 | 节卡机器人股份有限公司 | 一种机器人的模块数据交互方法、电子设备及存储介质 |
CN113778674A (zh) * | 2021-08-31 | 2021-12-10 | 上海弘积信息科技有限公司 | 一种负载均衡设备配置管理在多核下的免锁实现方法 |
CN113688068B (zh) * | 2021-10-25 | 2022-02-15 | 支付宝(杭州)信息技术有限公司 | 图数据加载方法及装置 |
CN114356589B (zh) * | 2021-12-09 | 2024-04-12 | 北京华云安信息技术有限公司 | 多写入者多读取者的数据存储和读取方法、装置及设备 |
CN115757039A (zh) * | 2022-11-25 | 2023-03-07 | 惠州市德赛西威智能交通技术研究院有限公司 | 一种程序监控方法、装置、电子设备和存储介质 |
CN118034610B (zh) * | 2024-04-07 | 2024-07-02 | 深圳市纽创信安科技开发有限公司 | 应用于存储器的密钥数据处理方法、存储器、装置及设备 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101582092B (zh) * | 2009-06-12 | 2011-04-20 | 中兴通讯股份有限公司 | 一种实现保存内存中的数据的方法及装置 |
CN102156700A (zh) * | 2010-02-12 | 2011-08-17 | 华为技术有限公司 | 数据库的访问方法、装置及*** |
CN103514053B (zh) * | 2013-09-22 | 2017-01-25 | 中国科学院信息工程研究所 | 一种基于共享内存的进程间通讯方法 |
CN103593485B (zh) * | 2013-12-04 | 2017-06-16 | 网易传媒科技(北京)有限公司 | 实现数据库实时操作的方法和设备 |
WO2016082196A1 (zh) * | 2014-11-28 | 2016-06-02 | 华为技术有限公司 | 文件访问方法、装置及存储设备 |
CN105975407B (zh) * | 2016-03-22 | 2020-10-09 | 华为技术有限公司 | 一种内存地址的映射方法及设备 |
CN109298935B (zh) * | 2018-09-06 | 2023-02-03 | 华泰证券股份有限公司 | 一种多进程单写多读无锁共享内存的方法及应用 |
-
2019
- 2019-07-02 CN CN201910591481.0A patent/CN110287044B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN110287044A (zh) | 2019-09-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110287044B (zh) | 无锁共享内存处理方法、装置、电子设备及可读存储介质 | |
KR101367450B1 (ko) | 멀티 스레드 어플리케이션을 위한 해시 테이블의 동시 리해싱의 수행 | |
US8788543B2 (en) | Scalable, concurrent resizing of hash tables | |
JP5339507B2 (ja) | 木構造を探索する方法 | |
US10628200B2 (en) | Base state for thin-provisioned volumes | |
US10747593B2 (en) | Lock free container packing | |
CN104424030B (zh) | 多进程操作共享内存的方法和装置 | |
US11321302B2 (en) | Computer system and database management method | |
US10983909B2 (en) | Trading off cache space and write amplification for Bε-trees | |
CN112181902B (zh) | 数据库的存储方法、装置及电子设备 | |
CN111316255B (zh) | 数据存储***以及用于提供数据存储***的方法 | |
CN107408132B (zh) | 跨越多个类型的存储器移动分层数据对象的方法和*** | |
CN111444149A (zh) | 一种数据导入方法、装置、设备及存储介质 | |
US20060277221A1 (en) | Transactional file system with client partitioning | |
US12019629B2 (en) | Hash-based data structure | |
EP1654635A2 (en) | Method and computer system for accessing thread private data | |
CN111522827A (zh) | 一种数据更新方法、装置和电子设备 | |
US20230117060A1 (en) | Read-write method and apparatus, electronic device, and readable memory medium | |
CN117377953A (zh) | 基于树的数据结构 | |
CN112068948B (zh) | 数据散列方法、可读存储介质和电子设备 | |
CN117271440B (zh) | 一种基于freeRTOS文件信息存储方法、读取方法及相关设备 | |
CN111435331A (zh) | 存储卷写数据方法、装置、电子设备及机器可读存储介质 | |
CN117642735A (zh) | 数据结构中的项的版本化 | |
GB2516091A (en) | Method and system for implementing a dynamic array data structure in a cache line | |
CN117707783A (zh) | 一种针对无锁链表的数据处理方法、装置、设备及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |