CN109298935A - 一种多进程单写多读无锁共享内存的方法及应用 - Google Patents
一种多进程单写多读无锁共享内存的方法及应用 Download PDFInfo
- Publication number
- CN109298935A CN109298935A CN201811039333.XA CN201811039333A CN109298935A CN 109298935 A CN109298935 A CN 109298935A CN 201811039333 A CN201811039333 A CN 201811039333A CN 109298935 A CN109298935 A CN 109298935A
- Authority
- CN
- China
- Prior art keywords
- data
- memory
- address
- shared drive
- shared
- 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
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
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
技术领域
本发明涉及一种基于内存数据库的券商快速交易方法,具体的说是一种多进程单写多读场景下的无锁共享内存方法,应用于多进程之间通过共享内存技术进行高频数据实时共享的场景,可作为设计高性能键值型内存数据库技术。
背景技术
随着我国证券市场日趋成熟,证券市场中机构等专业投资者所占比重也会越来越大,在我国香港、美国等成熟股市,70%以上的成交量是由机构投资者完成的。券商机构客户与高端客户的不断增长,程序化交易的日渐增多,快速安全的高端通道需求也益发明显,为客户提供高性能的交易服务是券商的实际需求。而在券商的交易系统中,数据访问服务是非常影响交易系统性能的一个环节,针对这一问题,目前已经有一些第三方的解决方案提供商提出了基于内存数据库替代券商传统磁盘数据库的快速交易解决方案,如顶点软件的快速交易柜台,并已在券商交易系统中获得了一席之地。
共享内存是进程间最高效的通信方式,特别是需要在进程间交换大批量数据时。目前很多主流内存数据库都使用了共享内存技术,如Timesten、AltiBase、Extreme、berkeley db等。通过共享内存实现多进程间数据共享的关键性能影响因素在于数据同步机制,但是,目前多数内存数据库都是通过设计高效的锁机制来提高数据访问性能,这些方案确实能够满足大多数应用场景的需求,但是对于高频更新的实时数据而言,由于锁冲突的存在,其性能仍然会受到很大的影响。在数据高频更新的场景下,频繁将当前数据区的数据拷贝到备份区的开销很大,特别是在数据量较大的情况下。在程序化交易中,一种典型的应用场景是通过高频实时行情驱动策略执行交易,对于行情数据的实时性有很高的要求,如何实现策略进程实时访问行情数据是券商提供程序化交易服务关注的重要问题之一。
发明内容
针对上述技术问题,本发明提出一种多进程单写多读无锁共享内存的方法,当数据更新时,首先从共享内存池中为待更新数据重新申请一块未被使用的共享内存空间,然后将数据写入该内存空间之后再修改数据的键key值value关系,确保读取进程能够取到更新后的数据,同时,回收旧的数据区的内存。
进一步地,从共享内存中为待更新数据重新申请一块未被使用的共享内存空间的步骤包括:
1)按照内存管理流程的步骤,从共享内存池申请共享内存空间;
将数据写入该内存空间的步骤包括:
2)将内存空间中ref字段初始化为0,len初始化为数据长度data_len,并将待新增/更新数据拷贝到data区域;
修改数据的键key值value关系的步骤包括:
3)按照数据查询流程的步骤,查找进程私有字典PPD,如果未找到对应的key,则说明是新增数据,转到4),否则为更新数据,转到6);
4)在共享数据偏移地址数组DOAA末尾新增数组元素,并将1)中申请的内存空间的地址偏移量MMOA记录在新的数组元素中;
5)在进程共享字典PSD末尾插入键值对,key为输入的业务数据key,value为4)中新增数组元素的索引,然后通过原子操作将PSD中dict_len字段加1,并将对应关系记录到PPD中,转到7);
回收旧的数据区的内存的步骤包括:
6)按照内存管理流程,通过进程私有字典PPD中的value DOAA数组索引找到共享数据偏移地址数组DOAA元素,通过原子操作将数组元素更新为1)中申请的内存空间的地址偏移量MMOA,并将旧的内存偏移地址被放入待回收内存区;
7)结束。
进一步的,所述内存管理流程的步骤包括:
1)遍历待回收内存区,找到第一个ref=0且len大于等于申请内存大小的内存区域;如果找到,转4);否则,转2);
2)检查共享内存池是否存在可供分配的内存,如果存在,转4),否则转3);
3)阻塞等待可回收内存,如果在超时时间之内获取到合适的可回收内存,转4),否则转5);
4)如果内存是从共享内存池分配,则将共享内存池起始地址前移,排除本次分配的地址;如果是利用回收的内存,则修改len字段为本次分配内存长度,然后将该回收内存块本次分配后剩余的内存重新加上头部ref和len字段并初始化后,放入待回收内存区;
5)返回内存地址或内存分配失败标志。
进一步的,所述数据查询流程的步骤包括:
1)查找进程私有字典PPD,如果找到业务数据key,转到3);否则转到2);
2)查询进程共享字典PSD,增量读取PSD中dict_len字段值减去PPD已有长度后的剩余项,并将这些项新增到PPD中,再次查找PPD,如果未找到,转7);
3)获取PPD中业务数据key对应的value值,即为共享数据偏移地址数组DOAA的索引值,读取数组元素值业务数据key对应的MMOA,然后与内存映射基地址MMBA相加得到业务数据的实际内存地址real_addr;
4)通过原子操作将ref字段加1;
5)读取数据长度len,然后将data区域len长度的数据拷贝到查询结果中;
6)通过原子操作将ref字段减1;
7)查询结束。
进一步的,所述进程共享字典PSD中记录数据键key与对应的DOAA数组索引之间的对应关系,数据只新增,不修改也不删除;为了避免在新增字典项时引入锁,所述进程共享字典PSD,字典的数据结构采用结构体数组方式;在共享字典区域头部增加一个记录字典表长度的字段(dict_len),每新增完一个字典项,通过原子操作将长度字段加1;其他进程读取共享字典表时,只能读取小于等于长度字段的字典项。
进一步的,所述进程私有字典PPD为在进程在其私有内存中维护的一张PSD的副本,其内容包含全部或部分PSD的内容,采用hashmap或其它支持查找的数据结构实现,如果需要在进程中支持多线程查询,可以使用线程本地存储ThreadLocalStorage-TLS避免对字典表加锁。
进一步的,所述共享内存池是指共享内存可利用的内存偏移地址空间,是一段连续的虚拟地址空间,偏移地址从0x00000000start_pos开始;共享内存池MP通过两个参数进行管理:当前偏移地址cur_pos和最大偏移地址max_pos;当前偏移地址初始化为0x00000000,每次需要从内存池分配一块n字节长度时,首先判断当前偏移地址加上n是否超出了内存池总长度,如果没有,则返回当前偏移地址,然后将当前偏移地址前移n字节长度;否则从内存池分配内存失败。
进一步的,所述待回收内存区中存储的是数据更新替换下来的旧的业务数据内存地址的偏移量,是一段不连续的虚拟地址空间;待回收内存区MRR中的内存地址并非一定可立即回收,在回收时需要检查ref字段是否为0,如果不为0,则说明还有其他进程正在读取该内存,则暂时不可回收再利用。
进一步的,所述内存映射基地址MMBA为共享内存映射到进程的地址空间的基地址,这种映射在linux系统中的操作函数是mmap,windows系统中是MapViewOfView。
进一步的,所述共享数据偏移地址数组DOAA为存储于另一个共享内存区域内的定长数组,数组元素MMOA;虽然共享内存中的同一份数据映射到各进程私有地址空间的内存地址不同,但是其相对于映射基地址(MMBA)的偏移量(MMOA)是相同的;DOAA数组中的数据只会新增、修改,不会被删除,不支持存在数据删除的高频数据实时共享场景;数组元素是内存地址,在修改数组元素时,使用原子操作实现,避免了锁的使用;
所述数组元素MMOA为共享内存数据偏移地址,所述数组元素MMOA是指将共享内存映射到进程的私有地址空间后,数据的内存地址相对于MMBA的偏移量,MMBA+MMOA=数据在进程地址空间中的实际内存地址real_addr;MMOA用于解决同一个共享数据区映射到不同进程的地址空间时基地址不同的问题。
本发明还提出一种多进程单写多读无锁共享内存的方法的应用,所述多进程单写多读无锁共享内存的方法应用于证券业,包括如下步骤:
(1)进程初始化的步骤;
启动写入进程,创建并映射无锁共享内存数据结构,包括三块共享内存区域:共享数据偏移地址数组DOAA,进程共享字典区PSD,和共享数据区SDR,共享数据区设置得比实际需要存储的数据大,以保证有足够的冗余空间,满足更新数据时旧的内存地址还未被回收时新数据的存储需求;初始化内存池当前偏移地址cur_pos为0x00000000,最大偏移地址max_pos为0x08000000128M;使用std::unordered_map存储进程私有字典PPD,启动多个读取进程,将DOAA、PSD和SDR映射到进程本身的内存地址空间,使用std::unordered_map存储进程私有字典PPD,随机产生股票代码,存储在查询目标数组中;
(2)行情订阅及存储的步骤
写入进程订阅证券的实时行情,接收行情数据,并将数据按照“数据新增/更新流程”写入到无锁共享内存区中;
(3)查询行情数据的捕捉
读取进程从查询目标数组中依次取出证券代码按照“数据查询流程”查询实时行情数据。
进一步的,所述共享数据区是实际存储数据的内存区域,其中的每个数据单元包含三个元素:当前正在读取的进程数ref、数据长度len、数据data,ref和len合称为数据单元的头部header,ref字段记录当前该内存块正在被读取的次数,进程开始读取时该值加1,读取完后该值减1,只有当该值为0时这部分内存才能够被回收,对ref字段的操作是原子操作;len字段记录data的长度,如果存储定长数据,该字段可以省略;data为具体的数据内容。
有益效果:本发明提出的多进程单写多读无锁共享内存的方法及应用,当多进程同时读写同一共享内存数据区时,为了避免读取到不完整的数据,通常需要对读写操作加内核锁,在数据频繁更新的场景中,内核锁会导致非常严重的性能损耗。本发明通过有效的数据结构设计和更加高性能的原子操作完全避免了锁的使用。本发明充分利用原子操作特性,从设计上完全避免了锁的使用,从而实现在数据高频更新时提供高性能的实时数据访问能力。当数据更新时,从共享内存中为待更新数据重新申请一块未被使用的共享内存空间,将数据写入该内存空间后修改数据的键(key)值(value)关系,确保读取进程能够取到更新后的数据;同时,旧的数据区的内存在确保无任何线程读取时将会被回收,用于下一次新增数据或更新数据的内存分配,其本质上是一种用空间换时间的方案。由于数据更新之后才会更新键值关系,任何一个数据区都不会被同时读写,可以完全避免锁的使用。在键值关系更新时本发明通过有效的数据结构设计及原子操作同样避免了锁的使用,真正实现了无锁共享内存。本发明充分利用原子操作特性,完全避免了锁的使用,从而实现在数据高频更新时提供高性能的实时数据访问能力。提高了共享内存数据访问性能。
说明书附图
图1为共享数据偏移地址数组(DOAA)数据结构图;
图2为进程共享字典(PSD)数据结构;
图3为共享数据区(SDR)数据结构;
图4为共享内存池(MP)示意图;
图5为数据新增/更新流程;
图6为数据查询流程;
图7为内存分配流程;
图8为实时场景图;
图9为写入耗时图(读取进程每隔10ms连续查询100000次);
图10为查询耗时图(写入进程每隔500ms写入10000条数据)。
具体实施方式
实施例1:一种多进程单写多读无锁共享内存的方法,当数据更新时,首先从共享内存池中为待更新数据重新申请一块未被使用的共享内存空间,然后将数据写入该内存空间之后再修改数据的键key值value关系,确保读取进程能够取到更新后的数据,同时,回收旧的数据区的内存。
进一步地,从共享内存中为待更新数据重新申请一块未被使用的共享内存空间的步骤包括:
1)按照内存管理流程的步骤,从共享内存池申请共享内存空间;
将数据写入该内存空间的步骤包括:
2)将内存空间中ref字段初始化为0,len初始化为数据长度data_len,并将待新增/更新数据拷贝到data区域;
修改数据的键key值value关系的步骤包括:
3)按照数据查询流程的步骤,查找进程私有字典PPD,如果未找到对应的key,则说明是新增数据,转到4),否则为更新数据,转到6);
4)在共享数据偏移地址数组DOAA末尾新增数组元素,并将1)中申请的内存空间的地址偏移量MMOA记录在新的数组元素中;
5)在进程共享字典PSD末尾插入键值对,key为输入的业务数据key,value为4)中新增数组元素的索引,然后通过原子操作将PSD中dict_len字段加1,并将对应关系记录到PPD中,转到7);
回收旧的数据区的内存的步骤包括:
6)按照内存管理流程,通过进程私有字典PPD中的value DOAA数组索引找到共享数据偏移地址数组DOAA元素,通过原子操作将数组元素更新为1)中申请的内存空间的地址偏移量MMOA,并将旧的内存偏移地址被放入待回收内存区;
7)结束。
进一步的,所述内存管理流程的步骤包括:
1)遍历待回收内存区,找到第一个ref=0且len大于等于申请内存大小的内存区域;如果找到,转4);否则,转2);
2)检查共享内存池是否存在可供分配的内存,如果存在,转4),否则转3);
3)阻塞等待可回收内存,如果在超时时间之内获取到合适的可回收内存,转4),否则转5);
4)如果内存是从共享内存池分配,则将共享内存池起始地址前移,排除本次分配的地址;如果是利用回收的内存,则修改len字段为本次分配内存长度,然后将该回收内存块本次分配后剩余的内存重新加上头部ref和len字段并初始化后,放入待回收内存区;
5)返回内存地址或内存分配失败标志。
进一步的,所述数据查询流程的步骤包括:
1)查找进程私有字典PPD,如果找到业务数据key,转到3);否则转到2);
2)查询进程共享字典PSD,增量读取PSD中dict_len字段值减去PPD已有长度后的剩余项,并将这些项新增到PPD中,再次查找PPD,如果未找到,转7);
3)获取PPD中业务数据key对应的value值,即为共享数据偏移地址数组DOAA的索引值,读取数组元素值业务数据key对应的MMOA,然后与内存映射基地址MMBA相加得到业务数据的实际内存地址real_addr;
4)通过原子操作将ref字段加1;
5)读取数据长度len,然后将data区域len长度的数据拷贝到查询结果中;
6)通过原子操作将ref字段减1;
7)查询结束。
进一步的,所述进程共享字典PSD中记录数据键key与对应的DOAA数组索引之间的对应关系,数据只新增,不修改也不删除;为了避免在新增字典项时引入锁,所述进程共享字典PSD,字典的数据结构采用结构体数组方式;在共享字典区域头部增加一个记录字典表长度的字段(dict_len),每新增完一个字典项,通过原子操作将长度字段加1;其他进程读取共享字典表时,只能读取小于等于长度字段的字典项。
进一步的,所述进程私有字典PPD为在进程在其私有内存中维护的一张PSD的副本,其内容包含全部或部分PSD的内容,采用hashmap或其它支持查找的数据结构实现,如果需要在进程中支持多线程查询,可以使用线程本地存储ThreadLocalStorage-TLS避免对字典表加锁。
进一步的,所述共享内存池是指共享内存可利用的内存偏移地址空间,是一段连续的虚拟地址空间,偏移地址从0x00000000start_pos开始;共享内存池MP通过两个参数进行管理:当前偏移地址cur_pos和最大偏移地址max_pos;当前偏移地址初始化为0x00000000,每次需要从内存池分配一块n字节长度时,首先判断当前偏移地址加上n是否超出了内存池总长度,如果没有,则返回当前偏移地址,然后将当前偏移地址前移n字节长度;否则从内存池分配内存失败。
进一步的,所述待回收内存区中存储的是数据更新替换下来的旧的业务数据内存地址的偏移量,是一段不连续的虚拟地址空间;待回收内存区MRR中的内存地址并非一定可立即回收,在回收时需要检查ref字段是否为0,如果不为0,则说明还有其他进程正在读取该内存,则暂时不可回收再利用。
进一步的,所述内存映射基地址MMBA为共享内存映射到进程的地址空间的基地址,这种映射在linux系统中的操作函数是mmap,windows系统中是MapViewOfView。
进一步的,所述共享数据偏移地址数组DOAA为存储于另一个共享内存区域内的定长数组,数组元素MMOA;虽然共享内存中的同一份数据映射到各进程私有地址空间的内存地址不同,但是其相对于映射基地址(MMBA)的偏移量(MMOA)是相同的;DOAA数组中的数据只会新增、修改,不会被删除,不支持存在数据删除的高频数据实时共享场景;数组元素是内存地址,在修改数组元素时,使用原子操作实现,避免了锁的使用;
所述数组元素MMOA为共享内存数据偏移地址,所述数组元素MMOA是指将共享内存映射到进程的私有地址空间后,数据的内存地址相对于MMBA的偏移量,MMBA+MMOA=数据在进程地址空间中的实际内存地址real_addr;MMOA用于解决同一个共享数据区映射到不同进程的地址空间时基地址不同的问题。
本发明还提出一种多进程单写多读无锁共享内存的方法的应用,所述多进程单写多读无锁共享内存的方法应用于证券业,包括如下步骤:
(1)进程初始化的步骤;
启动写入进程,创建并映射无锁共享内存数据结构,包括三块共享内存区域:共享数据偏移地址数组DOAA,进程共享字典区PSD,和共享数据区SDR,共享数据区设置得比实际需要存储的数据大,以保证有足够的冗余空间,满足更新数据时旧的内存地址还未被回收时新数据的存储需求;初始化内存池当前偏移地址cur_pos为0x00000000,最大偏移地址max_pos为0x08000000128M;使用std::unordered_map存储进程私有字典PPD,启动多个读取进程,将DOAA、PSD和SDR映射到进程本身的内存地址空间,使用std::unordered_map存储进程私有字典PPD,随机产生股票代码,存储在查询目标数组中;
(2)行情订阅及存储的步骤
写入进程订阅证券的实时行情,接收行情数据,并将数据按照“数据新增/更新流程”写入到无锁共享内存区中;
(3)查询行情数据的捕捉
读取进程从查询目标数组中依次取出证券代码按照“数据查询流程”查询实时行情数据。
进一步的,所述共享数据区是实际存储数据的内存区域,其中的每个数据单元包含三个元素:当前正在读取的进程数ref、数据长度len、数据data,ref和len合称为数据单元的头部header,ref字段记录当前该内存块正在被读取的次数,进程开始读取时该值加1,读取完后该值减1,只有当该值为0时这部分内存才能够被回收,对ref字段的操作是原子操作;len字段记录data的长度,如果存储定长数据,该字段可以省略;data为具体的数据内容。
本发明提出的多进程单写多读无锁共享内存的方法,充分利用原子操作特性,从设计上完全避免了锁的使用,从而实现在数据高频更新时提供高性能的实时数据访问能力。当数据更新时,从共享内存中为待更新数据重新申请一块未被使用的共享内存空间,将数据写入该内存空间后修改数据的键(key)值(value)关系,确保读取进程能够取到更新后的数据;同时,旧的数据区的内存将会被回收,用于下一次新增数据或更新数据的内存分配,其本质上是一种用空间换时间的方案。由于数据更新之后才会更新键值关系,任何一个数据区都不会被同时读写,可以完全避免锁的使用。在键值关系更新时本发明通过有效的数据结构设计及原子操作同样避免了锁的使用,真正实现了无锁共享内存。
实施例2:为了进一步提高共享内存数据访问性能,本发明提出一种无锁的共享内存方案,充分利用原子操作特性,从设计上完全避免了锁的使用,从而实现在数据高频更新时提供高性能的实时数据访问能力。本发明的核心思路是:从共享内存中为待更新数据重新申请一块未被使用的共享内存空间,将数据写入该内存空间后修改数据的键(key)值(value)关系,确保读取进程能够取到更新后的数据;同时,旧的数据区的内存将会被回收,用于下一次新增数据或更新数据的内存分配,其本质上是一种用空间换时间的方案。由于数据更新之后才会更新键值关系,任何一个数据区都不会被同时读写,可以完全避免锁的使用。在键值关系更新时本发明通过有效的数据结构设计及原子操作同样避免了锁的使用,真正实现了无锁共享内存。
进一步的,本发明的主要逻辑流程如下:
(1)数据新增/更新流程(输入:业务数据key、data、数据长度data_len)
1)从内存池申请共享内存空间(申请过程详见内存管理流程);
2)将内存空间中ref字段初始化为0,len初始化为数据长度data_len,并将待新增/更新数据拷贝到data区域;
3)查找进程私有字典表(PPD),如果未找到对应的key,则说明是新增数据,转到4),否则为更新数据,转到6);
4)在共享数据偏移地址数组(DOAA)末尾新增数组元素,并将1)中申请的内存空间的地址偏移量(MMOA)记录在新的数组元素中;
5)在进程共享字典(PSD)末尾插入键值对,key为输入的业务数据key,value为4)中新增数组元素的索引,然后通过原子操作将PSD中dict_len字段加1,并将对应关系记录到PPD中,转到7);
6)通过进程私有字典(PPD)中的value(DOAA数组索引)找到共享数据偏移地址数组(DOAA)元素,通过原子操作将数组元素更新为1)中申请的内存空间的地址偏移量(MMOA),并将旧的内存偏移地址被放入待回收区(内存回收使用详见内存管理流程);
7)结束。
(2)数据查询流程(输入:业务数据key)
1)查找进程私有字典(PPD),如果找到业务数据key,转到3);否则转到2);
2)查询进程共享字典(PSD),增量读取PSD中dict_len字段值减去PPD已有长度后的剩余项,并将这些项新增到PPD中,再次查找PPD,如果未找到,转7);
3)获取PPD中业务数据key对应的value值,即为共享数据偏移地址数组(DOAA)的索引值,读取数组元素值(业务数据key对应的MMOA),然后与内存映射基地址(MMBA)相加得到业务数据的实际内存地址real_addr;
4)通过原子操作将ref字段加1;
5)读取数据长度(len),然后将data区域len长度的数据拷贝到查询结果中;
6)通过原子操作将ref字段减1;
7)查询结束。
(3)内存管理流程
本发明对待回收内存的管理采用“最佳适应法”—即对空闲分区按照从小到大排序,每次分配第一块符合条件的内存空间,并将剩余内存放入内存池中等待下一次分配。该方法对于业务数据为定长数据场景是最高效的,变长数据场景可根据特定场景选择特定的内存管理方法。
本发明的内存管理流程如下:
1)遍历待回收区,找到第一个ref=0且len大于等于申请内存大小的内存区域。如果找到,转4);否则,转2)。
2)检查内存池是否存在可供分配的内存,如果存在,转4),否则转3)
3)阻塞等待可回收内存,如果在超时时间之内获取到合适的可回收内存,转4),否则转5)。
4)如果内存是从内存池分配,则将内存池起始地址前移,排除本次分配的地址;如果是利用回收的内存,则修改len字段为本次分配内存长度,然后将该回收内存块本次分配后剩余的内存重新加上头部(ref和len字段)并初始化后,放入待回收内存区。
5)返回内存地址或内存分配失败标志。
进一步的,
共享内存映射基地址(MemoryMappingBaseAddress-MMBA)
MMBA指共享内存映射到进程的地址空间的基地址,这种映射在linux系统中的操作函数是mmap,windows系统中是MapViewOfView。
共享内存数据偏移地址(MemoryMappingOffsetAddress-MMOA)
MMOA是指将共享内存映射到进程的私有地址空间后,数据的内存地址相对于MMBA的偏移量,MMBA+MMOA=数据在进程地址空间中的实际内存地址(real_addr)。引入MMOA概念主要是为了解决同一个共享数据区映射到不同进程的地址空间时基地址不同的问题(Windows系统映射时能够指定固定的基地址,但是为了保证指定的基地址有效,一般会将共享内存映射到较高的地址空间,如32位应用程序从0x50000000开始映射,这样会导致可用的内存地址空间减少的问题)。
共享数据偏移地址数组(DataOffsetAddressArray-DOAA)
DOAA是存储于另一个共享内存区域内的定长数组,数组元素MMOA。DOAA是基于这样一个事实设计的:虽然共享内存中的同一份数据映射到各进程私有地址空间的内存地址不同,但是其相对于映射基地址(MMBA)的偏移量(MMOA)是相同的。DOAA的一个特点是:数组中的数据只会新增、修改,不会被删除,即本发明不支持存在数据删除的高频数据实时共享场景。由于数组元素是内存地址,在修改数组元素时,可以使用原子操作实现,避免了锁的使用。
DOAA的数据结构见图1。图1中,数组元素为内存地址偏移量,从0x00000000开始,由于数据可以为变长数据,相邻两个数据元素间的增量可能是不同的。上方的数字为数组元素的索引,从0开始。
进程共享字典(ProcessShareDictionary-PSD)
PSD中记录数据键(key)与对应的DOAA数组索引之间的对应关系,其特点是数据只新增,不修改也不删除。为了避免在新增字典项时引入锁,本发明进行了如下设计:
1)字典的数据结构采用结构体数组方式;
2)在共享字典区域头部增加一个记录字典表长度的字段(dict_len),每新增完一个字典项,通过原子操作将长度字段加1;
3)其他进程读取共享字典表时,只能读取小于等于长度字段的字典项。
PSD的数据结构见附图说明中图2。图2中,dict_len为PSD长度字段,表示PSD中当前字典项的个数,类型为int64,初始为0,每次新增字典项,该字段通过原子操作加1。keyn表示业务数据的key,0,1,2…表示key1,,key2,key3对应的业务数据的内存偏移地址在DOAA数组中的索引号,从0开始。
进程私有字典(ProcessPrivateDictionary-PPD)
为了实现字典查找功能,本发明引入了进程私有字典表PPD的概念。PPD是在进程在其私有内存中维护的一张PSD的副本,其内容包含全部或部分PSD的内容,采用hashmap或其它支持查找的数据结构实现。如果需要在进程中支持多线程查询,可以使用线程本地存储(ThreadLocalStorage-TLS)避免对字典表加锁。
共享数据区(ShareDataRegion-SDR)
共享数据区是实际存储数据的内存区域,其中的每个数据单元包含三个元素:当前正在读取的进程数(ref)、数据长度(len)、数据(data),ref和len合称为数据单元的头部(header),数据结构见附图说明中图3。ref字段记录当前该内存块正在被读取的次数,进程开始读取时该值加1,读取完后该值减1,只有当该值为0时这部分内存才能够被回收,对ref字段的操作是原子操作;len字段记录data的长度,如果存储定长数据,该字段可以省略;data为具体的数据内容。
SDR数据结构见附图说明中图3。图3中,ref表示当前正在读取data1数据的进程数量,类型为long,初始化为0,进程开始读取时通过原子操作将ref字段加1,读取完成后同样通过原子操作将ref减1,当ref字段值为0时,该内存块可以被回收。
共享内存池(MemoryPool-MP)
共享内存池(MP)是指共享内存可利用的内存偏移地址空间,是一段连续的虚拟地址空间,偏移地址从0x00000000(start_pos)开始。MP通过两个参数进行管理:当前偏移地址(cur_pos)和最大偏移地址(max_pos)。当前偏移地址初始化为0x00000000,每次需要从内存池分配一块n字节长度时,首先判断当前偏移地址加上n是否超出了内存池总长度,如果没有,则返回当前偏移地址,然后将当前偏移地址前移n字节长度;否则从内存池分配内存失败。
MP数据结构见附图说明中图4。图4中为32位应用程序内存池示意图,内存池中起始偏移地址(start_pos)从0x00000000开始,cur_pos左边是已分配过的内存,其中又包含一部分不连续的可回收利用的内存空间,这些空间共同组成了待回收内存区(MRR);cur_pos右边是未分配的内存,内存池的max_pos取决于程序可用内存大小。
待回收内存区(MemoryRecycleRegion-MRR)
待回收内存区(MRR)中存储的是数据更新替换下来的旧的业务数据内存地址的偏移量,是一段不连续的虚拟地址空间。MRR中的内存地址并非一定可立即回收,在回收时需要检查ref字段是否为0,如果不为0,则说明还有其他进程正在读取该内存,则暂时不可回收再利用。
如图5所示,进一步地,从共享内存中为待更新数据重新申请一块未被使用的共享内存空间的步骤包括:
1)按照内存管理流程的步骤,从共享内存池申请共享内存空间;
将数据写入该内存空间的步骤包括:
2)将内存空间中ref字段初始化为0,len初始化为数据长度data_len,并将待新增/更新数据拷贝到data区域;
修改数据的键key值value关系的步骤包括:
3)按照数据查询流程的步骤,查找进程私有字典PPD,如果未找到对应的key,则说明是新增数据,转到4),否则为更新数据,转到6);
4)在共享数据偏移地址数组DOAA末尾新增数组元素,并将1)中申请的内存空间的地址偏移量MMOA记录在新的数组元素中;
5)在进程共享字典PSD末尾插入键值对,key为输入的业务数据key,value为4)中新增数组元素的索引,然后通过原子操作将PSD中dict_len字段加1,并将对应关系记录到PPD中,转到7);
回收旧的数据区的内存的步骤包括:
6)按照内存管理流程,通过进程私有字典PPD中的value DOAA数组索引找到共享数据偏移地址数组DOAA元素,通过原子操作将数组元素更新为1)中申请的内存空间的地址偏移量MMOA,并将旧的内存偏移地址被放入待回收内存区;7)结束。
如图7所示,进一步的,所述内存管理流程的步骤包括:
1)遍历待回收内存区,找到第一个ref=0且len大于等于申请内存大小的内存区域;如果找到,转4);否则,转2);
2)检查共享内存池是否存在可供分配的内存,如果存在,转4),否则转3);
3)阻塞等待可回收内存,如果在超时时间之内获取到合适的可回收内存,转4),否则转5);
4)如果内存是从共享内存池分配,则将共享内存池起始地址前移,排除本次分配的地址;如果是利用回收的内存,则修改len字段为本次分配内存长度,然后将该回收内存块本次分配后剩余的内存重新加上头部ref和len字段并初始化后,放入待回收内存区;
5)返回内存地址或内存分配失败标志。
如图6所示,进一步的,所述数据查询流程的步骤包括:
1)查找进程私有字典PPD,如果找到业务数据key,转到3);否则转到2);
2)查询进程共享字典PSD,增量读取PSD中dict_len字段值减去PPD已有长度后的剩余项,并将这些项新增到PPD中,再次查找PPD,如果未找到,转7);
3)获取PPD中业务数据key对应的value值,即为共享数据偏移地址数组DOAA的索引值,读取数组元素值业务数据key对应的MMOA,然后与内存映射基地址MMBA相加得到业务数据的实际内存地址real_addr;
4)通过原子操作将ref字段加1;
5)读取数据长度len,然后将data区域len长度的数据拷贝到查询结果中;
6)通过原子操作将ref字段减1;
7)查询结束。
进一步的,所述进程共享字典PSD中记录数据键key与对应的DOAA数组索引之间的对应关系,数据只新增,不修改也不删除;为了避免在新增字典项时引入锁,所述进程共享字典PSD,字典的数据结构采用结构体数组方式;在共享字典区域头部增加一个记录字典表长度的字段(dict_len),每新增完一个字典项,通过原子操作将长度字段加1;其他进程读取共享字典表时,只能读取小于等于长度字段的字典项。
进一步的,所述进程私有字典PPD为在进程在其私有内存中维护的一张PSD的副本,其内容包含全部或部分PSD的内容,采用hashmap或其它支持查找的数据结构实现,如果需要在进程中支持多线程查询,可以使用线程本地存储ThreadLocalStorage-TLS避免对字典表加锁。
进一步的,所述共享内存池是指共享内存可利用的内存偏移地址空间,是一段连续的虚拟地址空间,偏移地址从0x00000000start_pos开始;共享内存池MP通过两个参数进行管理:当前偏移地址cur_pos和最大偏移地址max_pos;当前偏移地址初始化为0x00000000,每次需要从内存池分配一块n字节长度时,首先判断当前偏移地址加上n是否超出了内存池总长度,如果没有,则返回当前偏移地址,然后将当前偏移地址前移n字节长度;否则从内存池分配内存失败。
进一步的,所述待回收内存区中存储的是数据更新替换下来的旧的业务数据内存地址的偏移量,是一段不连续的虚拟地址空间;待回收内存区MRR中的内存地址并非一定可立即回收,在回收时需要检查ref字段是否为0,如果不为0,则说明还有其他进程正在读取该内存,则暂时不可回收再利用。
进一步的,所述内存映射基地址MMBA为共享内存映射到进程的地址空间的基地址,这种映射在linux系统中的操作函数是mmap,windows系统中是MapViewOfView。
进一步的,所述共享数据偏移地址数组DOAA为存储于另一个共享内存区域内的定长数组,数组元素MMOA;虽然共享内存中的同一份数据映射到各进程私有地址空间的内存地址不同,但是其相对于映射基地址(MMBA)的偏移量(MMOA)是相同的;DOAA数组中的数据只会新增、修改,不会被删除,不支持存在数据删除的高频数据实时共享场景;数组元素是内存地址,在修改数组元素时,使用原子操作实现,避免了锁的使用;
所述数组元素MMOA为共享内存数据偏移地址,所述数组元素MMOA是指将共享内存映射到进程的私有地址空间后,数据的内存地址相对于MMBA的偏移量,MMBA+MMOA=数据在进程地址空间中的实际内存地址real_addr;MMOA用于解决同一个共享数据区映射到不同进程的地址空间时基地址不同的问题。
本发明提出的多进程单写多读无锁共享内存的方法,充分利用原子操作特性,从设计上完全避免了锁的使用,从而实现在数据高频更新时提供高性能的实时数据访问能力。当数据更新时,从共享内存中为待更新数据重新申请一块未被使用的共享内存空间,将数据写入该内存空间后修改数据的键(key)值(value)关系,确保读取进程能够取到更新后的数据;同时,旧的数据区的内存将会被回收,用于下一次新增数据或更新数据的内存分配,其本质上是一种用空间换时间的方案。由于数据更新之后才会更新键值关系,任何一个数据区都不会被同时读写,可以完全避免锁的使用。在键值关系更新时本发明通过有效的数据结构设计及原子操作同样避免了锁的使用,真正实现了无锁共享内存。
实施例3:如图8所示,本发明一种多进程单写多读无锁共享内存方案的一个实施例,我们用A股市场(约3400只股票)的实时行情tick数据作为目标数据,数据key为证券代码,字符串类型,行情数据结构体长度固定,为984字节。写入进程实时接收行情数据并写入共享内存,多个读取进程从共享内存高频查询最新的实时行情,查询的目标证券随机分布。
本实施例的运行环境为Windows7SP1 64位操作系统,内存8G,CPU为Intel E5-2650 2.2GHz双核处理器。
(1)进程初始化:
启动写入进程,创建并映射无锁共享内存数据结构,包括三块共享内存区域:共享数据偏移地址数组(DOAA,大小为2M,容纳64*1024个数据偏移地址单元)、进程共享字典区(PSD,大小为4M,一个字典单元64字节,容纳64*1024个字典单元)和共享数据区(SDR,大小为128M,容纳超过128*1024个数据单元)。共享数据区应该设置得比实际需要存储的数据更大一些,以保证有足够的冗余空间,满足更新数据时旧的内存地址还未被回收时新数据的存储需求,如图9所示。初始化内存池当前偏移地址(cur_pos)为0x00000000,最大偏移地址(max_pos)为0x08000000(128M);使用std::unordered_map存储进程私有字典(PPD),
启动多个读取进程,将DOAA、PSD和SDR映射到进程本身的内存地址空间,使用std::unordered_map存储进程私有字典(PPD),随机产生500只沪深两市的股票代码,存储在查询目标数组中。
(2)行情订阅及存储
写入进程订阅沪深两市全部证券的实时行情,接收行情数据,并将数据按照“数据新增/更新流程”写入到无锁共享内存区中。实际在实验过程中,我们为了获取极致情况下的性能指标,采用模拟实时行情数据,增加了一次发布行情切片的股票数量,发布频率也可自由控制,写入耗时如图9所示。可以看出,在CPU占用小于95%时,写入效率能达到每秒20万条数据。
(3)查询行情数据
读取进程从查询目标数组中依次取出证券代码按照“数据查询流程”查询实时行情数据,查询耗时如图10所示。可以看出,CPU占用小于97%时,查询效率能超过每秒200万次,这其中还包含了查询时的字符串拷贝耗时,该操作耗时能占到总耗时的一半左右,也就是真实查询效率可以达到每秒400-500万次。
Claims (12)
1.一种多进程单写多读无锁共享内存的方法,其特征在于:当数据更新时,首先从共享内存池中为待更新数据重新申请一块未被使用的共享内存空间,然后将数据写入该内存空间之后再修改数据的键key值value关系,确保读取进程能够取到更新后的数据,同时,回收旧的数据区的内存。
2.根据权利要求1所述的多进程单写多读无锁共享内存的方法,其特征在于:
从共享内存中为待更新数据重新申请一块未被使用的共享内存空间的步骤包括:
1) 按照内存管理流程的步骤,从共享内存池申请共享内存空间;
将数据写入该内存空间的步骤包括:
2) 将内存空间中ref字段初始化为0,len初始化为数据长度data_len,并将待新增/更新数据拷贝到data区域;
修改数据的键key值value关系的步骤包括:
3) 按照数据查询流程的步骤,查找进程私有字典PPD,如果未找到对应的key,则说明是新增数据,转到4),否则为更新数据,转到6);
4) 在共享数据偏移地址数组DOAA末尾新增数组元素,并将1)中申请的内存空间的地址偏移量MMOA记录在新的数组元素中;
5) 在进程共享字典PSD末尾插入键值对,key为输入的业务数据key,value为4)中新增数组元素的索引,然后通过原子操作将PSD中dict_len字段加1,并将对应关系记录到PPD中,转到7);
回收旧的数据区的内存的步骤包括:
6) 按照内存管理流程,通过进程私有字典PPD中的value DOAA数组索引找到共享数据偏移地址数组DOAA元素,通过原子操作将数组元素更新为1)中申请的内存空间的地址偏移量MMOA,并将旧的内存偏移地址被放入待回收内存区;
7) 结束。
3.根据权利要求2所述的多进程单写多读无锁共享内存的方法,其特征在于:
所述内存管理流程的步骤包括:
1) 遍历待回收内存区,找到第一个ref=0且len大于等于申请内存大小的内存区域;如果找到,转4);否则,转2);
2) 检查共享内存池是否存在可供分配的内存,如果存在,转4),否则转3);
3) 阻塞等待可回收内存,如果在超时时间之内获取到合适的可回收内存,转4),否则转5);
4) 如果内存是从共享内存池分配,则将共享内存池起始地址前移,排除本次分配的地址;如果是利用回收的内存,则修改len字段为本次分配内存长度,然后将该回收内存块本次分配后剩余的内存重新加上头部ref和len字段并初始化后,放入待回收内存区;
5) 返回内存地址或内存分配失败标志。
4.根据权利要求2所述的多进程单写多读无锁共享内存的方法,其特征在于:所述数据查询流程的步骤包括:
1) 查找进程私有字典PPD,如果找到业务数据key,转到3);否则转到2);
2) 查询进程共享字典PSD,增量读取PSD中dict_len字段值减去PPD已有长度后的剩余项,并将这些项新增到PPD中,再次查找PPD,如果未找到,转7);
3) 获取PPD中业务数据key对应的value值,即为共享数据偏移地址数组DOAA的索引值,读取数组元素值业务数据key对应的MMOA,然后与内存映射基地址MMBA相加得到业务数据的实际内存地址real_addr;
4) 通过原子操作将ref字段加1;
5) 读取数据长度len,然后将data区域len长度的数据拷贝到查询结果中;
6) 通过原子操作将ref字段减1;
7) 查询结束。
5.根据权利要求2所述的多进程单写多读无锁共享内存的方法,其特征在于:所述进程共享字典PSD中记录数据键key与对应的DOAA数组索引之间的对应关系,数据只新增,不修改也不删除;为了避免在新增字典项时引入锁,所述进程共享字典PSD,字典的数据结构采用结构体数组方式;在共享字典区域头部增加一个记录字典表长度的字段(dict_len),每新增完一个字典项,通过原子操作将长度字段加1;其他进程读取共享字典表时,只能读取小于等于长度字段的字典项。
6.根据权利要求2所述的多进程单写多读无锁共享内存的方法,其特征在于:所述进程私有字典PPD为在进程在其私有内存中维护的一张PSD的副本,其内容包含全部或部分PSD的内容,采用hashmap或其它支持查找的数据结构实现,如果需要在进程中支持多线程查询,可以使用线程本地存储ThreadLocalStorage-TLS避免对字典表加锁。
7.根据权利要求1或2所述的多进程单写多读无锁共享内存的方法,其特征在于:所述共享内存池是指共享内存可利用的内存偏移地址空间,是一段连续的虚拟地址空间,偏移地址从0x00000000 start_pos开始;共享内存池MP通过两个参数进行管理:当前偏移地址cur_pos和最大偏移地址max_pos;当前偏移地址初始化为0x00000000,每次需要从内存池分配一块n字节长度时,首先判断当前偏移地址加上n是否超出了内存池总长度,如果没有,则返回当前偏移地址,然后将当前偏移地址前移n字节长度;否则从内存池分配内存失败。
8.根据权利要求2或3所述的多进程单写多读无锁共享内存的方法,其特征在于:所述待回收内存区中存储的是数据更新替换下来的旧的业务数据内存地址的偏移量,是一段不连续的虚拟地址空间;待回收内存区MRR中的内存地址并非一定可立即回收,在回收时需要检查ref字段是否为0,如果不为0,则说明还有其他进程正在读取该内存,则暂时不可回收再利用。
9.根据权利要求4所述的多进程单写多读无锁共享内存的方法,其特征在于:所述内存映射基地址MMBA为共享内存映射到进程的地址空间的基地址,这种映射在linux系统中的操作函数是mmap,windows系统中是MapViewOfView。
10.根据权利要求4所述的多进程单写多读无锁共享内存的方法,其特征在于:所述共享数据偏移地址数组DOAA为存储于另一个共享内存区域内的定长数组,数组元素MMOA;虽然共享内存中的同一份数据映射到各进程私有地址空间的内存地址不同,但是其相对于映射基地址(MMBA)的偏移量(MMOA)是相同的;DOAA数组中的数据只会新增、修改,不会被删除,不支持存在数据删除的高频数据实时共享场景;数组元素是内存地址,在修改数组元素时,使用原子操作实现,避免了锁的使用;
所述数组元素MMOA为共享内存数据偏移地址,所述数组元素MMOA是指将共享内存映射到进程的私有地址空间后,数据的内存地址相对于MMBA的偏移量,MMBA+MMOA=数据在进程地址空间中的实际内存地址real_addr; MMOA用于解决同一个共享数据区映射到不同进程的地址空间时基地址不同的问题。
11.一种多进程单写多读无锁共享内存的方法的应用,其特征在于:所述多进程单写多读无锁共享内存的方法应用于证券业,包括如下步骤:
(1)进程初始化的步骤;
启动写入进程,创建并映射无锁共享内存数据结构,包括三块共享内存区域:共享数据偏移地址数组DOAA,进程共享字典区PSD,和共享数据区SDR,共享数据区设置得比实际需要存储的数据大,以保证有足够的冗余空间,满足更新数据时旧的内存地址还未被回收时新数据的存储需求;初始化内存池当前偏移地址cur_pos为0x00000000,最大偏移地址max_pos为0x08000000128M;使用std::unordered_map存储进程私有字典PPD,启动多个读取进程,将DOAA、PSD和SDR映射到进程本身的内存地址空间,使用std::unordered_map存储进程私有字典PPD,随机产生股票代码,存储在查询目标数组中;
(2)行情订阅及存储的步骤
写入进程订阅证券的实时行情,接收行情数据,并将数据按照“数据新增/更新流程”写入到无锁共享内存区中;
(3)查询行情数据的捕捉
读取进程从查询目标数组中依次取出证券代码按照“数据查询流程”查询实时行情数据。
12.根据权利要求11所述的多进程单写多读无锁共享内存的方法的应用,其特征在于:所述共享数据区是实际存储数据的内存区域,其中的每个数据单元包含三个元素:当前正在读取的进程数ref、数据长度len、数据data,ref和len合称为数据单元的头部header,ref字段记录当前该内存块正在被读取的次数,进程开始读取时该值加1,读取完后该值减1,只有当该值为0时这部分内存才能够被回收,对ref字段的操作是原子操作;len字段记录data的长度,如果存储定长数据,该字段可以省略;data为具体的数据内容。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811039333.XA CN109298935B (zh) | 2018-09-06 | 2018-09-06 | 一种多进程单写多读无锁共享内存的方法及应用 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811039333.XA CN109298935B (zh) | 2018-09-06 | 2018-09-06 | 一种多进程单写多读无锁共享内存的方法及应用 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109298935A true CN109298935A (zh) | 2019-02-01 |
CN109298935B CN109298935B (zh) | 2023-02-03 |
Family
ID=65166279
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811039333.XA Active CN109298935B (zh) | 2018-09-06 | 2018-09-06 | 一种多进程单写多读无锁共享内存的方法及应用 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109298935B (zh) |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110096453A (zh) * | 2019-04-11 | 2019-08-06 | 北京华三通信技术有限公司 | 数据处理方法及装置 |
CN110275906A (zh) * | 2019-06-06 | 2019-09-24 | 深圳证券通信有限公司 | 一种做市行情库的分发方法 |
CN110287044A (zh) * | 2019-07-02 | 2019-09-27 | 广州虎牙科技有限公司 | 无锁共享内存处理方法、装置、电子设备及可读存储介质 |
CN110334069A (zh) * | 2019-07-10 | 2019-10-15 | 中国民航信息网络股份有限公司 | 多进程间的数据共享方法及相关装置 |
CN110442530A (zh) * | 2019-07-11 | 2019-11-12 | 福建天泉教育科技有限公司 | 优化内存数据处理的方法、存储介质 |
CN111782380A (zh) * | 2020-08-06 | 2020-10-16 | Oppo(重庆)智能科技有限公司 | 应用运行控制方法、装置、电子装置及存储介质 |
CN111857600A (zh) * | 2020-07-30 | 2020-10-30 | 江苏金恒信息科技股份有限公司 | 一种数据读写方法及装置 |
CN112084032A (zh) * | 2020-09-15 | 2020-12-15 | 电子科技大学 | 一种写优化的持久性内存堆管理方法 |
CN112346879A (zh) * | 2020-11-06 | 2021-02-09 | 网易(杭州)网络有限公司 | 进程管理方法、装置、计算机设备及存储介质 |
CN112416816A (zh) * | 2020-12-08 | 2021-02-26 | 上证所信息网络有限公司 | 一种一写多读高并发无锁环形缓存及其实现方法 |
CN113608775A (zh) * | 2021-06-18 | 2021-11-05 | 天津津航计算技术研究所 | 一种基于内存直接读写的流程配置方法 |
WO2021249106A1 (zh) * | 2020-06-11 | 2021-12-16 | 中兴通讯股份有限公司 | 一种内存操作控制方法、设备及存储介质 |
CN114071222A (zh) * | 2021-11-15 | 2022-02-18 | 深圳Tcl新技术有限公司 | 音视频数据共享装置及电子设备 |
CN114745428A (zh) * | 2022-03-14 | 2022-07-12 | 许继电气股份有限公司 | 一种换流站监控数据模型快速读写方法及装置 |
CN116069530A (zh) * | 2023-04-03 | 2023-05-05 | 中国人民解放军国防科技大学 | 基于内存池的仿真引擎数据共享黑板系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101763289A (zh) * | 2009-09-25 | 2010-06-30 | 中国人民解放军国防科学技术大学 | 一种基于共享内存的消息传递方法 |
CN104424030A (zh) * | 2013-08-22 | 2015-03-18 | 腾讯科技(深圳)有限公司 | 多进程操作共享内存的方法和装置 |
CN105955971A (zh) * | 2015-11-30 | 2016-09-21 | 中国银联股份有限公司 | 一种键值缓存的实现方法及装置 |
CN106648932A (zh) * | 2016-12-19 | 2017-05-10 | 四川长虹电器股份有限公司 | 基于Python扩展模块的多进程共享系统及方法 |
-
2018
- 2018-09-06 CN CN201811039333.XA patent/CN109298935B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101763289A (zh) * | 2009-09-25 | 2010-06-30 | 中国人民解放军国防科学技术大学 | 一种基于共享内存的消息传递方法 |
CN104424030A (zh) * | 2013-08-22 | 2015-03-18 | 腾讯科技(深圳)有限公司 | 多进程操作共享内存的方法和装置 |
CN105955971A (zh) * | 2015-11-30 | 2016-09-21 | 中国银联股份有限公司 | 一种键值缓存的实现方法及装置 |
CN106648932A (zh) * | 2016-12-19 | 2017-05-10 | 四川长虹电器股份有限公司 | 基于Python扩展模块的多进程共享系统及方法 |
Cited By (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110096453B (zh) * | 2019-04-11 | 2020-01-03 | 北京华三通信技术有限公司 | 数据处理方法及装置 |
CN110096453A (zh) * | 2019-04-11 | 2019-08-06 | 北京华三通信技术有限公司 | 数据处理方法及装置 |
CN110275906A (zh) * | 2019-06-06 | 2019-09-24 | 深圳证券通信有限公司 | 一种做市行情库的分发方法 |
CN110275906B (zh) * | 2019-06-06 | 2023-04-18 | 深圳证券通信有限公司 | 一种做市行情库的分发方法 |
CN110287044A (zh) * | 2019-07-02 | 2019-09-27 | 广州虎牙科技有限公司 | 无锁共享内存处理方法、装置、电子设备及可读存储介质 |
CN110334069A (zh) * | 2019-07-10 | 2019-10-15 | 中国民航信息网络股份有限公司 | 多进程间的数据共享方法及相关装置 |
CN110334069B (zh) * | 2019-07-10 | 2022-02-01 | 中国民航信息网络股份有限公司 | 多进程间的数据共享方法及相关装置 |
CN110442530A (zh) * | 2019-07-11 | 2019-11-12 | 福建天泉教育科技有限公司 | 优化内存数据处理的方法、存储介质 |
WO2021249106A1 (zh) * | 2020-06-11 | 2021-12-16 | 中兴通讯股份有限公司 | 一种内存操作控制方法、设备及存储介质 |
CN111857600B (zh) * | 2020-07-30 | 2024-04-16 | 江苏金恒信息科技股份有限公司 | 一种数据读写方法及装置 |
CN111857600A (zh) * | 2020-07-30 | 2020-10-30 | 江苏金恒信息科技股份有限公司 | 一种数据读写方法及装置 |
CN111782380A (zh) * | 2020-08-06 | 2020-10-16 | Oppo(重庆)智能科技有限公司 | 应用运行控制方法、装置、电子装置及存储介质 |
CN112084032A (zh) * | 2020-09-15 | 2020-12-15 | 电子科技大学 | 一种写优化的持久性内存堆管理方法 |
CN112346879A (zh) * | 2020-11-06 | 2021-02-09 | 网易(杭州)网络有限公司 | 进程管理方法、装置、计算机设备及存储介质 |
CN112346879B (zh) * | 2020-11-06 | 2023-08-11 | 网易(杭州)网络有限公司 | 进程管理方法、装置、计算机设备及存储介质 |
CN112416816A (zh) * | 2020-12-08 | 2021-02-26 | 上证所信息网络有限公司 | 一种一写多读高并发无锁环形缓存及其实现方法 |
CN113608775B (zh) * | 2021-06-18 | 2023-10-13 | 天津津航计算技术研究所 | 一种基于内存直接读写的流程配置方法 |
CN113608775A (zh) * | 2021-06-18 | 2021-11-05 | 天津津航计算技术研究所 | 一种基于内存直接读写的流程配置方法 |
CN114071222B (zh) * | 2021-11-15 | 2023-07-25 | 深圳Tcl新技术有限公司 | 音视频数据共享装置及电子设备 |
CN114071222A (zh) * | 2021-11-15 | 2022-02-18 | 深圳Tcl新技术有限公司 | 音视频数据共享装置及电子设备 |
CN114745428A (zh) * | 2022-03-14 | 2022-07-12 | 许继电气股份有限公司 | 一种换流站监控数据模型快速读写方法及装置 |
CN116069530A (zh) * | 2023-04-03 | 2023-05-05 | 中国人民解放军国防科技大学 | 基于内存池的仿真引擎数据共享黑板系统 |
Also Published As
Publication number | Publication date |
---|---|
CN109298935B (zh) | 2023-02-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109298935A (zh) | 一种多进程单写多读无锁共享内存的方法及应用 | |
CN105190623B (zh) | 日志记录管理 | |
US8386362B2 (en) | Information distribution process and method | |
CN105335098B (zh) | 一种基于存储级内存的日志文件系统性能提高方法 | |
US8768977B2 (en) | Data management using writeable snapshots in multi-versioned distributed B-trees | |
US7418544B2 (en) | Method and system for log structured relational database objects | |
WO2022001131A1 (zh) | 一种基于逐笔数据重构市场行情的方法、装置及设备 | |
US20110040676A1 (en) | Order Chronicle Process and Method | |
US20180218023A1 (en) | Database concurrency control through hash-bucket latching | |
US8260758B2 (en) | Utilizing shared numeric locks | |
CN102024015A (zh) | 用于批量删除数据库系统的数据记录的方法 | |
CN102651008A (zh) | 在关系数据库中组织数据记录的方法和设备 | |
CN107784121A (zh) | 一种基于非易失内存的日志文件系统的小写优化方法 | |
CN110377531A (zh) | 基于日志结构的持久性内存存储引擎装置及控制方法 | |
US6895487B2 (en) | Methods for intra-partition parallelism for inserts | |
CN106445409A (zh) | 一种分布式块存储的数据写入方法及装置 | |
CN101986649A (zh) | 应用于电信行业计费系统的共享数据中心 | |
ZA200307863B (en) | System and method for reorganizing stored data. | |
Xu et al. | Building a fast and efficient LSM-tree store by integrating local storage with cloud storage | |
US20120317384A1 (en) | Data storage method | |
US7412465B2 (en) | Method for append mode insertion of rows into tables in database management systems | |
CN115964444B (zh) | 一种云原生分布式多租户数据库实现方法及系统 | |
US20030225675A1 (en) | Information distribution system and method | |
CN113468150A (zh) | 一种支付签约数据的水平切分扩容与迁移方法 | |
KR102214697B1 (ko) | 데이터베이스 관리 시스템에서 데이터 저장을 위한 공간 관리를 제공하는 컴퓨터 프로그램 |
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 |