CN113176942A - 一种共享缓存的方法、装置及电子设备 - Google Patents
一种共享缓存的方法、装置及电子设备 Download PDFInfo
- Publication number
- CN113176942A CN113176942A CN202110442251.5A CN202110442251A CN113176942A CN 113176942 A CN113176942 A CN 113176942A CN 202110442251 A CN202110442251 A CN 202110442251A CN 113176942 A CN113176942 A CN 113176942A
- Authority
- CN
- China
- Prior art keywords
- data
- memory
- consumed
- size
- consumer
- 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
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0638—Organizing or formatting or addressing of data
- G06F3/0644—Management of space entities, e.g. partitions, extents, pools
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0668—Interfaces specially adapted for storage systems adopting a particular infrastructure
- G06F3/0671—In-line storage system
- G06F3/0673—Single storage device
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Human Computer Interaction (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本发明实施例提供了一种共享缓存的方法、装置及电子设备,所述方法包括:创建并初始化共享内存;建立共享内存的地址与目标进程的虚拟内存地址之间的映射关系;根据创建生产者指令创建生产者,根据创建消费者指令创建消费者;生产者使用顺序插入、顺序覆盖的方式在共享内存中插入待消费数据,并向消费者发送待消费数据的信息,其中,顺序插入、顺序覆盖表示针对共享内存的数据区从头到尾进行重复遍历,以将待消费数据使用顺序插入、顺序覆盖的方式插入共享内存;消费者根据待消费数据的信息,从共享内存中获取待消费数据,并对待消费数据进行处理。本发明,能够提高内存利用率,降低数据处理时延。
Description
技术领域
本发明涉及计算机技术领域,特别是涉及一种共享缓存的方法、装置及电子设备。
背景技术
随着科技的进步,电子设备等硬件性能方面不断提升。在视频数据处理方面,随着视频数据量的增大,视频分辨率也在不断的提升,视频展示的功能也更加复杂,进而电子设备等需要对音视频数据的处理量日益增加,使得对电子设备等的内存容量要求越来越高。
现有为缓解对电子设备等内存容量的需求,一种使用共享缓存的方法为:将内存池划分为固定大小的区块,进而使用所划分的区块对音视频数据进行处理。
然而,实际应用中,音视频数据可以是动态变化的,进而固定大小的内存区块很难满足音视频数据处理的需求,使得内存利用率较低,而实时根据待处理的音视频数据需求重新对内存池进行划分,耗时较长,又会使得数据处理延时较大。
发明内容
本发明实施例的目的在于提供一种共享缓存的方法、装置及电子设备,以提高内存利用率,降低数据处理时延。具体技术方案如下:
第一方面,本发明实施例提供了一种共享缓存的方法,所述方法包括:
创建并初始化共享内存;
建立所述共享内存的地址与目标进程的虚拟内存地址之间的映射关系;
根据创建生产者指令创建生产者,所述生产者用于在所述共享内存中插入待消费数据;
根据创建消费者指令创建消费者,所述消费者用于对插入所述共享内存中的待消费数据进行处理;
所述生产者使用顺序插入、顺序覆盖的方式在所述共享内存中插入待消费数据,并向所述消费者发送待消费数据的信息,所述顺序插入、顺序覆盖表示针对所述共享内存的数据区从头到尾进行重复遍历,以将待消费数据使用顺序插入、顺序覆盖的方式插入所述共享内存;
所述消费者根据所述待消费数据的信息,从所述共享内存中获取待消费数据,并对所述待消费数据进行处理。
可选地,所述共享内存包括:共享内存头控制信息区和数据区,所述数据区包括多个数据块,所述生产者使用顺序插入、顺序覆盖的方式在所述共享内存中插入待消费数据的步骤,包括:
所述生产者顺序遍历所述共享内存的数据区,在所述数据区结尾的可用空间不足以插入所述待消费数据,或者重新遍历所述数据区,在被占用数据块之前的可用空间不足以插入所述待消费数据时,则跳过所述数据块,从所述数据区中顺序获取能够插入所述待消费数据的目标数据块;
将所述待消费数据写入所述目标数据块中。
可选地,所述共享内存包括:共享内存头控制信息区和数据区,所述数据区包括多个数据块,所述数据块包括数据头和数据;所述生产者使用顺序插入、顺序覆盖的方式在所述共享内存中插入待消费数据的步骤,包括:
获取所述共享内存中的数据使用偏移位置;
基于所述数据使用偏移位置遍历所述数据区,确定已获取的内存大小;
判断所述已获取内存大小是否小于目标内存大小与一个数据头大小之和,且所述数据区是否遍历完成;
如果是,则返回执行基于所述数据使用偏移位置遍历所述数据区,确定已获取的内存大小的步骤;
如果否,则根据已获取的内存大小,与目标内存大小与一个数据头大小之和之间的关系,确定目标内存的位置,所述目标内存的位置用于指示插入待消费数据的数据块的地址;
基于所述目标内存的位置,在所述已获取内存中插入所述待消费数据。
可选地,所述基于所述数据使用偏移位置遍历所述数据区,确定已获取的内存大小的步骤,包括:
判断所述数据使用偏移位置是否指向所述数据区的尾端;
在所述数据使用偏移位置指向所述数据区的尾端时,将所述数据使用偏移位置指向所述数据区的头部,并将已获取的内存大小清零,将共享内存被完全覆盖的次数增加1,以及将目标内存的位置指向所述数据区的头部;
判断所述数据使用偏移位置所指向数据区的头部对应的数据块是否被占用;
如果是,则将已获取的内存大小清零,并将所述目标内存的位置指向所述数据区下一个数据块的数据头;
如果否,则更新已获取内存大小为历史已获取内存大小与该未被占用的数据块的大小之和;
将所述数据使用偏移位置指向所述数据区下一个数据块。
可选地,所述根据已获取的内存大小,与目标内存大小与一个数据头大小之和之间的关系,确定目标内存的位置的步骤,包括:
判断所述已获取内存大小是否小于目标内存大小与一个数据头大小之和;
如果是,则返回错误;
如果否,则将已获取内存大小减去一个数据头的大小,得到可插入数据内存大小,再判断所述可插入数据内存大小是否大于目标内存大小;
如果所述可插入数据内存大小大于目标内存大小,则判断所述可插入数据内存大小是否小于目标内存大小与一个数据头大小之和;
如果所述可插入数据内存大小不大于目标内存大小,则确定所述目标内存的位置,以及将所述已获取内存大小确定为所述目标内存的位置对应的实际可用内存大小;
如果所述可插入数据内存大小小于目标内存大小与一个数据头大小之和,则判断所述目标内存的位置指向的所述数据区下一个数据块的数据头是否不是结尾,且未被占用;
如果所述可插入数据内存大小不小于目标内存大小与一个数据头大小之和,则将所述可插入数据内存大小大于目标内存大小的部分,单独作为一个数据块,并确定所述目标内存的位置,以及将所述目标内存大小确定为所述目标内存的位置对应的实际可用内存大小;
如果所述目标内存的位置指向的所述数据区下一个数据块的数据头不是结尾,且未被占用,则将所述可插入数据内存大小大于目标内存大小的部分,合并至下一个数据块中,并确定所述目标内存的位置,以及将所述目标内存大小确定为所述目标内存的位置对应的实际可用内存大小;
如果所述目标内存的位置指向的所述数据区下一个数据块的数据头是结尾,和/或被占用,则将所述可插入数据内存大小大于目标内存大小的部分,放在所述已获取内存中,并确定所述目标内存的位置,以及将所述已获取内存大小确定为所述目标内存的位置对应的实际可用内存大小。
可选地,根据创建生产者指令创建生产者时,获取消费者订阅位图,所述消费者订阅位图用于表征订阅该生成者的消费者位图;所述生产者向所述消费者发送待消费数据的信息的步骤,包括:
所述生产者根据所述消费者订阅位图,向所述消费者发送待消费数据的信息;
判断所述消费者订阅位图中已订阅消费者是否需要唤醒;
如果是,则唤醒所述已订阅消费者;
如果否,则判断是否还有待消费数据未完成插入;
在还有待消费数据未完成插入的情况下,返回执行所述生产者使用顺序插入、顺序覆盖的方式在所述共享内存中插入待消费数据的步骤。
可选地,所述方法还包括:
在完成待消费数据插入的情况下,注销生产者,并清除该生产者对应的生产者信息,以及更新订阅该生产者的消费者对应的消费者使用位图中该生产者的置位关系;所述消费者使用位图用于表征消费者当前正在使用的生产者信息的位图;
判断所述消费者使用位图是否为零;
在所述消费者使用位图为零的情况下,判断所述已订阅消费者是否需要唤醒;
在所述已订阅消费者需要唤醒的情况下,唤醒所述已订阅消费者。
可选地,所述消费者根据待消费数据的信息,从共享内存中获取待消费数据,并对所述待消费数据进行处理的步骤,包括:
所述消费者根据获取待消费数据的类型,对所述待消费数据的信息进行处理;
判断订阅生产者位图中的生产者是否已经创建在用,所述订阅生产者位图用于表征消费者订阅生产者的位图;
如果所述订阅生产者位图中的生产者已经创建在用,则判断消息控制信息的消息循环队列中是否有未读待消费数据的信息,所述消息控制信息用于对所述消费者待处理的待消费数据的信息进行管理;
在所述消息循环队列中有未读待消费数据的信息时,检查共享内存是否被覆盖;
在所述消息循环队列中没有未读待消费数据的信息时,等待被唤醒;
在共享内存没有被覆盖的情况下,设置待消费数据块的数据头中的消费者占用位图;所述待消费数据块的数据头根据待消费数据的信息确定;
所述消费者根据所述待消费数据的信息,从所述共享内存中获取待消费数据,并对所述待消费数据进行处理,在处理完成时释放所述待消费数据;
如果所述订阅生产者位图中的生产者没有创建在用,或者释放待消费数据后,则判断是否继续从生产者获取待消费数据;
在不继续从生产者获取待消费数据时,注销消费者,并清除生产者中的消费者订阅位图,清空消息控制信息中的消息循环队列;
在继续从生产者获取待消费数据时,返回执行所述消费者根据获取待消费数据的类型,对所述待消费数据的信息进行处理的步骤。
第二方面,本发明实施例提供了一种数据读取装置,所述装置包括:
第一创建模块,用于创建并初始化共享内存;
地址映射模块,用于建立所述共享内存的地址与目标进程的虚拟内存地址之间的映射关系;
第二创建模块,用于根据创建生产者指令创建生产者,所述生产者用于在所述共享内存中插入待消费数据;
第三创建模块,用于根据创建消费者指令创建消费者,所述消费者用于对插入所述共享内存中的待消费数据进行处理;
数据插入模块,用于所述生产者使用顺序插入、顺序覆盖的方式在所述共享内存中插入待消费数据,并向所述消费者发送待消费数据的信息,所述顺序插入、顺序覆盖表示针对所述共享内存的数据区从头到尾进行重复遍历,以将待消费数据使用顺序插入、顺序覆盖的方式插入所述共享内存;
数据处理模块,用于所述消费者根据所述待消费数据的信息,从所述共享内存中获取待消费数据,并对所述待消费数据进行处理。
第三方面,本发明实施例提供了一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
存储器,用于存放计算机程序;
处理器,用于执行存储器上所存放的程序时,实现上述第一方面所述的一种共享缓存的方法的步骤。
第四方面,本发明实施例提供了一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述第一方面所述的一种共享缓存的方法的步骤。
本发明实施例有益效果:
本发明实施例提供的一种共享缓存的方法、装置及电子设备,通过创建共享内存,将共享内存的地址映射为目标进程的虚拟内存地址,使得共享内存在多进程和多线程中使用,应用范围广。生产者使用顺序插入、顺序覆盖的方式在共享内存中插入待消费数据,能够根据所插入的待消费数据的大小动态分配内存,无需重新划分内存,进而能够提高内存的利用率,使用共享内存,可以减少数据重复拷贝的次数,进而提高了数据插入速度,降低数据处理时延。且,顺序插入、顺序覆盖,可以使得在处理音视频数据时无需同步,创建生产者和消费者,可以支持多生产者和多消费者,使得共享内存使用更灵活。当然,实施本发明的任一产品或方法并不一定需要同时达到以上所述的所有优点。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的实施例。
图1为本发明实施例提供的一种共享缓存的方法的流程示意图;
图2为本发明实施例提供的一种共享内存分配示意图;
图3为本发明实施例提供的另一种共享内存分配示意图;
图4为本发明实施例提供的一种共享内存头控制信息结构体示意图;
图5为本发明实施例提供的一种数据头信息结构体示意图;
图6为本发明实施例提供的一种共享内存数据区示意图;
图7为本发明实施例提供的一种在共享内存中插入数据的实施方式示意图;
图8为本发明实施例提供的一种确定已获取内存大小的实施方式示意图;
图9为本发明实施例提供的一种确定目标内存位置的实施方式示意图;
图10为本发明实施例提供的一种生产者向消费者发送信息的实施方式示意图;
图11为本发明实施例提供的一种消费者进行数据处理的实施方式示意图;
图12为本发明实施例提供的一种共享缓存的装置的结构示意图;
图13为本发明实施例提供的一种电子设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员基于本申请所获得的所有其他实施例,都属于本发明保护的范围。
为了解决现有技术中内存利用率低,数据处理延时大的问题,本发明实施例提供了一种共享缓存的方法、装置及电子设备。
本发明实施例提供的一种共享缓存的方法,可以包括:
创建并初始化共享内存;建立所述共享内存的地址与目标进程的虚拟内存地址之间的映射关系;根据创建生产者指令创建生产者,所述生产者用于在所述共享内存中插入待消费数据;根据创建消费者指令创建消费者,所述消费者用于对插入所述共享内存中的待消费数据进行处理;所述生产者使用顺序插入、顺序覆盖的方式在所述共享内存中插入待消费数据,并向所述消费者发送待消费数据的信息,所述顺序插入、顺序覆盖表示针对所述共享内存的数据区从头到尾进行重复遍历,以将待消费数据使用顺序插入、顺序覆盖的方式插入所述共享内存;所述消费者根据所述待消费数据的信息,从所述共享内存中获取待消费数据,并对所述待消费数据进行处理。
本发明实施例提供的一种共享缓存的方法,通过创建共享内存,将共享内存的地址映射为目标进程的虚拟内存地址,使得共享内存在多进程和多线程中使用,应用范围广。生产者使用顺序插入、顺序覆盖的方式在共享内存中插入待消费数据,能够根据所插入的待消费数据的大小动态分配内存,无需重新划分内存,进而能够提高内存的利用率,使用共享内存,可以减少数据重复拷贝的次数,进而提高了数据插入速度,降低数据处理时延。且,顺序插入、顺序覆盖,可以使得在处理音视频数据时无需同步,创建生产者和消费者,可以支持多生产者和多消费者,使得共享内存使用更灵活。
下面对本发明实施例提供的一种共享缓存的方法进行详细介绍:
如图1所示,本发明实施例提供了一种共享缓存的方法,该方法可以包括以下步骤:
S101,创建并初始化共享内存。
本发明实施例中使用共享内存方式存储和处理数据,在使用共享内存时,可以先创建并初始化共享内存。优选地,本发明实施例中的共享内存可以包括:共享内存头控制信息区和数据区,而共享内存头控制信息区可以包括:共享内存信息,生产者信息,消费者信息和消息控制信息,数据区可以包括多个数据块,每一数据块可以包括数据头和数据。其中,消息控制信息用于对消费者待处理的待消费数据的信息进行管理。示例性的,本发明实施例所创建的共享内存分配如图2和图3所示,其中,ShmInfo即表示共享内存头控制信息。
优选地,本发明实施例中,所创建的共享内存的共享内存头控制信息结构体设计可以如图4所示,数据头信息结构体的设计可以如图5所示。在创建并初始化共享内存时,可以初始化共享内存中各个区的信息。其中,ShmInfo.mark(共享内存标记)可以固定为0x4D445342,XXXX,XXXX表示字段标识,单个码流扩展信息长度为预留字段,ShmInfo.coverCnt(覆盖次数)可以用于判断数据帧是否被覆盖。ShmInfo.curCnsmrId(当前使用到的消费者信息位置),表示每注册一个消费者该位置加1,循环判断使用。bitmap表示位图,DataStrmInfo表示生产者信息,CnsmrInfo表示消费者信息,MsgCtrl表示消息控制信息,DataStrmInfo.dataCnt,DataStrmInfo.dataUseCnt和DataStrmInfo.newTm用于调试打印使用。CnsmrInfo.usedStrmBitmap(订阅中当前正在使用中的bitmap)用于注销数据流,清除bitmap,如果订阅的数据流全部注销,获取数据返回无在用流错误,避免一直阻塞。MsgInfo.offset,用于比较确认使用时未被覆盖。
S102,建立共享内存的地址与目标进程的虚拟内存地址之间的映射关系。
在创建并初始化共享内存之后,可以建立共享内存的地址与目标进程的虚拟内存地址之间的映射关系,即将共享内存的地址映射为目标进程的虚拟内存地址,或将共享内存的地址映射为目标进程的虚拟内存地址的一部分,本发明实施例中的共享内存可以支持多进程和多线程的访问。
S103,根据创建生产者指令创建生产者。
其中,生产者用于在共享内存中插入待消费数据。优选地,在创建生产者时,还可以对生产者对应的生产者信息进行初始化,具体初始化的参数可参见图4结构体中的参数,并获取消费者订阅位图,该消费者订阅位图用于表征订阅该生成者的消费者位图。
S104,根据创建消费者指令创建消费者。
其中,消费者用于对插入共享内存中的待消费数据进行处理。优选地,在创建消费者时,还可以对消费者信息进行初始化,具体初始化的参数可参见图4结构体中的参数,并获取订阅生产者位图,该订阅生产者位图用于表征消费者订阅生产者的位图。还可以为每一消费者生成消息控制信息等。
S105,生产者使用顺序插入、顺序覆盖的方式在共享内存中插入待消费数据,并向消费者发送待消费数据的信息。
其中,顺序插入、顺序覆盖表示针对共享内存的数据区从头到尾进行重复遍历,以将待消费数据使用顺序插入、顺序覆盖的方式插入共享内存。
作为本发明实施例一种可选的实施方式,生产者使用顺序插入、顺序覆盖的方式在共享内存中插入待消费数据的实现方式可以包括:
生产者顺序遍历共享内存的数据区,在数据区结尾的可用空间不足以插入待消费数据,或者重新遍历数据区,在被占用数据块之前的可用空间不足以插入待消费数据时,则跳过数据块,从数据区中顺序获取能够插入待消费数据的目标数据块;
将待消费数据写入目标数据块中。
示例性的,本发明实施例提供的一种共享内存数据区如图6所示,生产者可以针对共享内存的数据区从头到尾进行顺序重复遍历,在数据区结尾的可用空间(如图6所示的数据块7之后的可用空间)不足以插入待消费数据,或者重新遍历数据区,在被占用数据块之前的可用空间(如图6所示的数据块8之后,2占用中的数据块之前的可用空间)不足以插入待消费数据时,则跳过该数据块,从共享内存的整个数据区中顺序获取能够插入待消费数据的目标数据块,进而将待消费数据写入目标数据块中。实现数据的顺序插入,顺序使用以及顺序覆盖,其中跳过的数据块在本次使用中浪费,然而可以在后续数据插入的过程中再次使用,以提高共享内存的利用率。
生产者在将待消费数据写入目标数据块中后,可以向消费者发送待消费数据的信息,其中,该待消费数据的信息可以是如图4所示结构体中的数据头偏移信息,以及数据区覆盖次数信息等,以使消费者可以根据待消费数据的信息,从共享内存中获取待消费数据,并对待消费数据进行处理。
S106,消费者根据待消费数据的信息,从共享内存中获取待消费数据,并对待消费数据进行处理。
消费者可以基于接收到的生产者发送的待消费数据的信息,具体的可以是数据头偏移信息,进而根据该数据头偏移信息从共享内存中获取待消费数据,进一步实现对待消费数据的处理。
作为本发明实施例一种可选的实施方式,在步骤S105或S106之后,还可以包括:
取消共享内存的地址与目标进程的虚拟内存地址之间的映射关系。
在完成数据的插入和处理之后,还可以取消共享内存的地址与目标进程的虚拟内存地址之间的映射关系,以释放目标进程对共享内存的占用。进一步的的,也可以选择销毁共享内存。
本发明实施例提供的一种共享缓存的方法,通过创建共享内存,将共享内存的地址映射为目标进程的虚拟内存地址,使得共享内存在多进程和多线程中使用,应用范围广。生产者使用顺序插入、顺序覆盖的方式在共享内存中插入待消费数据,能够根据所插入的待消费数据的大小动态分配内存,无需重新划分内存,进而能够提高内存的利用率,使用共享内存,可以减少数据重复拷贝的次数,进而提高了数据插入速度,降低数据处理时延。且,顺序插入、顺序覆盖,可以使得在处理音视频数据时无需同步,创建生产者和消费者,可以支持多生产者和多消费者,使得共享内存使用更灵活。
作为本发明实施例一种可选的实施方式,如图7所示,图7为本发明实施例提供的一种在共享内存中插入数据的实施方式示意图,可以用于实现上述步骤S105中生产者使用顺序插入、顺序覆盖的方式在共享内存中插入待消费数据,该实施方式可以包括:
本发明实施例中的共享内存可以包括:共享内存头控制信息区和数据区,数据区可以包括多个数据块,每一数据块可以包括数据头和数据。
S201,获取共享内存中的数据使用偏移位置。
在所创建的生产者进行待消费数据的插入时,可以获取共享内存中的数据使用偏移位置(即图4中的数据区使用到的偏移位置useOffset),该数据使用偏移位置可以是临时指针,用于表征共享内存中数据区的当前使用状态,具体的,该数据使用偏移位置可以指向上次插入待消费数据的末尾,即下一次第一个待顺序释放区域的数据块头部。数据使用偏移位置的初始值可以是数据写入的偏移位置。
S202,基于数据使用偏移位置遍历数据区,确定已获取的内存大小。
基于数据使用偏移位置,顺序遍历数据区,以确定为插入待消费数据所获取的内存大小。具体的,基于数据使用偏移位置遍历数据区,确定已获取的内存大小的实施方式在下文进行详细介绍。
S203,判断已获取内存大小是否小于目标内存大小与一个数据头大小之和,且数据区是否遍历完成。
在已获取内存大小小于目标内存大小与一个数据头大小之和,且数据区遍历完成的情况下,表明遍历完整个数据区所获取的内存大小还不足以插入待消费数据,此时返回执行基于数据使用偏移位置遍历数据区,确定已获取的内存大小的步骤,继续遍历数据区以确定已获取的内存大小。其中,目标内存大小表示插入待消费数据所需的内存大小。
S204,如果否,则根据已获取的内存大小,与目标内存大小与一个数据头大小之和之间的关系,确定目标内存的位置。
在否的情况下,进一步根据已获取的内存大小,与目标内存大小与一个数据头大小之和之间的关系,确定目标内存的位置,该目标内存的位置用于指示插入待消费数据的数据块的地址。
S205,基于目标内存的位置,在已获取内存中插入待消费数据。
作为本发明实施例一种可选的实施方式,如图8所示,图8为本发明实施例提供的一种确定已获取内存大小的实施方式示意图,可以用于实现上述步骤S202基于数据使用偏移位置遍历数据区,确定已获取的内存大小,该实施方式可以包括:
S301,判断数据使用偏移位置是否指向数据区的尾端。
S302,在数据使用偏移位置指向数据区的尾端时,将数据使用偏移位置指向数据区的头部,并将已获取的内存大小清零,将共享内存被完全覆盖的次数增加1,以及将目标内存的位置指向数据区的头部。
在数据使用偏移位置指向数据区的尾端时,重新从整个数据区的头部开始遍历,进而将数据使用偏移位置指向数据区的头部,并将已获取的内存大小清零(即重新确定已获取的内存大小),将共享内存被完全覆盖的次数增加1,以及将目标内存的位置指向数据区的头部。
在数据使用偏移位置还没有指向数据区的尾端时,执行步骤S303的操作。
S303,判断数据使用偏移位置所指向数据区的头部对应的数据块是否被占用。
S304,如果是,则将已获取的内存大小清零,并将目标内存的位置指向数据区下一个数据块的数据头。
如果数据使用偏移位置所指向数据区的头部对应的数据块被占用,表明该数据块不能用于插入新的数据,此时需要重新确定已获取的内存大小,将已获取的内存大小清零,并将目标内存的位置指向数据区下一个数据块的数据头。
S305,如果否,则更新已获取内存大小为历史已获取内存大小与该未被占用的数据块的大小之和。
如果数据使用偏移位置所指向数据块未被占用,表明该数据块能够用于插入新的数据,此时更新已获取内存大小为历史已获取内存大小与该未被占用的数据块的大小之和。
S306,将数据使用偏移位置指向数据区下一个数据块。
将数据使用偏移位置指向数据区下一个数据块,继续遍历数据区。
作为本发明实施例一种可选的实施方式,如图9所示,图9为本发明实施例提供的一种确定目标内存的位置的实施方式示意图,可以用于实现上述步骤S204,根据已获取的内存大小,与目标内存大小与一个数据头大小之和之间的关系,确定目标内存的位置,该实施方式可以包括:
S401,判断已获取内存大小是否小于目标内存大小与一个数据头大小之和。
如果已获取内存大小小于目标内存大小与一个数据头大小之和,表明没有获取到合适的内存,此时返回错误,表示获取目标内存位置错误,并退出。
S402,如果否,则将已获取内存大小减去一个数据头的大小,得到可插入数据内存大小,再判断可插入数据内存大小是否大于目标内存大小。
如果已获取内存大小不小于目标内存大小与一个数据头大小之和,此时目标内存的位置与数据使用偏移位置相同,将已获取内存大小减去一个数据头的大小,得到可插入数据内存大小,再判断可插入数据内存大小是否大于目标内存大小。
S403,如果可插入数据内存大小大于目标内存大小,则判断可插入数据内存大小是否小于目标内存大小与一个数据头大小之和。
S404,如果可插入数据内存大小不大于目标内存大小,则确定目标内存的位置,以及将已获取内存大小确定为目标内存的位置对应的实际可用内存大小。
S405,如果可插入数据内存大小小于目标内存大小与一个数据头大小之和,则判断目标内存的位置指向的数据区下一个数据块的数据头是否不是结尾,且未被占用。
S406,如果可插入数据内存大小不小于目标内存大小与一个数据头大小之和,则将可插入数据内存大小大于目标内存大小的部分,单独作为一个数据块,并确定目标内存的位置,以及将目标内存大小确定为目标内存的位置对应的实际可用内存大小。
如果可插入数据内存大小不小于目标内存大小与一个数据头大小之和,此时,对所获取的多出的内存的处理方式为:将可插入数据内存大小大于目标内存大小的部分,单独作为一个数据块的数据头。
S407,如果目标内存的位置指向的数据区下一个数据块的数据头不是结尾,且未被占用,则将可插入数据内存大小大于目标内存大小的部分,合并至下一个数据块中,并确定目标内存的位置,以及将目标内存大小确定为目标内存的位置对应的实际可用内存大小。
如果目标内存的位置指向的数据区下一个数据块的数据头不是结尾,且未被占用,此时,对所获取的多出的内存的处理方式为:将可插入数据内存大小大于目标内存大小的部分,合并至下一个数据块中。
S408,如果目标内存的位置指向的数据区下一个数据块的数据头是结尾,和/或被占用,则将可插入数据内存大小大于目标内存大小的部分,放在已获取内存中,并确定目标内存的位置,以及将已获取内存大小确定为目标内存的位置对应的实际可用内存大小。
如果目标内存的位置指向的数据区下一个数据块的数据头是结尾,和/或被占用,此时,对所获取的多出的内存的处理方式为:将可插入数据内存大小大于目标内存大小的部分,放在已获取内存中。
作为本发明实施例一种可选的实施方式,如图10所示,图10为本发明实施例提供的一种生产者向消费者发送信息的实施方式示意图,可以用于实现上述步骤S105,生产者向消费者发送待消费数据的信息,该实施方式可以包括:
S501,生产者根据消费者订阅位图,向消费者发送待消费数据的信息。
消费者订阅位图表征了订阅该生成者的消费者位图,故而生产者在完成待消费数据的写入之后,可以基于该消费者订阅位图,向订阅的消费者发送待消费数据的信息。生产者向消费者发送待消费数据的信息可以是:数据头偏移信息,以及数据区覆盖次数信息等。
S502,判断消费者订阅位图中已订阅消费者是否需要唤醒。
实际应用中,部分消费者处于等待数据状态,在获取数据时需要被唤醒,而部分消费者可以直接向生产者获取数据不需要唤醒。生产者可以判断消费者订阅位图中已订阅消费者是否需要唤醒,并在需求的情况下,唤醒已订阅消费者,具体的,可以通过发送信号量唤醒已订阅消费者。
S503,如果是,则唤醒已订阅消费者。
S504,如果否,则判断是否还有待消费数据未完成插入。
在还有待消费数据未完成插入的情况下,可以返回执行步骤S105中生产者使用顺序插入、顺序覆盖的方式在共享内存中插入待消费数据的操作。
S505,在完成待消费数据插入的情况下,注销生产者,并清除该生产者对应的生产者信息,以及更新订阅该生产者的消费者对应的消费者使用位图中该生产者的置位关系。
在完成待消费数据插入的情况下,可以对生产者进行注销,并更新订阅该生产者的消费者对应的消费者使用位图中该生产者的置位关系,其中,消费者使用位图用于表征消费者当前正在使用的生产者信息的位图。
S506,判断消费者使用位图是否为零。
可以理解的,每一消费者可以订阅多个生产者,因此,消费者使用位图中可以包含多个生产者置位,当生产者注销时,该消费者使用位图中的生产者置位关系也取消。
S507,在消费者使用位图为零的情况下,判断已订阅消费者是否需要唤醒。
S508,在已订阅消费者需要唤醒的情况下,唤醒已订阅消费者。
作为本发明实施例一种可选的实施方式,如图11所示,图11为本发明实施例提供的一种消费者进行数据处理的实施方式示意图,可以用于实现上述步骤S106,消费者根据待消费数据的信息,从共享内存中获取待消费数据,并对待消费数据进行处理,该实施方式可以包括:
S601,消费者根据获取待消费数据的类型,对待消费数据的信息进行处理。
实际应用中,消费者获取数据时,可以选择获取数据的类型,示例性的,针对视频数据,可以获取下一帧数据(若待消费数据的信息中还包含之前没获取过的数据,则获取未读的最旧的消息),或者获取当前数据(此时,待消费数据的信息中未读的消息全部清空,则等待新消息),或者获取最旧数据(获取待消费数据的信息里最旧的信息),或者非阻塞方式获取数据,或者阻塞方式获取数据,进而,根据获取待消费数据的类型,对待消费数据的信息进行处理。
S602,判断订阅生产者位图中的生产者是否已经创建在用。
其中,订阅生产者位图用于表征消费者订阅生产者的位图。
S603,如果订阅生产者位图中的生产者已经创建在用,则判断消息控制信息的消息循环队列中是否有未读待消费数据的信息。
在创建消费者时,可以为每一消费者生成消息控制信息,该消息控制信息用于对消费者待处理的待消费数据的信息进行管理。如图4所示,该消息控制信息中可以包括:是否需要被唤醒信息,消息写入位置信息,消息读取位置信息,消息循环队列信息以及消息锁,该消息循环队列中可以存放生产者发送的待消费数据的信息。
在订阅生产者位图中的生产者已经创建在用时,表明消费者已经订阅的生产者中有已经创建的生产者,此时,进一步判断消息控制信息的消息循环队列中是否有未读待消费数据的信息。
如果订阅生产者位图中的生产者没有创建在用,则执行步骤S608判断是否继续从生产者获取待消费数据的操作。
S604,在消息循环队列中有未读待消费数据的信息时,检查共享内存是否被覆盖。
S605,在消息循环队列中没有未读待消费数据的信息时,等待被唤醒。
S606,在共享内存没有被覆盖的情况下,设置待消费数据块的数据头中的消费者占用位图。
其中,待消费数据块的数据头根据待消费数据的信息确定。在共享内存被覆盖的情况下,读取消息循环队列中的下一条消息。
S607,消费者根据待消费数据的信息,从共享内存中获取待消费数据,并对待消费数据进行处理,在处理完成时释放待消费数据。
待消费数据的信息可以是:数据头偏移信息,以及数据区覆盖次数信息等。进而消费者可以根据数据头偏移信息,从共享内存中获取待消费数据,并对待消费数据进行处理,以及在处理完成时释放待消费数据,其实质释放的是:待消费数据块的数据头中的消费者占用位图。
S608,判断是否继续从生产者获取待消费数据。
在释放待消费数据后,进一步判断是否继续从生产者获取待消费数据。
S609,在不继续从生产者获取待消费数据时,注销消费者,并清除生产者中的消费者订阅位图,清空消息控制信息中的消息循环队列。
在继续从生产者获取待消费数据时,返回执行步骤S601消费者根据获取待消费数据的类型,对待消费数据的信息进行处理的操作。
示例性的,以IPC(Internet Protocol Camera,网络摄像头)录像为例进行说明:IPC有主码流、子码流、第三码流、图片和音频,可以将这些作为生产者。IPC支持预览、录像、抓图和报警上传图片等功能,可以将这些功能作为消费者。以主码流录像为例:
步骤1,可以初始化共享内存,初始化信号量(共享内存的大小可以根据实际情况确定)。
步骤2,映射共享内存(可以建立共享内存的地址与目标进程的虚拟内存地址之间的映射关系)。
步骤3,创建生产者,将主码流、子码流、第三码流、图片和音频,创建为生产者。假设创建生产者时,从主码流开始id=1,其它依次递增,那么音频id=5;创建后共享内存会根据id,初始化对应的生产者信息结构体strmInfo。
步骤4,创建主码流录像消费者,并订阅相关数据。该消费者需要订阅主码流和音频数据,那么将订阅生产者位图上对应的主码流和音频id位,置位(即1和5位,置位)。创建消费者,共享内存程序,会返回一个未使用的消费者id,假设id=20。并根据订阅生产者位图,将订阅的生产者stmInfo中的消费者订阅位图,对应消费者id=20位,置位,完成订阅。初始化对应的消费者信息和消息控制信息,即cnsmrInfo和msgCtrl。
步骤5,生产者插入数据。数据插入共享内存的过程参见上文实施例描述。数据插入完毕后,共享内存程序会根据对应的消费者订阅位图,向订阅该数据的消费者发送待消费数据的信息msgInfo,该消息中包含了数据覆盖次数converCnt和数据头偏移offset,并更新订阅该生产者的消费者对应的消费者使用位图中该生产者的置位关系。
步骤6,开始录像。
步骤7,获取主码流和音频数据。根据注册(创建)时获取的消费者信息cnsmrInfo,得到对应的消息控制信息msgCtrl,从中获取待消费数据的信息msgInfo,根据msgInfo中的数据头偏移offset得到数据。在获取数据的过程中,对数据的头部DataHead中使用个数useCnt加1,消费者使用位图bitmap会将消费者id=20位,置位(避免数据被覆盖)。
步骤8,录像。
步骤9,释放数据。释放数据时,会将对应数据的DataHead中的useCnt减1,bitmap中消费者id=20位,清零。
步骤10,重复步骤5-9,直到录像停止。
步骤11,注销消费者。
步骤12,注销生产者。
步骤13,取消共享内存映射。
步骤14,销毁共享内存。
相应于上述方法实施例,本发明实施例还提供了相应的装置实施例。
如图12所示,本发明实施例提供了一种共享缓存的装置,该装置可以包括:
第一创建模块701,用于创建并初始化共享内存。
地址映射模块702,用于建立共享内存的地址与目标进程的虚拟内存地址之间的映射关系。
第二创建模块703,用于根据创建生产者指令创建生产者,生产者用于在共享内存中插入待消费数据。
第三创建模块704,用于根据创建消费者指令创建消费者,消费者用于对插入共享内存中的待消费数据进行处理。
数据插入模块705,用于生产者使用顺序插入、顺序覆盖的方式在共享内存中插入待消费数据,并向消费者发送待消费数据的信息,顺序插入、顺序覆盖表示针对共享内存的数据区从头到尾进行重复遍历,以将待消费数据使用顺序插入、顺序覆盖的方式插入共享内存。
数据处理模块706,用于消费者根据待消费数据的信息,从共享内存中获取待消费数据,并对待消费数据进行处理。
本发明实施例提供的一种共享缓存的装置,将共享内存的地址映射为目标进程的虚拟内存地址,使得共享内存在多进程和多线程中使用,应用范围广。生产者使用顺序插入、顺序覆盖的方式在共享内存中插入待消费数据,能够根据所插入的待消费数据的大小动态分配内存,无需重新划分内存,进而能够提高内存的利用率,使用共享内存,可以减少数据重复拷贝的次数,进而提高了数据插入速度,降低数据处理时延。且,顺序插入、顺序覆盖,可以使得在处理音视频数据时无需同步,创建生产者和消费者,可以支持多生产者和多消费者,使得共享内存使用更灵活。
可选地,上述共享内存包括:共享内存头控制信息区和数据区,数据区包括多个数据块,上述数据插入模块705,具体用于:
生产者顺序遍历共享内存的数据区,在数据区结尾的可用空间不足以插入待消费数据,或者重新遍历数据区,在被占用数据块之前的可用空间不足以插入待消费数据时,则跳过数据块,从数据区中顺序获取能够插入待消费数据的目标数据块。
将待消费数据写入目标数据块中。
可选地,上述共享内存包括:共享内存头控制信息区和数据区,数据区包括多个数据块,数据块包括数据头和数据;上述数据插入模块705,包括:
获取子模块,用于获取共享内存中的数据使用偏移位置。
第一确定子模块,用于基于数据使用偏移位置遍历所述数据区,确定已获取的内存大小。
判断子模块,用于判断已获取内存大小是否小于目标内存大小与一个数据头大小之和,且数据区是否遍历完成。
第二确定子模块,用于在判断子模块的判断结果为否时,根据已获取的内存大小,与目标内存大小与一个数据头大小之和之间的关系,确定目标内存的位置,目标内存的位置用于指示插入待消费数据的数据块的地址;在判断子模块的判断结果为是时,触发第一确定子模块执行基于数据使用偏移位置遍历数据区,确定已获取的内存大小。
数据插入子模块,用于基于目标内存的位置,在已获取内存中插入待消费数据。
可选地,上述第一确定子模块,具体用于:
判断数据使用偏移位置是否指向数据区的尾端。
在数据使用偏移位置指向数据区的尾端时,将数据使用偏移位置指向数据区的头部,并将已获取的内存大小清零,将共享内存被完全覆盖的次数增加1,以及将目标内存的位置指向数据区的头部。
判断数据使用偏移位置所指向数据区的头部对应的数据块是否被占用。
如果是,则将已获取的内存大小清零,并将目标内存的位置指向数据区下一个数据块的数据头。
如果否,则更新已获取内存大小为历史已获取内存大小与该未被占用的数据块的大小之和。
将数据使用偏移位置指向数据区下一个数据块。
可选地,上述第二确定子模块,具体用于:
判断已获取内存大小是否小于目标内存大小与一个数据头大小之和。
如果是,则返回错误。
如果否,则将已获取内存大小减去一个数据头的大小,得到可插入数据内存大小,再判断可插入数据内存大小是否大于目标内存大小。
如果可插入数据内存大小大于目标内存大小,则判断可插入数据内存大小是否小于目标内存大小与一个数据头大小之和。
如果可插入数据内存大小不大于目标内存大小,则确定目标内存的位置,以及将已获取内存大小确定为目标内存的位置对应的实际可用内存大小。
如果可插入数据内存大小小于目标内存大小与一个数据头大小之和,则判断目标内存的位置指向的数据区下一个数据块的数据头是否不是结尾,且未被占用。
如果可插入数据内存大小不小于目标内存大小与一个数据头大小之和,则将可插入数据内存大小大于目标内存大小的部分,单独作为一个数据块,并确定目标内存的位置,以及将目标内存大小确定为目标内存的位置对应的实际可用内存大小。
如果目标内存的位置指向的数据区下一个数据块的数据头不是结尾,且未被占用,则将可插入数据内存大小大于目标内存大小的部分,合并至下一个数据块中,并确定目标内存的位置,以及将目标内存大小确定为目标内存的位置对应的实际可用内存大小。
如果目标内存的位置指向的数据区下一个数据块的数据头是结尾,和/或被占用,则将可插入数据内存大小大于目标内存大小的部分,放在已获取内存中,并确定目标内存的位置,以及将已获取内存大小确定为目标内存的位置对应的实际可用内存大小。
可选地,根据创建生产者指令创建生产者时,获取消费者订阅位图,消费者订阅位图用于表征订阅该生成者的消费者位图;上述数据插入模块705,具体用于:
生产者根据消费者订阅位图,向消费者发送待消费数据的信息。
判断消费者订阅位图中已订阅消费者是否需要唤醒。
如果是,则唤醒已订阅消费者。
如果否,则判断是否还有待消费数据未完成插入。
在还有待消费数据未完成插入的情况下,返回执行生产者使用顺序插入、顺序覆盖的方式在共享内存中插入待消费数据的步骤。
可选地,上述数据插入模块705,还具体用于:
在完成待消费数据插入的情况下,注销生产者,并清除该生产者对应的生产者信息,以及更新订阅该生产者的消费者对应的消费者使用位图中该生产者的置位关系;消费者使用位图用于表征消费者当前正在使用的生产者信息的位图;
判断消费者使用位图是否为零。
在消费者使用位图为零的情况下,判断已订阅消费者是否需要唤醒。
在已订阅消费者需要唤醒的情况下,唤醒已订阅消费者。
可选地,上述数据处理模块706,还具体用于:
消费者根据获取待消费数据的类型,对待消费数据的信息进行处理。
判断订阅生产者位图中的生产者是否已经创建在用,订阅生产者位图用于表征消费者订阅生产者的位图。
如果订阅生产者位图中的生产者已经创建在用,则判断消息控制信息的消息循环队列中是否有未读待消费数据的信息,消息控制信息用于对消费者待处理的待消费数据的信息进行管理。
在消息循环队列中有未读待消费数据的信息时,检查共享内存是否被覆盖。
在消息循环队列中没有未读待消费数据的信息时,等待被唤醒。
在共享内存没有被覆盖的情况下,设置待消费数据块的数据头中的消费者占用位图;待消费数据块的数据头根据待消费数据的信息确定。
消费者根据待消费数据的信息,从共享内存中获取待消费数据,并对待消费数据进行处理,在处理完成时释放待消费数据。
如果订阅生产者位图中的生产者没有创建在用,或者释放待消费数据后,则判断是否继续从生产者获取待消费数据。
在不继续从生产者获取待消费数据时,注销消费者,并清除生产者中的消费者订阅位图,清空消息控制信息中的消息循环队列。
在继续从生产者获取待消费数据时,返回执行消费者根据获取待消费数据的类型,对待消费数据的信息进行处理的步骤。
本发明实施例还提供了一种电子设备,如图13所示,包括处理器801、通信接口802、存储器803和通信总线804,其中,处理器801,通信接口802,存储器803通过通信总线804完成相互间的通信,
存储器803,用于存放计算机程序;
处理器801,用于执行存储器803上所存放的程序时,实现上述任一一种共享缓存的方法的步骤,以达到相同的技术效果。
上述电子设备提到的通信总线可以是PCI(Peripheral ComponentInterconnect,外设部件互连标准)总线或EISA(Extended Industry StandardArchitecture,扩展工业标准结构)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
通信接口用于上述电子设备与其他设备之间的通信。
存储器可以包括随机存取存储器(Random Access Memory,RAM),也可以包括非易失性存储器(Non-Volatile Memory,NVM),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。
存储器可以包括RAM(Random Access Memory,随机存取存储器),也可以包括NVM(Non-Volatile Memory,非易失性存储器),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。
上述的处理器可以是通用处理器,包括CPU(Central Processing Unit,中央处理器)、NP(Network Processor,网络处理器)等;还可以是DSP(Digital Signal Processing,数字信号处理器)、ASIC(Application Specific Integrated Circuit,专用集成电路)、FPGA(Field-Programmable Gate Array,现场可编程门阵列)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
在本发明提供的又一实施例中,还提供了一种计算机可读存储介质,该计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述任一一种共享缓存的方法的步骤。
在本发明提供的又一实施例中,还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述实施例中任一一种共享缓存的方法的步骤。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、DSL(Digital Subscriber Line,数字用户线))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD(Digital Versatile Disc,数字多功能光盘))、或者半导体介质(例如SSD(Solid StateDisk,固态硬盘))等。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置/电子设备实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本发明的较佳实施例,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
Claims (10)
1.一种共享缓存的方法,其特征在于,所述方法包括:
创建并初始化共享内存;
建立所述共享内存的地址与目标进程的虚拟内存地址之间的映射关系;
根据创建生产者指令创建生产者,所述生产者用于在所述共享内存中插入待消费数据;
根据创建消费者指令创建消费者,所述消费者用于对插入所述共享内存中的待消费数据进行处理;
所述生产者使用顺序插入、顺序覆盖的方式在所述共享内存中插入待消费数据,并向所述消费者发送待消费数据的信息,所述顺序插入、顺序覆盖表示针对所述共享内存的数据区从头到尾进行重复遍历,以将待消费数据使用顺序插入、顺序覆盖的方式插入所述共享内存;
所述消费者根据所述待消费数据的信息,从所述共享内存中获取待消费数据,并对所述待消费数据进行处理。
2.根据权利要求1所述的方法,其特征在于,所述共享内存包括:共享内存头控制信息区和数据区,所述数据区包括多个数据块,所述生产者使用顺序插入、顺序覆盖的方式在所述共享内存中插入待消费数据的步骤,包括:
所述生产者顺序遍历所述共享内存的数据区,在所述数据区结尾的可用空间不足以插入所述待消费数据,或者重新遍历所述数据区,在被占用数据块之前的可用空间不足以插入所述待消费数据时,则跳过所述数据块,从所述数据区中顺序获取能够插入所述待消费数据的目标数据块;
将所述待消费数据写入所述目标数据块中。
3.根据权利要求1所述的方法,其特征在于,所述共享内存包括:共享内存头控制信息区和数据区,所述数据区包括多个数据块,所述数据块包括数据头和数据;所述生产者使用顺序插入、顺序覆盖的方式在所述共享内存中插入待消费数据的步骤,包括:
获取所述共享内存中的数据使用偏移位置;
基于所述数据使用偏移位置遍历所述数据区,确定已获取的内存大小;
判断所述已获取内存大小是否小于目标内存大小与一个数据头大小之和,且所述数据区是否遍历完成;
如果是,则返回执行基于所述数据使用偏移位置遍历所述数据区,确定已获取的内存大小的步骤;
如果否,则根据已获取的内存大小,与目标内存大小与一个数据头大小之和之间的关系,确定目标内存的位置,所述目标内存的位置用于指示插入待消费数据的数据块的地址;
基于所述目标内存的位置,在所述已获取内存中插入所述待消费数据。
4.根据权利要求3所述的方法,其特征在于,所述基于所述数据使用偏移位置遍历所述数据区,确定已获取的内存大小的步骤,包括:
判断所述数据使用偏移位置是否指向所述数据区的尾端;
在所述数据使用偏移位置指向所述数据区的尾端时,将所述数据使用偏移位置指向所述数据区的头部,并将已获取的内存大小清零,将共享内存被完全覆盖的次数增加1,以及将目标内存的位置指向所述数据区的头部;
判断所述数据使用偏移位置所指向数据区的头部对应的数据块是否被占用;
如果是,则将已获取的内存大小清零,并将所述目标内存的位置指向所述数据区下一个数据块的数据头;
如果否,则更新已获取内存大小为历史已获取内存大小与该未被占用的数据块的大小之和;
将所述数据使用偏移位置指向所述数据区下一个数据块。
5.根据权利要求3所述的方法,其特征在于,所述根据已获取的内存大小,与目标内存大小与一个数据头大小之和之间的关系,确定目标内存的位置的步骤,包括:
判断所述已获取内存大小是否小于目标内存大小与一个数据头大小之和;
如果是,则返回错误;
如果否,则将已获取内存大小减去一个数据头的大小,得到可插入数据内存大小,再判断所述可插入数据内存大小是否大于目标内存大小;
如果所述可插入数据内存大小大于目标内存大小,则判断所述可插入数据内存大小是否小于目标内存大小与一个数据头大小之和;
如果所述可插入数据内存大小不大于目标内存大小,则确定所述目标内存的位置,以及将所述已获取内存大小确定为所述目标内存的位置对应的实际可用内存大小;
如果所述可插入数据内存大小小于目标内存大小与一个数据头大小之和,则判断所述目标内存的位置指向的所述数据区下一个数据块的数据头是否不是结尾,且未被占用;
如果所述可插入数据内存大小不小于目标内存大小与一个数据头大小之和,则将所述可插入数据内存大小大于目标内存大小的部分,单独作为一个数据块,并确定所述目标内存的位置,以及将所述目标内存大小确定为所述目标内存的位置对应的实际可用内存大小;
如果所述目标内存的位置指向的所述数据区下一个数据块的数据头不是结尾,且未被占用,则将所述可插入数据内存大小大于目标内存大小的部分,合并至下一个数据块中,并确定所述目标内存的位置,以及将所述目标内存大小确定为所述目标内存的位置对应的实际可用内存大小;
如果所述目标内存的位置指向的所述数据区下一个数据块的数据头是结尾,和/或被占用,则将所述可插入数据内存大小大于目标内存大小的部分,放在所述已获取内存中,并确定所述目标内存的位置,以及将所述已获取内存大小确定为所述目标内存的位置对应的实际可用内存大小。
6.根据权利要求1所述的方法,其特征在于,根据创建生产者指令创建生产者时,获取消费者订阅位图,所述消费者订阅位图用于表征订阅该生成者的消费者位图;所述生产者向所述消费者发送待消费数据的信息的步骤,包括:
所述生产者根据所述消费者订阅位图,向所述消费者发送待消费数据的信息;
判断所述消费者订阅位图中已订阅消费者是否需要唤醒;
如果是,则唤醒所述已订阅消费者;
如果否,则判断是否还有待消费数据未完成插入;
在还有待消费数据未完成插入的情况下,返回执行所述生产者使用顺序插入、顺序覆盖的方式在所述共享内存中插入待消费数据的步骤。
7.根据权利要求6所述的方法,其特征在于,所述方法还包括:
在完成待消费数据插入的情况下,注销生产者,并清除该生产者对应的生产者信息,以及更新订阅该生产者的消费者对应的消费者使用位图中该生产者的置位关系;所述消费者使用位图用于表征消费者当前正在使用的生产者信息的位图;
判断所述消费者使用位图是否为零;
在所述消费者使用位图为零的情况下,判断所述已订阅消费者是否需要唤醒;
在所述已订阅消费者需要唤醒的情况下,唤醒所述已订阅消费者。
8.根据权利要求1所述的方法,其特征在于,所述消费者根据待消费数据的信息,从共享内存中获取待消费数据,并对所述待消费数据进行处理的步骤,包括:
所述消费者根据获取待消费数据的类型,对所述待消费数据的信息进行处理;
判断订阅生产者位图中的生产者是否已经创建在用,所述订阅生产者位图用于表征消费者订阅生产者的位图;
如果所述订阅生产者位图中的生产者已经创建在用,则判断消息控制信息的消息循环队列中是否有未读待消费数据的信息,所述消息控制信息用于对所述消费者待处理的待消费数据的信息进行管理;
在所述消息循环队列中有未读待消费数据的信息时,检查共享内存是否被覆盖;
在所述消息循环队列中没有未读待消费数据的信息时,等待被唤醒;
在共享内存没有被覆盖的情况下,设置待消费数据块的数据头中的消费者占用位图;所述待消费数据块的数据头根据待消费数据的信息确定;
所述消费者根据所述待消费数据的信息,从所述共享内存中获取待消费数据,并对所述待消费数据进行处理,在处理完成时释放所述待消费数据;
如果所述订阅生产者位图中的生产者没有创建在用,或者释放待消费数据后,则判断是否继续从生产者获取待消费数据;
在不继续从生产者获取待消费数据时,注销消费者,并清除生产者中的消费者订阅位图,清空消息控制信息中的消息循环队列;
在继续从生产者获取待消费数据时,返回执行所述消费者根据获取待消费数据的类型,对所述待消费数据的信息进行处理的步骤。
9.一种共享缓存的装置,其特征在于,所述装置包括:
第一创建模块,用于创建并初始化共享内存;
地址映射模块,用于建立所述共享内存的地址与目标进程的虚拟内存地址之间的映射关系;
第二创建模块,用于根据创建生产者指令创建生产者,所述生产者用于在所述共享内存中插入待消费数据;
第三创建模块,用于根据创建消费者指令创建消费者,所述消费者用于对插入所述共享内存中的待消费数据进行处理;
数据插入模块,用于所述生产者使用顺序插入、顺序覆盖的方式在所述共享内存中插入待消费数据,并向所述消费者发送待消费数据的信息,所述顺序插入、顺序覆盖表示针对所述共享内存的数据区从头到尾进行重复遍历,以将待消费数据使用顺序插入、顺序覆盖的方式插入所述共享内存;
数据处理模块,用于所述消费者根据所述待消费数据的信息,从所述共享内存中获取待消费数据,并对所述待消费数据进行处理。
10.一种电子设备,其特征在于,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
存储器,用于存放计算机程序;
处理器,用于执行存储器上所存放的程序时,实现权利要求1-8任一所述的方法步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110442251.5A CN113176942A (zh) | 2021-04-23 | 2021-04-23 | 一种共享缓存的方法、装置及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110442251.5A CN113176942A (zh) | 2021-04-23 | 2021-04-23 | 一种共享缓存的方法、装置及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113176942A true CN113176942A (zh) | 2021-07-27 |
Family
ID=76924537
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110442251.5A Pending CN113176942A (zh) | 2021-04-23 | 2021-04-23 | 一种共享缓存的方法、装置及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113176942A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115840654A (zh) * | 2023-01-30 | 2023-03-24 | 北京万里红科技有限公司 | 消息的处理方法、系统、计算设备及可读存储介质 |
-
2021
- 2021-04-23 CN CN202110442251.5A patent/CN113176942A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115840654A (zh) * | 2023-01-30 | 2023-03-24 | 北京万里红科技有限公司 | 消息的处理方法、系统、计算设备及可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3419247B1 (en) | Method and device for storage resource allocation for video cloud storage | |
CN109308269B (zh) | 一种内存管理方法及装置 | |
EP3958122A1 (en) | Memory management method, apparatus, and system | |
US9176857B2 (en) | Method and apparatus for managing video memory in embedded device | |
CN109684099A (zh) | 消息处理方法及装置 | |
US9361224B2 (en) | Non-intrusive storage of garbage collector-specific management data | |
KR20060042002A (ko) | 메모리 관리 방법, 화상 처리 장치 및 메모리 관리 프로그램 | |
CN108319496A (zh) | 资源访问方法、业务服务器、分布式系统及存储介质 | |
CN110858162A (zh) | 内存管理方法及装置、服务器 | |
CN108415962A (zh) | 一种云存储系统 | |
CN110244901A (zh) | 任务分配方法及装置、分布式存储系统 | |
CN113176942A (zh) | 一种共享缓存的方法、装置及电子设备 | |
CN111190537B (zh) | 一种追加写场景下顺序存储磁盘管理的方法及系统 | |
CN115756955A (zh) | 一种数据备份、数据恢复的方法、装置及计算机设备 | |
US20080005404A1 (en) | Method for managing buffers pool and a system using the method | |
CN110891033B (zh) | 网络资源处理方法、装置、网关、控制器及存储介质 | |
US9164915B2 (en) | Reserving fixed page areas in real storage increments | |
CN108073453B (zh) | 分布式集群中cpu资源的调度方法以及装置 | |
CN109634877B (zh) | 流操作的实现方法、装置、设备及存储介质 | |
CN112883239B (zh) | 一种资源分配方法、装置、计算机设备及存储介质 | |
CN114089912A (zh) | 基于消息中间件的数据处理方法及装置、存储介质 | |
CN110083482B (zh) | 对文件存储系统进行纠删码处理的方法、装置及电子设备 | |
CN108874560B (zh) | 进行通信的方法和通信设备 | |
CN113032414A (zh) | 数据管理方法、装置、系统、计算设备及存储介质 | |
KR100636283B1 (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 |