[发明专利]一种多进程单写多读无锁共享内存的方法及应用有效
| 申请号: | 201811039333.X | 申请日: | 2018-09-06 |
| 公开(公告)号: | CN109298935B | 公开(公告)日: | 2023-02-03 |
| 发明(设计)人: | 邱小铭;邢正俊;吕正荣 | 申请(专利权)人: | 华泰证券股份有限公司 |
| 主分类号: | G06F9/50 | 分类号: | G06F9/50 |
| 代理公司: | 南京科知维创知识产权代理有限责任公司 32270 | 代理人: | 杜依民 |
| 地址: | 210000 *** | 国省代码: | 江苏;32 |
| 权利要求书: | 查看更多 | 说明书: | 查看更多 |
| 摘要: | |||
| 搜索关键词: | 一种 进程 单写多读无锁 共享 内存 方法 应用 | ||
1.一种多进程单写多读无锁共享内存的方法,其特征在于:当数据更新时,首先从共享内存池中为待更新数据重新申请一块未被使用的共享内存空间,然后将数据写入该内存空间之后再修改数据的键key值value关系,确保读取进程能够取到更新后的数据,同时,回收旧的数据区的内存; 所述共享内存池是指共享内存可利用的内存偏移地址空间,是一段连续的虚拟地址空间,偏移地址从0x00000000 start_pos开始;共享内存池MP通过两个参数进行管理:当前偏移地址cur_pos和最大偏移地址max_pos;当前偏移地址初始化为0x00000000,每次需要从内存池分配一块n字节长度时,首先判断当前偏移地址加上n是否超出了内存池总长度,如果没有,则返回当前偏移地址,然后将当前偏移地址前移n字节长度;否则从内存池分配内存失败; 共享数据区是实际存储数据的内存区域,其中的每个数据单元包含三个元素:当前正在读取的进程数ref、数据长度len、数据data,ref和len合称为数据单元的头部header, ref字段记录当前内存块正在被读取的次数,进程开始读取时该值加1,读取完后该值减1,只有当该值为0时这部分内存才能够被回收,对ref字段的操作是原子操作;len字段记录data的长度,如果存储定长数据,该字段省略;data为具体的数据内容;
从共享内存中为待更新数据重新申请一块未被使用的共享内存空间的步骤包括:
(1)按照内存管理流程的步骤,从共享内存池申请共享内存空间;
所述内存管理流程的步骤包括:
1)遍历待回收内存区,找到第一个ref=0且len大于等于申请内存大小的内存区域;如果找到,转4);否则,转2);
2)检查共享内存池是否存在可供分配的内存,如果存在,转4),否则转3);
3) 阻塞等待可回收内存,如果在超时时间之内获取到合适的可回收内存,转4),否则转5);
4)如果内存是从共享内存池分配,则将共享内存池起始地址前移,排除本次分配的地址;如果是利用回收的内存,则修改len字段为本次分配内存长度,然后将该回收内存本次分配后剩余的内存重新加上头部ref和len字段并初始化后,放入待回收内存区;
5)返回内存地址或内存分配失败标志;
将数据写入该内存空间的步骤包括:
(2)将内存空间中ref字段初始化为0,len字段初始化为数据长度data_len,并将待新增/更新数据拷贝到data区域;
启动写入进程,创建并映射无锁共享内存数据结构,包括三块共享内存区域:共享数据偏移地址数组DOAA,进程共享字典区PSD,和共享数据区SDR,共享数据区设置得比实际需要存储的数据大,以保证有足够的冗余空间,满足更新数据时旧的内存地址还未被回收时新数据的存储需求;初始化内存池当前偏移地址cur_pos为0x00000000,最大偏移地址max_pos为0x08000000128M;使用std::unordered_map存储进程私有字典PPD,启动多个读取进程,将DOAA、PSD和SDR映射到进程本身的内存地址空间,使用std::unordered_map存储进程私有字典PPD,随机产生股票代码,存储在查询目标数组中;
修改数据的键key值value关系的步骤包括:
(3)按照数据查询流程的步骤,查找进程私有字典PPD,如果未找到对应的key,key为输入的业务数据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)结束。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于华泰证券股份有限公司,未经华泰证券股份有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201811039333.X/1.html,转载请声明来源钻瓜专利网。
- 上一篇:心跳周期调整方法、装置及系统
- 下一篇:一种资源调度方法及装置





