CN110018914B - 基于共享内存的消息采集方法及装置 - Google Patents
基于共享内存的消息采集方法及装置 Download PDFInfo
- Publication number
- CN110018914B CN110018914B CN201910232506.8A CN201910232506A CN110018914B CN 110018914 B CN110018914 B CN 110018914B CN 201910232506 A CN201910232506 A CN 201910232506A CN 110018914 B CN110018914 B CN 110018914B
- Authority
- CN
- China
- Prior art keywords
- state information
- message
- running state
- queue
- shared memory
- 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
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
-
- 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/546—Message passing systems or structures, e.g. queues
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer And Data Communications (AREA)
- Multi Processors (AREA)
Abstract
本发明提供了一种基于共享内存的消息采集方法及装置,该方法包括:从预先创建的共享内存消息队列中读取被采集对象的至少两种类型消息的运行状态信息;所述运行状态信息用于分析和监控所述被采集对象的运行状态信息;当任一种类型消息的所述运行状态信息的数据量达到预设阀值或对应报文的发送时间超过预设时间时,将所述运行状态信息对应的所述报文发送给服务器。本发明能够建立一种基于共享内存的更高效、更可靠地进行消息采集方法及装置。
Description
技术领域
本发明涉及计算机通信的技术领域,尤其是消息队列采集技术方面,具体涉及一种基于共享内存的消息采集方法及装置。
背景技术
现有数据采集一般通过消息队列来异步处理请求,进行相关数据的传输。具体地,当消息队列单独地用于多线程写入和多线程读取时,由于线程可以执行进程的任何代码段,其具有不确定性,从而会产生两个线程同时操作磁盘驱动器的情况,很显然,这是一种错误操作,目前技术解决此类问题的方法是,对线程进行加锁,增加消息队列数目,但这种做法会加锁会阻塞其他线程,进而造成程序效率降低,增加资源消耗。目前能够实现消息队列功能的开源产品主要包括RabbitMQ、ActiveMQ、kafka等。
现有消息队列方案难以保证数据传输的可靠性与高效性,并且在读取数据时也没有对数据的正确性与完整性进行检查处理。为了能够更高效、更可靠地进行数据采集,提出一种可靠性、高效性消息采集方法及装置,是亟待解决的问题。
发明内容
针对现有技术中的问题,本发明能够建立一种基于共享内存的可靠性、高效性消息采集方法及装置。
为解决上述技术问题,本发明提供以下技术方案:
第一方面,本发明提供一种基于共享内存的消息采集方法,包括:
从预先创建的共享内存消息队列中读取被采集对象的至少两种类型消息的运行状态信息;运行状态信息用于分析和监控被采集对象的运行状态信息;
当任一种类型消息的运行状态信息的数据量达到预设阀值或对应报文的发送时间超过预设时间时,将运行状态信息对应的报文发送给服务器。
一个实施例中,在从预先创建的共享内存消息队列中读取被采集对象的至少两种类型消息的运行状态信息之前,还包括:
向共享内存消息队列写入被采集对象的至少两种类型消息的运行状态信息。
一个实施例中,在向共享内存消息队列写入被采集对象的至少两种类型消息的运行状态信息之前,还包括:
在共享内存中创建共享内存消息队列。
一个实施例中,共享内存消息队列包括循环队列区、循环缓存区及数据读写区;在共享内存中创建共享内存消息队列,包括:
在共享内存中创建循环队列区、循环缓存区及数据读写区;
将运行状态信息的索引信息写入到循环队列区;
将被采集对象的运行状态信息写入到循环缓存区,并根据运行状态信息将索引信息在循环队列区中进行分配;
其中,数据读写区用于标示索引信息在循环队列区中进行写入及读取的位置。
一个实施例中,索引信息包括:运行状态信息的数据类型、运行状态信息的消息长度、随机生成的键值KEY以及运行状态信息在循环缓存区中相对首地址的偏移量;向共享内存消息队列写入被采集对象的至少两种类型消息的运行状态信息,包括:
根据运行状态信息解析出运行状态信息的类型,并计算出消息长度;
读取循环队列区中队尾指针的前一指针所指向的索引信息中保存的第一偏移量;
根据第一偏移量以及前一指针所指向的索引信息中保存的数据长度,计算在保存当前消息时,所对应的第二偏移量;
将运行状态信息类型、运行状态信息的消息长度、第二偏移量及键值KEY写入队尾指针所指向的索引信息中;
将队尾指针的指针数加1;
将键值KEY及运行状态信息写入循环缓存区中目标指针所指向的位置,目标指针为首地址与第二偏移量之和。
一个实施例中,从预先创建的共享内存消息队列中读取被采集对象的至少两种类型消息的运行状态信息,包括:
通过P操作在数据读写区中设置互斥锁;
从共享内存消息队列中读取队首指针;
将队首指针的指针数加1;
通过V操作在数据读写区中释放互斥锁;
从循环队列区中读取队首指针所指向的位置中的索引信息;
根据索引信息中的偏移量、数据类型、键值KEY及消息长度,在循环缓存区中读取指针数为首地址与偏移量之和的指针所指向的位置中的运行状态信息;
判断索引信息与报文中的键值KEY是否相等,若相等,将运行状态信息对应的报文发送给服务器。
一个实施例中,被采集对象为应用软件及操作系统的静态配置中的一种或多种组合。
第二方面,本发明提供一种基于共享内存的消息采集装置包括:
运行状态信息读取单元,从预先创建的共享内存消息队列中读取被采集对象的至少两种类型消息的运行状态信息;运行状态信息用于分析和监控被采集对象的运行状态信息;
报文发送单元,用于当任一种类型消息的运行状态信息的数据量达到预设阀值或对应报文的发送时间超过预设时间时,将运行状态信息对应的报文发送给服务器。
一个实施例中,消息采集装置还包括:共享内存消息队列建立单元,用于在共享内存中创建共享内存消息队列。
在一实施例中,共享内存消息队列包括循环队列区、循环缓存区及数据读写区;共享内存消息队列建立单元包括:
共享内存消息队列建立模块,用于在共享内存中创建循环队列区、循环缓存区及数据读写区;
索引信息写入模块,用于将运行状态信息的索引信息写入到循环队列区;
运行状态信息写入模块,用于将被采集对象的运行状态信息写入到循环缓存区,并根据运行状态信息将索引信息在循环队列区中进行分配;
其中,数据读写区用于标示索引信息在循环队列区中进行写入及读取的位置。
在一实施例中,索引信息包括:运行状态信息的数据类型、运行状态信息的消息长度、随机生成的键值KEY以及运行状态信息在循环缓存区中相对首地址的偏移量;运行状态信息写入单元包括:
运行状态信息类型解析模型,用于根据运行状态信息解析出运行状态信息的类型,并计算出消息长度;
偏移量读取模型,用于读取循环队列区中队尾指针的前一指针所指向的索引信息中保存的第一偏移量;
第二偏移量计算模型,用于根据第一偏移量以及前一指针所指向的索引信息中保存的数据长度,计算在保存当前消息时,所对应的第二偏移量;
键值KEY写入模型,用于将运行状态信息类型、运行状态信息的消息长度、第二偏移量及键值KEY写入队尾指针所指向的索引信息中;
队尾指针数设置模块,用于将队尾指针的指针数加1;
运行状态信息写入模块,用于将键值KEY及运行状态信息写入循环缓存区中目标指针所指向的位置,目标指针为首地址与第二偏移量之和。
在一实施例中,运行状态信息读取单元包括:
互斥锁设置模块,用于通过P操作在数据读写区中设置互斥锁;
队首指针读取模块,用于从共享内存消息队列中读取队首指针;
队首指针数设置模块,用于将队首指针的指针数加1;
互斥锁释放模块,用于通过V操作在数据读写区中释放互斥锁;
索引信息读取模块,用于从循环队列区中读取队首指针所指向的位置中的索引信息;
报文读取模块,用于根据索引信息中的偏移量、数据类型、键值KEY及消息长度,在循环缓存区中读取指针数为首地址与偏移量之和的指针所指向的位置中的运行状态信息;
报文发送模块,判断索引信息与报文中的键值KEY是否相等,若相等,将运行状态信息对应的报文发送给服务器。
第三方面,本发明提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行程序时,实现基于共享内存的消息采集方法的步骤。
第四方面,本发明提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现基于共享内存的消息采集方法的步骤。
从上述描述可知,本发明提供一种基于共享内存的消息采集方法及装置,通过设计共享内存消息队列,并将被采集对象的运行状态信息写入共享内存消息队列,共享内存消息队列根据运行状态信息动态地、循环地分配空间,与以往做法不同的是,本方法从共享内存消息队列中读取被采集对象的至少两种类型消息的用于分析和监控被采集对象的运行状态信息,并以饱和定时的方式,自动组装报文并进行发送,该种方式降低通讯服务的负担。并且在向共享内存消息队列读取被采集对象的运行状态信息的过程中,采用PV操作,避免写数据时被采集对象受到影响,保证了读取操作的正确性,优化该过程中的采集步骤,大大缩短了操作耗时,另外,在共享内存消息队列中读取被采集对象的运行状态信息的过程中,通过比较键值KEY参数,丢弃写入时极小概率产生的错误数据,从而保证了采集数据的正确性。由上,本发明能够建立一种可靠性、高效性的基于共享内存的消息采集方法及装置。
附图说明
图1为本发明的实施例中的基于共享内存的消息采集方法的流程示意图;
图2为本发明的基于共享内存的消息采集方法中步骤80的流程示意图;
图3为本发明的基于共享内存的消息采集方法中步骤90的流程示意图;
图4为本发明的实施例中的基于共享内存的消息采集方法中数据写入模型示意图;
图5为本发明的基于共享内存的消息采集方法中步骤100的流程示意图;
图6为本发明的具体实施方式中基于共享内存的数据采集的流程示意图;
图7为本发明的实施例中的基于共享内存的消息采集方法中共享内存消息队列模型示意图;
图8为本发明的实施例中的基于共享内存的消息采集方法中数据发送模型示意图;
图9为本发明的实施例中的基于共享内存的消息采集方法具体应用实例的流程示意图;
图10为本发明的实施例中的基于共享内存的数据采集装置的结构示意图;
图11本发明实施例中的电子设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的实施例提供一种基于共享内存的消息采集方法的具体实施方式,参见图1,基于共享内存的消息采集方法具体包括如下内容:
步骤100:从预先创建的共享内存消息队列中读取被采集对象的至少两种类型消息的运行状态信息;运行状态信息用于分析和监控被采集对象的运行状态信息。
在步骤100中,可以理解的是:运行状态信息用于分析和监控被采集对象的运行状态信息。并且不同于以往的做法,本方法从共享内存消息队列中采集两种或两种以上类型的消息的运行状态信息。
步骤200:当任一种类型消息的运行状态信息的数据量达到预设阀值或对应报文的发送时间超过预设时间时,将运行状态信息对应的报文发送给服务器。
可以理解的是,步骤200是为了降低通讯服务负担,减少报文数量,而采用的一种“饱和定时”的报文发送模式,这里的报文(message)是指网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。这里的服务端用于汇总所有报文。
一实施例中,在步骤100之前,还包括步骤90:向共享内存消息队列写入被采集对象的至少两种类型消息的运行状态信息。
可以理解的是,被采集对象为应用软件及操作系统的静态配置中的一种或多种组合。该步骤是指被采集对象将至少两种类型的运行状态信息信息写入共享内存消息队列中。
一实施例中,在步骤90之前,还包括步骤80:在共享内存中创建共享内存消息队列。
可以理解的是,共享内存(shared memory)指在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。而消息队列是指在消息的传输过程中保存消息的容器。
一实施例中,参见图2,步骤80包括:
步骤801:在共享内存中创建循环队列区、循环缓存区及数据读写区。
可以理解的是,共享内存消息队列由循环队列区、循环缓存区及数据读写区组成。数据读写区用于标示索引信息在循环队列区中进行写入及读取的位置。
步骤802:将运行状态信息的索引信息写入到循环队列区。
步骤802中的索引信息包括:运行状态信息的数据类型、运行状态信息的消息长度、随机生成的键值KEY以及运行状态信息在循环缓存区中相对首地址的偏移量。
步骤803:将被采集对象的运行状态信息写入到循环缓存区,并根据运行状态信息将索引信息在循环队列区中进行分配。
可以理解的是,在步骤801-步骤802中,循环队列区主要用于记录写入数据的索引信息,循环缓存区主要用于记录具体的运行状态信息信息,并根据运行状态信息的内容将索引信息在循环队列区中进行有序地、循环地分配;数据读写区主要用于指引进程的数据写入或读取位置。
在一种具体实施方式中,本发明还提供基于共享内存的消息采集方法中的步骤90的具体实施方式,参见图3及图4。步骤90具体包括如下内容:
步骤901:根据运行状态信息解析出运行状态信息的类型,并计算出消息长度。
步骤902:读取循环队列区中队尾指针的前一指针所指向的索引信息中所保存的偏移量。
在一实施例中,在步骤902之前还包括:步骤:从共享内存的数据读写结构中获取队尾指针。步骤902中的偏移量指的是数据读写区的偏移量,可以理解的是,数据读写区首地址加上写偏移量就是新写入数据的开始。
在一实施例中,在从共享内存的数据读写结构中获取队尾指针之前还包括:由随机函数生成键值KEY。可以理解的是,该键值KEY用于检查消息的正确性。
步骤903:根据队尾指针的前一指针所指向的索引信息中所保存的偏移量以及前一指针所指向的索引信息中保存的数据长度,计算在保存当前消息时,所对应的第二偏移量。
步骤903具体为:根据读取的前一指针所指向的索引信息保存的偏移量off和前一指针所指向的索引信息中保存的数据长度len,计算出当前新消息在保存时应该使用的第二偏移量offset,计算方法为:offset=off+len。
步骤904:将运行状态信息类型、运行状态信息的消息长度、第二偏移量及键值KEY写入队尾指针所指向的索引信息中,其中第二偏移量为在保存当前消息时,所对应的偏移量。
步骤905:将队尾指针的指针数加1。
在具体实施时,将队尾指针指向循环队列区中原队尾指针的下一个位置。可以理解的是该步骤是为了共享内存消息队列的下一次循环操作做准备。
步骤906:将键值KEY及运行状态信息写入循环缓存区中目标指针所指向的位置,目标指针为首地址与第二偏移量之和,其中第二偏移量为在保存当前消息时,所对应的偏移量。
可以理解的是,目标指针所对应的数字为首地址与第二偏移量之和,例如:首地址为5,第二偏移量为7,则目标指针为12,则步骤906为将键值KEY及运行状态信息写入循环缓存区中目标指针12所指向的位置。
在步骤90中,为避免写数据时对被采集对象的影响,本步骤未采用PV操作来控制队尾指针和写偏移量的同步操作,另外由于写入数据的大小不同使得长度计算和存储消耗时间也不同,将步骤901:根据运行状态信息解析出运行状态信息的类型,并计算出消息长度以及由随机函数生成键值KEY设置于步骤902之前,以缩短读取队尾指针到队尾指针增加前的操作耗时。此外,通过增加键值KEY可以在读取数据时对数据进行校验,避免并发情况下不同的进程在数据写入时发生错误;需要注意的是,采用队尾指针加1,而非自增的方式,是为了避免并发情况下循环队列写跳跃情况的发生,例如,两个进程并发时读取的对位指针均相同,索引信息均写到循环队列的队尾指针位置,如果队尾指针自增,则下一个进程将跳过队尾指针加1位置直接从队尾指针加2的位置写入索引。
在一种具体实施方式中,本发明还提供基于共享内存的消息采集方法中的步骤100的具体实施方式,参见图5,步骤100具体包括如下内容:
步骤101:通过P操作在数据读写区中设置互斥锁。
可以理解的是,步骤101中P表示通过的,V表示释放。步骤101中的互斥锁的作用是,在多线程程序中,多个线程可能会共用同一个对象,为了防止多个线程在争夺、使用同一份对象时可能会对该对象造成的改变,故引入互斥锁。互斥锁可保证在任一时刻,只能有一个线程访问该对象,从而保证共享数据操作的完整性。
步骤102:从共享内存消息队列中读取队首指针。
步骤103:将队首指针的指针数加1。
在具体实施时,将队首指针指向循环队列区中原队首指针的下一个位置。可以理解的是该步骤是为了共享内存消息队列的下一次循环操作做准备。
步骤104:通过V操作在数据读写区中释放互斥锁。
为保证读的并发性,本方法在对队首指针进行操作时,增加了PV操作。在一种具体实施例中。
步骤105:从循环队列区中读取队首指针所指向的位置中的索引信息。
步骤106:根据索引信息中的偏移量、数据类型、键值KEY及消息长度,在循环缓存区中读取指针数为首地址与偏移量之和的指针所指向的位置中的运行状态信息。
步骤107:判断索引信息与报文中的键值KEY是否相等,若相等,将运行状态信息对应的报文发送给服务器。
可以理解的是,通过对比循环队列区和循环缓存区中存储的键值KEY以确保数据是否正确。在步骤107中,如果断索引信息与报文中的键值KEY不相等,则放弃本条数据。
从上述描述可知,本发明提供一种基于共享内存的消息采集方法,通过设计共享内存消息队列,并将被采集对象的运行状态信息写入共享内存消息队列,共享内存消息队列根据运行状态信息动态地、循环地分配空间,与以往做法不同的是,本方法从共享内存消息队列中读取被采集对象的至少两种类型消息的用于分析和监控被采集对象的运行状态信息,并以饱和定时的方式,自动组装报文并进行发送,该种方式降低通讯服务的负担。并且在向共享内存消息队列读取被采集对象的运行状态信息的过程中,采用PV操作,避免写数据时被采集对象受到影响,保证了读取操作的正确性,优化该过程中的采集步骤,大大缩短了操作耗时,另外,在共享内存消息队列中读取被采集对象的运行状态信息的过程中,通过比较键值KEY参数,丢弃写入时极小概率产生的错误数据,从而保证了采集数据的正确性。由上,本发明能够建立一种可靠性、高效性的基于共享内存的消息采集方法及装置。
在一种具体实施方式中,本发明还提供基于共享内存的消息采集方法中的具体实施方式,参见图6。
步骤501:在共享内存中创建循环队列区、循环缓存区及数据读写区。
步骤501中循环队列区主要用于记录写入数据的索引信息,循环缓存区主要用于记录具体的运行状态信息信息,并根据运行状态信息的内容将索引信息在循环队列区中进行有序地、循环地分配;数据读写区主要用于指引进程的数据写入或读取位置。消息长度根据消息类别和被监控对象的类别不同而不同,因此为保证通用性和内存使用率,设置如图7所示的共享内存消息队列模型。
步骤502:将运行状态信息的索引信息写入到循环队列区。
步骤502中的索引信息包括:运行状态信息的数据类型、运行状态信息的消息长度、随机生成的键值KEY以及运行状态信息在循环缓存区中相对首地址的偏移量。
步骤503:将被采集对象的运行状态信息写入到循环缓存区,并根据运行状态信息将运行状态信息在循环队列区中进行分配。
可以理解的是,共享内存消息队列根据运行状态信息内容动态、循环分配空间。
步骤504:根据运行状态信息解析出运行状态信息的类型,并计算出消息长度。
步骤505:由随机函数生成键值KEY。
需要注意的是,由于写入数据的大小不同使得长度计算和存储消耗时间也不同,步骤504及步骤505需位于步骤506之前。
步骤506:从共享内存的数据读写结构中获取队尾指针。
步骤507:读取循环队列区中队尾指针的前一指针所指向的索引信息中保存的偏移量。
步骤508:根据前一指针所指向的索引信息中保存的偏移量以及前一指针所指向的索引信息中保存的数据长度,计算在保存当前消息时,所对应的偏移量。
步骤509:将运行状态信息类型、运行状态信息的消息长度、第二偏移量及键值KEY写入队尾指针所指向的索引信息中,其中,第二偏移量为在保存当前消息时,所对应的偏移量。
可以理解的是,将步骤511置于步骤509之后,可以缩短读取队尾指针到队尾指针增加前的操作耗时。
步骤510:将共享内存消息队列中队尾指针加1。
步骤510中采用队尾指针加1,而非自增的方式,可以避免并发情况下循环队列写跳跃情况的发生。
步骤511:将键值KEY及运行状态信息写入循环缓存区中目标指针所指向的位置,目标指针为首地址与第二偏移量之和,其中第二偏移量为在保存当前消息时,所对应的偏移量。
可以理解的是,目标指针所对应的数字为首地址与第二偏移量之和。
通过增加键值KEY可以在读取数据时对数据进行校验,避免并发情况下不同的进程在数据写入时发生错误。
步骤512:通过P操作在数据读写区中设置互斥锁。
为了保证读数据时的并发性,在对队首指针进行操作时,增加了PV操作。
步骤513:从共享内存消息队列中读取队首指针。
步骤514:将共享内存消息队列中队首指针加1。
步骤515:通过V操作在数据读写区中释放互斥锁。
可以理解的是,步骤514中的V操作为释放操作。
步骤516:从循环队列区中读取队首指针所指向的位置中的索引信息。
步骤517:根据索引信息中的偏移量、数据类型、键值KEY及消息长度,在循环缓存区中读取指针数为首地址与偏移量之和的指针所指向的位置中的运行状态信息。
在步骤517中,根据索引信息中的偏移量读取队首下标及信息长度,并从循环缓存区中读取指针数为首地址与队首指针之和的指针所指向的位置中的数据块。
步骤518:判断索引信息与报文中的键值KEY是否相等,若相等,将运行状态信息对应的报文发送给服务器。
参见图8,步骤518的具体实施方式如下:当任一种类型消息的运行状态信息的数据量达到预设阀值或对应报文的发送时间超过预设时间时,并判断索引信息与报文中的键值KEY是否相等,若相等,将运行状态信息对应的报文发送给服务器。
可以理解的是,为了降低通讯服务的负担,需减少报文数量,模型需采用饱和定时发送模式,即当运行状态信息信息量达到预设阀值时,或者未到达阀值但超过预设超时时间时,则自动组装报文发送。
可以理解的在消息队列中,某类型的数据不能保证连续存在,采集主控无法从消息队列中批量的取出同一类型的数据,只能依次处理。因此为了实现饱和发送模式,在此模型下,需要由任务处理模块对采集到的数据进行缓存。消息队列采集主控为实时服务,而各任务模块以动态库形式存在。由消息队列采集主控对已接收到的数据进行计时,由各模块通过静态变量缓存数据,对已接收到的数据进行计数。消息队列采集主控不释放的打开各模块的动态库,保证进程空间内的静态变量不被回收,当定时到达时,通知模块进行超时发送;当各模块缓存的数据量到达阀值时,自行组装报文发送,然后通知消息队列采集主控已进行饱和发送。每当完成数据发送后,消息队列采集主控关闭动态库,直到下次抽取到该模块对应的信息时重新打开动态库。此模式下,不同消息队列采集主控如果抽取到相同类别的信息时,也将打开不同的模块副本,各自进行饱和定时发送。
从上述描述可知,本发明提供一种基于共享内存的消息采集方法,通过设计共享内存消息队列,并将被采集对象的运行状态信息写入共享内存消息队列,共享内存消息队列根据运行状态信息动态地、循环地分配空间,与以往做法不同的是,本方法从共享内存消息队列中读取被采集对象的至少两种类型消息的用于分析和监控被采集对象的运行状态信息,并以饱和定时的方式,自动组装报文并进行发送,该种方式降低通讯服务的负担。并且在向共享内存消息队列读取被采集对象的运行状态信息的过程中,采用PV操作,避免写数据时被采集对象受到影响,保证了读取操作的正确性,优化该过程中的采集步骤,大大缩短了操作耗时,另外,在共享内存消息队列中读取被采集对象的运行状态信息的过程中,通过比较键值KEY参数,丢弃写入时极小概率产生的错误数据,从而保证了采集数据的正确性。由上,本发明能够建立一种可靠性、高效性的基于共享内存的消息采集方法及装置。
为进一步地说明本方案,本发明以基于共享内存的消息采集方法中共享内存消息队列中的单次消息采集为例,提供基于共享内存的消息采集方法的具体应用实例,该具体应用实例具体包括如下内容,参见图9、图4、图7及图8。
S1:被采集对象调用写数据接口写入一条消息类型A的数据a1。
可以理解的是,S1实施前应当清空当前共享内存消息队列中数据。
S2:两个被采集对象各自向共享内存消息队列写入数据,分别是数据类型为B的数据b1及数据类型为A的数据a2。
可以理解的是,被采集对象为应用软件及操作系统的静态配置中的一种或多种组合,例如通讯软件。
S3:两个被采集对象各自写入数据,分别为消息类型为A的数据a3及消息类型为B的数据b2。
在步骤S3中,由于一个被采集对象在获取了索引信息后还未执行队尾指针+1的操作,另一个被采集对象获取了同样的索引信息,故本次数据写入发生了写覆盖,即索引区是A类型数据a3的信息,但数据区实际存储的是B类型的数据b2,即本次写入数据发生异常。
S4:设置饱和定时发送方式:消息类型A的发送配置为饱和值2,超时时间10秒,消息类型B的配置为饱和值5,超时时间30秒。
可以理解的是,当消息类型A的数据量达到2,或消息类型A对应报文的发送时间超过10秒时,将消息类型A的运行状态信息所对应的报文发送给服务器,同样的,当消息类型B的数据量达到5,或消息类型B对应报文的发送时间超过30秒时,将消息类型B的运行状态信息所对应的报文发送给服务器。
S5:在时间T秒时,调用读数据接口从共享内存消息队列中首先读取了数据a1,在校验通过之后,将该数据分发给负责处理A类型数据的任务处理模块α,由模块α进行缓存,计数为1,并开始计时。
S5中校验的方法是:检查索引信息与报文中的键值KEY是否相等,如果相等则说明数据正确,如果不相等,否则放弃本条数据;
S6:在时间T+2秒时,从共享内存消息队列中读取了数据b1,在校验通过之后,分发给负责处理B类型数据的任务处理模块β,由模块β进行缓存,计数为1,并开始计时。
S7:在时间T+5秒时,从共享内存消息队列中读取了数据a2,校验通过后交由模块α缓存,计数增加至2。此时达到A类型数据的饱和值,模块α组装报文向服务端发送数据a1,a2,并将缓存清空,并重新计时。
S8:在时间T+7秒时,从共享内存消息队列中读取了索引信息中对应消息类型为A的数据b2,并进行校验。
在步骤S8中,校验时发现数据b2键值Key值与索引信息的键值Key值不同,没有通过校验,因此丢弃数据b2;
S9:在时间T+32秒时,发现缓存的B类型数据(即数据b1)到达超时阈值,由模块β组装报文发送向服务端发送数据b1,并清空缓存和计时。
S9步骤中的清空缓存是指清空A类型在模块α所属进程空间中的已经缓存的所有数据。
从上述描述可知,本发明提供一种基于共享内存的消息采集方法,通过设计共享内存消息队列,并将被采集对象的运行状态信息写入共享内存消息队列,共享内存消息队列根据运行状态信息动态地、循环地分配空间,与以往做法不同的是,本方法从共享内存消息队列中读取被采集对象的至少两种类型消息的用于分析和监控被采集对象的运行状态信息,并以饱和定时的方式,自动组装报文并进行发送,该种方式降低通讯服务的负担。并且在向共享内存消息队列读取被采集对象的运行状态信息的过程中,采用PV操作,避免写数据时被采集对象受到影响,保证了读取操作的正确性,优化该过程中的采集步骤,大大缩短了操作耗时,另外,在共享内存消息队列中读取被采集对象的运行状态信息的过程中,通过比较键值KEY参数,丢弃写入时极小概率产生的错误数据,从而保证了采集数据的正确性。由上,本发明能够建立一种可靠性、高效性的基于共享内存的消息采集方法及装置。
基于同一发明构思,本申请实施例还提供了一种基于共享内存的消息采集装置,可以用于实现上述实施例所描述的方法,如下面的实施例。由于基于共享内存的消息采集装置解决问题的原理与基于共享内存的消息采集方法相似,因此基于共享内存的消息采集装置的实施可以参见基于共享内存的消息采集方法的实施,重复之处不再赘述。以下所使用的,术语“单元”或者“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的系统较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
本发明的实施例提供一种能够实现基于共享内存的消息采集方法的基于共享内存的消息采集装置的具体实施方式,参见图10,基于共享内存的消息采集装置具体包括如下内容:
运行状态信息读取单元10,用于从预先创建的共享内存消息队列中读取被采集对象的至少两种类型消息的运行状态信息;运行状态信息用于分析和监控被采集对象的运行状态信息。
报文发送单元20,用于当任一种类型消息的运行状态信息的数据量达到预设阀值或对应报文的发送时间超过预设时间时,将运行状态信息对应的报文发送给服务器。
一个实施例中,消息采集装置还包括:运行状态信息写入单元,用于向共享内存消息队列写入被采集对象的至少两种类型消息的运行状态信息。
在一实施例中,消息采集装置还包括:共享内存消息队列建立单元,用于在共享内存中创建共享内存消息队列。
在一实施例中,共享内存消息队列包括循环队列区、循环缓存区及数据读写区;共享内存消息队列建立单元包括:
共享内存消息队列建立模块,用于在共享内存中创建循环队列区、循环缓存区及数据读写区;
索引信息写入模块,用于将运行状态信息的索引信息写入到循环队列区;
运行状态信息写入模块,用于将被采集对象的运行状态信息写入到循环缓存区,并根据运行状态信息将运行状态信息在循环队列区中进行分配;
其中,数据读写区用于标示索引信息在循环队列区中进行写入及读取的位置。
在一实施例中,索引信息包括:运行状态信息类型、运行状态信息的消息长度以及运行状态信息在循环缓存区中相对首地址的偏移量;运行状态信息写入单元包括:
运行状态信息类型解析模型,用于根据运行状态信息解析出运行状态信息的类型,并计算出消息长度;
偏移量读取模型,用于读取循环队列区中队尾指针的前一指针所指向的索引信息中保存的偏移量;
键值KEY写入模型,用于将运行状态信息类型、运行状态信息的消息长度、偏移量及随机生成的键值KEY写入前一指针所指向的索引信息的位置中;
运行状态信息写入模块,用于将键值KEY及运行状态信息写入循环缓存区中目标指针所指向的位置,目标指针为首地址与偏移量之和。
在一实施例中,运行状态信息读取单元包括:
互斥锁设置模块,用于通过P操作在数据读写区中设置互斥锁;
队首指针读取模块,用于从共享内存消息队列中读取队首指针;
互斥锁释放模块,用于通过V操作在数据读写区中释放互斥锁;
索引信息读取模块,用于从循环队列区中读取队首指针所指向的位置中的索引信息;
报文读取模块,用于根据索引信息中的偏移量、队首指针及消息长度,在循环缓存区中读取指针数为首地址与队首指针之和的指针所指向的位置中的报文;
报文发送模块,用于判断索引信息与报文中的键值KEY是否相等,若相等,将运行状态信息对应的报文发送给服务器。
本申请的实施例还提供能够实现上述实施例中的基于共享内存的消息采集方法中全部步骤的一种电子设备的具体实施方式,参见图11,电子设备具体包括如下内容:
处理器(processor)601、存储器(memory)602、通信接口(CommunicationsInterface)603和总线604;其中,处理器601、存储器602、通信接口603通过总线604完成相互间的通信。
处理器601用于调用存储器602中的计算机程序,处理器执行计算机程序时实现上述实施例中的基于共享内存的消息采集方法中的全部步骤,例如,处理器执行计算机程序时实现下述步骤:
步骤501:在共享内存中创建循环队列区、循环缓存区及数据读写区。
步骤502:将运行状态信息的索引信息写入到循环队列区。
步骤503:将被采集对象的运行状态信息写入到循环缓存区,并根据运行状态信息将运行状态信息在循环队列区中进行分配。
步骤504:根据运行状态信息解析出运行状态信息的类型,并计算出消息长度。
步骤505:由随机函数生成键值KEY。
步骤506:从共享内存的数据读写结构中获取队尾指针。
步骤507:读取循环队列区中队尾指针的前一指针所指向的索引信息中保存的偏移量。
步骤508:根据前一指针所指向的索引信息中保存的偏移量以及前一指针所指向的索引信息中保存的数据长度,计算在保存当前消息时,所对应的偏移量。
步骤509:将运行状态信息类型、运行状态信息的消息长度、第二偏移量及键值KEY写入队尾指针所指向的索引信息中,其中,第二偏移量为在保存当前消息时,所对应的偏移量。
步骤510:将共享内存消息队列中队尾指针加1。
步骤511:将键值KEY及运行状态信息写入循环缓存区中目标指针所指向的位置,目标指针为首地址与第二偏移量之和,其中第二偏移量为在保存当前消息时,所对应的偏移量。
步骤512:通过P操作在数据读写区中设置互斥锁。
步骤513:从共享内存消息队列中读取队首指针。
步骤514:将共享内存消息队列中队首指针加1。
步骤515:通过V操作在数据读写区中释放互斥锁。
步骤516:从循环队列区中读取队首指针所指向的位置中的索引信息。
步骤517:根据索引信息中的偏移量、数据类型、键值KEY及消息长度,在循环缓存区中读取指针数为首地址与偏移量之和的指针所指向的位置中的运行状态信息。
步骤518:判断索引信息与报文中的键值KEY是否相等,若相等,将运行状态信息对应的报文发送给服务器。
从上述描述可知,本申请实施例中的电子设备,通过设计共享内存消息队列,并将被采集对象的运行状态信息写入共享内存消息队列,共享内存消息队列根据运行状态信息动态地、循环地分配空间,与以往做法不同的是,本方法从共享内存消息队列中读取被采集对象的至少两种类型消息的用于分析和监控被采集对象的运行状态信息,并以饱和定时的方式,自动组装报文并进行发送,该种方式降低通讯服务的负担。并且在向共享内存消息队列读取被采集对象的运行状态信息的过程中,采用PV操作,避免写数据时被采集对象受到影响,保证了读取操作的正确性,优化该过程中的采集步骤,大大缩短了操作耗时,另外,在共享内存消息队列中读取被采集对象的运行状态信息的过程中,通过比较键值KEY参数,丢弃写入时极小概率产生的错误数据,从而保证了采集数据的正确性。由上,本发明能够建立一种可靠性、高效性的基于共享内存的消息采集方法及装置。
本申请的实施例还提供能够实现上述实施例中的基于共享内存的消息采集方法中全部步骤的一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述实施例中的基于共享内存的消息采集方法的全部步骤,例如,处理器执行计算机程序时实现下述步骤:
步骤501:在共享内存中创建循环队列区、循环缓存区及数据读写区。
步骤502:将运行状态信息的索引信息写入到循环队列区。
步骤503:将被采集对象的运行状态信息写入到循环缓存区,并根据运行状态信息将运行状态信息在循环队列区中进行分配。
步骤504:根据运行状态信息解析出运行状态信息的类型,并计算出消息长度。
步骤505:由随机函数生成键值KEY。
步骤506:从共享内存的数据读写结构中获取队尾指针。
步骤507:读取循环队列区中队尾指针的前一指针所指向的索引信息中保存的偏移量。
步骤508:根据前一指针所指向的索引信息中保存的偏移量以及前一指针所指向的索引信息中保存的数据长度,计算在保存当前消息时,所对应的偏移量。
步骤509:将运行状态信息类型、运行状态信息的消息长度、第二偏移量及键值KEY写入队尾指针所指向的索引信息中,其中,第二偏移量为在保存当前消息时,所对应的偏移量。
步骤510:将共享内存消息队列中队尾指针加1。
步骤511:将键值KEY及运行状态信息写入循环缓存区中目标指针所指向的位置,目标指针为首地址与第二偏移量之和,其中第二偏移量为在保存当前消息时,所对应的偏移量。
步骤512:通过P操作在数据读写区中设置互斥锁。
步骤513:从共享内存消息队列中读取队首指针。
步骤514:将共享内存消息队列中队首指针加1。
步骤515:通过V操作在数据读写区中释放互斥锁。
步骤516:从循环队列区中读取队首指针所指向的位置中的索引信息。
步骤517:根据索引信息中的偏移量、数据类型、键值KEY及消息长度,在循环缓存区中读取指针数为首地址与偏移量之和的指针所指向的位置中的运行状态信息。
步骤518:判断索引信息与报文中的键值KEY是否相等,若相等,将运行状态信息对应的报文发送给服务器。
从上述描述可知,本发明提供的计算机可读存储介质,通过设计共享内存消息队列,并将被采集对象的运行状态信息写入共享内存消息队列,共享内存消息队列根据运行状态信息动态地、循环地分配空间,与以往做法不同的是,本方法从共享内存消息队列中读取被采集对象的至少两种类型消息的用于分析和监控被采集对象的运行状态信息,并以饱和定时的方式,自动组装报文并进行发送,该种方式降低通讯服务的负担。并且在向共享内存消息队列读取被采集对象的运行状态信息的过程中,采用PV操作,避免写数据时被采集对象受到影响,保证了读取操作的正确性,优化该过程中的采集步骤,大大缩短了操作耗时,另外,在共享内存消息队列中读取被采集对象的运行状态信息的过程中,通过比较键值KEY参数,丢弃写入时极小概率产生的错误数据,从而保证了采集数据的正确性。由上,本发明能够建立一种可靠性、高效性的基于共享内存的消息采集方法及装置。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于硬件+程序类实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
虽然本申请提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或客户端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境)。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、车载人机交互设备、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
虽然本说明书实施例提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的手段可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或终端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境,甚至为分布式数据处理环境)。术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、产品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、产品或者设备所固有的要素。在没有更多限制的情况下,并不排除在包括所述要素的过程、方法、产品或者设备中还存在另外的相同或等同要素。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本说明书实施例时可以把各模块的功能在同一个或多个软件和/或硬件中实现,也可以将实现同一功能的模块由多个子模块或子单元的组合实现等。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内部包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
本领域技术人员应明白,本说明书的实施例可提供为方法、系统或计算机程序产品。因此,本说明书实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本说明书实施例的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
本发明中应用了具体实施例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (7)
1.一种基于共享内存的消息采集方法,其特征在于,该方法包括:
在共享内存中创建共享内存消息队列;
向所述共享内存消息队列写入被采集对象的至少两种类型消息的运行状态信息;
从预先创建的共享内存消息队列中读取被采集对象的至少两种类型消息的运行状态信息;
当任一种类型消息的所述运行状态信息的数据量达到预设阀值或对应报文的发送时间超过预设时间时,将所述运行状态信息对应的报文发送给服务器;
所述共享内存消息队列包括循环队列区、循环缓存区及数据读写区;所述在共享内存中创建共享内存消息队列,包括:
在所述共享内存中创建所述循环队列区、循环缓存区及数据读写区;
将所述运行状态信息的索引信息写入到所述循环队列区;
将所述被采集对象的运行状态信息写入到所述循环缓存区,并根据所述运行状态信息将所述索引信息在所述循环队列区中进行分配;
其中,所述数据读写区用于标示所述索引信息在所述循环队列区中进行写入及读取的位置;
所述索引信息包括:所述运行状态信息的数据类型、所述运行状态信息的消息长度、随机生成的键值KEY以及所述运行状态信息在所述循环缓存区中相对首地址的偏移量;向所述共享内存消息队列写入被采集对象的至少两种类型消息的运行状态信息,包括:
根据所述运行状态信息解析出所述运行状态信息的数据类型,并计算出所述消息长度;
读取所述循环队列区中队尾指针的前一指针所指向的索引信息中保存的第一偏移量;
根据第一偏移量以及所述前一指针所指向的索引信息中保存的消息长度,计算在保存当前消息时,所对应的第二偏移量;
将所述运行状态信息的数据类型、所述运行状态信息的消息长度、所述第二偏移量及所述键值KEY写入所述队尾指针所指向的索引信息中;
将所述队尾指针的指针数加1;
将所述键值KEY及所述运行状态信息写入所述循环缓存区中目标指针所指向的位置,所述目标指针为首地址与所述第二偏移量之和。
2.根据权利要求1所述消息采集方法,其特征在于,所述从预先创建的共享内存消息队列中读取被采集对象的至少两种类型消息的运行状态信息,包括:
通过P操作在所述数据读写区中设置互斥锁;
从所述共享内存消息队列中读取队首指针;
将所述队首指针的指针数加1;
通过V操作在所述数据读写区中释放所述互斥锁;
从所述循环队列区中读取所述队首指针所指向的位置中的所述索引信息;
根据所述索引信息中的所述运行状态信息在所述循环缓存区中相对首地址的偏移量、数据类型、所述键值KEY及所述消息长度,在所述循环缓存区中读取指针数为所述首地址与所述运行状态信息在所述循环缓存区中相对首地址的偏移量之和的指针所指向的位置中的所述运行状态信息;
判断所述索引信息与所述报文中的所述键值KEY是否相等,若相等,将所述运行状态信息对应的所述报文发送给服务器。
3.根据权利要求1所述消息采集方法,其特征在于,所述被采集对象为应用软件及操作系统的静态配置中的一种或多种组合。
4.一种基于共享内存的消息采集装置,其特征在于,包括:
共享内存消息队列建立单元,用于在共享内存中创建共享内存消息队列;
运行状态信息写入单元,用于向所述共享内存消息队列写入被采集对象的至少两种类型消息的运行状态信息;
运行状态信息读取单元,从预先创建的共享内存消息队列中读取被采集对象的至少两种类型消息的运行状态信息;
报文发送单元,用于当任一种类型消息的所述运行状态信息的数据量达到预设阀值或对应报文的发送时间超过预设时间时,将所述运行状态信息对应的报文发送给服务器;
所述共享内存消息队列包括循环队列区、循环缓存区及数据读写区;所述共享内存消息队列建立单元包括:
共享内存消息队列建立模块,用于在所述共享内存中创建所述循环队列区、循环缓存区及数据读写区;
索引信息写入模块,用于将所述运行状态信息的索引信息写入到所述循环队列区;
运行状态信息写入模块,用于将所述被采集对象的运行状态信息写入到所述循环缓存区,并根据所述运行状态信息将所述索引信息在所述循环队列区中进行分配;
其中,所述数据读写区用于标示所述索引信息在所述循环队列区中进行写入及读取的位置;
所述索引信息包括:所述运行状态信息的数据类型、所述运行状态信息的消息长度、随机生成的键值KEY以及所述运行状态信息在所述循环缓存区中相对首地址的偏移量;所述运行状态信息写入单元包括:
运行状态信息类型解析模型,用于根据所述运行状态信息解析出所述运行状态信息的数据类型,并计算出所述消息长度;
偏移量读取模型,用于读取所述循环队列区中队尾指针的前一指针所指向的索引信息中保存的第一偏移量;
第二偏移量计算模型,用于根据第一偏移量以及所述前一指针所指向的索引信息中保存的消息长度,计算在保存当前消息时,所对应的第二偏移量;
键值KEY写入模型,用于将所述运行状态信息的数据类型、所述运行状态信息的消息长度、所述第二偏移量及所述键值KEY写入所述队尾指针所指向的索引信息中;
队尾指针数设置模块,用于将所述队尾指针的指针数加1;
运行状态信息写入模块,用于将所述键值KEY及所述运行状态信息写入所述循环缓存区中目标指针所指向的位置,所述目标指针为首地址与所述第二偏移量之和。
5.如权利要求4所述的消息采集装置,其特征在于,所述运行状态信息读取单元包括:
互斥锁设置模块,用于通过P操作在所述数据读写区中设置互斥锁;
队首指针读取模块,用于从所述共享内存消息队列中读取队首指针;
队首指针数设置模块,用于将所述队首指针的指针数加1;
互斥锁释放模块,用于通过V操作在所述数据读写区中释放所述互斥锁;
索引信息读取模块,用于从所述循环队列区中读取所述队首指针所指向的位置中的所述索引信息;
报文读取模块,用于根据所述索引信息中的所述运行状态信息在所述循环缓存区中相对首地址的偏移量、数据类型、所述键值KEY及所述消息长度,在所述循环缓存区中读取指针数为所述首地址与所述运行状态信息在所述循环缓存区中相对首地址的偏移量之和的指针所指向的位置中的所述运行状态信息;
报文发送模块,判断所述索引信息与所述报文中的所述键值KEY是否相等,若相等,将所述运行状态信息对应的所述报文发送给服务器。
6.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时,实现权利要求1至3任一项所述基于共享内存的消息采集方法的步骤。
7.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现权利要求1至3任一项所述基于共享内存的消息采集方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910232506.8A CN110018914B (zh) | 2019-03-26 | 2019-03-26 | 基于共享内存的消息采集方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910232506.8A CN110018914B (zh) | 2019-03-26 | 2019-03-26 | 基于共享内存的消息采集方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110018914A CN110018914A (zh) | 2019-07-16 |
CN110018914B true CN110018914B (zh) | 2021-08-13 |
Family
ID=67190002
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910232506.8A Active CN110018914B (zh) | 2019-03-26 | 2019-03-26 | 基于共享内存的消息采集方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110018914B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111444146B (zh) * | 2020-03-27 | 2023-05-16 | 中核武汉核电运行技术股份有限公司 | 一种核电机组dcs数据采集与存储方法 |
CN112114982B (zh) * | 2020-09-09 | 2022-03-08 | 天津津航计算技术研究所 | 基于VxWorks系统的多任务间共享内存的管理方法 |
CN112631811A (zh) * | 2020-12-30 | 2021-04-09 | 中国农业银行股份有限公司 | 一种数据处理方法及装置 |
CN113835710A (zh) * | 2021-09-14 | 2021-12-24 | 许昌许继软件技术有限公司 | 集中式站所终端接入线损采集模块的数据处理方法及装置 |
CN115269392B (zh) * | 2022-07-20 | 2023-11-14 | 北京斯年智驾科技有限公司 | 一种用于融合感知的可视化调试方法、设备、介质 |
CN116089130A (zh) * | 2023-04-06 | 2023-05-09 | 西安热工研究院有限公司 | 一种数据管道的存储结构、工作方法、设备及储存介质 |
CN116662039B (zh) * | 2023-07-25 | 2024-01-23 | 菲特(天津)检测技术有限公司 | 基于共享内存的工业信息并行检测方法、装置及介质 |
CN116881026B (zh) * | 2023-09-06 | 2023-11-21 | 成都谐盈科技有限公司 | 一种基于corba中间件的共享内存传输系统及方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1842056A (zh) * | 2005-03-31 | 2006-10-04 | 华为技术有限公司 | 内核间报文描述消息的传递方法 |
CN103514261A (zh) * | 2013-08-13 | 2014-01-15 | 江苏华大天益电力科技有限公司 | 一种应用于工业控制系统的数据异步存储及访问机制 |
CN108268208A (zh) * | 2016-12-30 | 2018-07-10 | 清华大学 | 一种基于rdma的分布式内存文件系统 |
CN108897607A (zh) * | 2018-06-05 | 2018-11-27 | 中国平安人寿保险股份有限公司 | 消息处理方法、装置、电子设备及存储介质 |
CN109428682A (zh) * | 2017-08-23 | 2019-03-05 | 北京国双科技有限公司 | 一种消息处理确认方法及装置 |
-
2019
- 2019-03-26 CN CN201910232506.8A patent/CN110018914B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1842056A (zh) * | 2005-03-31 | 2006-10-04 | 华为技术有限公司 | 内核间报文描述消息的传递方法 |
CN103514261A (zh) * | 2013-08-13 | 2014-01-15 | 江苏华大天益电力科技有限公司 | 一种应用于工业控制系统的数据异步存储及访问机制 |
CN108268208A (zh) * | 2016-12-30 | 2018-07-10 | 清华大学 | 一种基于rdma的分布式内存文件系统 |
CN109428682A (zh) * | 2017-08-23 | 2019-03-05 | 北京国双科技有限公司 | 一种消息处理确认方法及装置 |
CN108897607A (zh) * | 2018-06-05 | 2018-11-27 | 中国平安人寿保险股份有限公司 | 消息处理方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN110018914A (zh) | 2019-07-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110018914B (zh) | 基于共享内存的消息采集方法及装置 | |
US10474471B2 (en) | Methods and systems for performing a replay execution | |
US9274798B2 (en) | Multi-threaded logging | |
US11030076B2 (en) | Debugging method | |
US20120102470A1 (en) | Methods, Systems, and Media for Providing Determinism in Multithreaded Programs | |
CN110231995B (zh) | 一种基于Actor模型的任务调度方法、装置及存储介质 | |
US9552221B1 (en) | Monitoring application execution using probe and profiling modules to collect timing and dependency information | |
US10504492B2 (en) | Apparatus and methods for generating dynamic trace data on a GPU | |
CN113127314A (zh) | 一种检测程序性能瓶颈的方法、装置及计算机设备 | |
CN109542341B (zh) | 一种读写io监测方法、装置、终端及计算机可读存储介质 | |
CN103729166A (zh) | 程序的线程关系确定方法、设备及系统 | |
US20120059997A1 (en) | Apparatus and method for detecting data race | |
CN113190427A (zh) | 卡顿监控方法、装置、电子设备及存储介质 | |
US10198784B2 (en) | Capturing commands in a multi-engine graphics processing unit | |
CN113220495B (zh) | 一种进程异常事件处理方法、装置、电子设备及存储介质 | |
CN108197005B (zh) | Ios应用的底层运行性能监测方法、介质、设备及系统 | |
US11604720B2 (en) | Identifying data inconsistencies and data contention based on historic debugging traces | |
CN115599304A (zh) | 应用于存储节点的数据处理方法、装置、设备及存储介质 | |
CN108874560B (zh) | 进行通信的方法和通信设备 | |
US9934035B2 (en) | Device and method for tracing updated predicate values | |
CN107645541B (zh) | 数据存储方法、装置及服务器 | |
CN110955546B (zh) | 一种内存地址监控方法、装置及电子设备 | |
CN112740187A (zh) | 调试程序的方法和系统 | |
US9053227B2 (en) | Concurrent assertion | |
CN117725032A (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 |