CN114911632A - 一种进程间通信的控制方法和*** - Google Patents
一种进程间通信的控制方法和*** Download PDFInfo
- Publication number
- CN114911632A CN114911632A CN202210807075.5A CN202210807075A CN114911632A CN 114911632 A CN114911632 A CN 114911632A CN 202210807075 A CN202210807075 A CN 202210807075A CN 114911632 A CN114911632 A CN 114911632A
- Authority
- CN
- China
- Prior art keywords
- data
- target
- block
- service channel
- sending
- 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
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/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/526—Mutual exclusion algorithms
-
- 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)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本发明公开了一种进程间通信的控制方法和***,该方法包括:若发送模块接收到对流式数据的发送请求,发送模块从第一共享内存中获取可用的目标数据块并对目标数据块上互斥锁;发送模块根据发送请求中的数据长度要求生成同步信息,并移动块游标到目标数据块的下一个可写数据位置,解除互斥锁;发送模块根据同步信息在目标数据块写入目标数据,并从同步信息组获取与发送请求对应的目标业务通道;发送模块在目标业务通道申请写信号量,并在申请成功后对目标业务通道上写入锁,在目标业务通道写入同步信息并移动写游标到目标业务通道的下一位置,并解除写入锁;发送模块释放目标业务通道的读信号量;从而提高了进程间通信的可靠性并保证了高并发。
Description
技术领域
本申请涉及计算机技术领域,更具体地,涉及一种进程间通信的控制方法和***。
背景技术
在计算机应用层通信方向,RPC(Remote Procedure Call,远程过程调用)已经有很多已知的解决方案和较成熟的通信中间件,如ICE、ZeroMQ、RabbitMQ、ActiveMQ、Kafka等。
但在IPC(Inter-Process Communication,进程间通信)方向,通信方式基本还处于较原始的管道(Pipe)、消息队列(Message Queue)、共享内存(Shared Memory)、信号量(Semaphore)、信号(Signal)、网络套接字(Socket)层,这些通信方式由操作***直接提供,功能单一,使用繁琐,出错率较高,很难直接应用到复杂的业务场景下。
因此,如何提高进程间通信的可靠性并保证高并发,是目前有待解决的技术问题。
发明内容
本发明提供一种进程间通信的控制方法,用以解决现有技术中进程间通信的可靠性差和效率低的技术问题。
该方法应用于包括多个处理模块的***中,各处理模块为同一进程中的不同线程或为不同进程,各处理模块中的数据发送方为发送模块,数据接收方为接收模块,所述方法包括:
若发送模块接收到对流式数据的发送请求,发送模块从第一共享内存中获取可用的目标数据块并对目标数据块上互斥锁;
发送模块根据所述发送请求中的数据长度要求生成同步信息,并移动块游标到目标数据块的下一个可写数据位置,解除互斥锁;
发送模块根据同步信息在目标数据块写入目标数据,并从同步信息组获取与所述发送请求对应的目标业务通道;
发送模块在目标业务通道申请写信号量,并在申请成功后对目标业务通道上写入锁,在目标业务通道写入同步信息并移动写游标到目标业务通道的下一位置,并解除写入锁;
发送模块释放目标业务通道的读信号量,以通知已注册目标业务通道的接收模块有新数据需要处理;
其中,所述第一共享内存和所述同步信息组构成流式通信组件,所述流式通信组件是首个启动的处理模块根据预设流式数据通信配置信息创建的,所述第一共享内存包括多个分别设置有块游标的数据块,所述同步信息组包括多个业务通道,每个业务通道包括一个消息通知队列、一组读写信号量以及一组读写游标,同步信息包括目标数据块的块号和目标数据在目标数据块上的数据偏移位置。
在一些实施例中,所述方法还包括:
若接收模块监听到目标业务通道的读信号量被释放,接收模块对目标业务通道上读取锁;
接收模块在目标业务通道中读取同步信息并移动读游标到目标业务通道的下一位置,并解除读取锁;
接收模块释放目标业务通道的写信号量,以通知发送模块继续发送数据;
接收模块根据同步信息在所述第一共享内存中找到目标数据块,并从目标数据块上读取目标数据。
在一些实施例中,在接收模块启动之后,所述方法还包括:
接收模块向所述同步信息组注册关注的目标业务并确定目标业务通道;
接收模块在目标业务通道注册关注的数据类型,并根据每种所述数据类型指定不同的数据处理线程。
在一些实施例中,目标数据带有数据头,所述数据头包括数据块开始标识、数据类型和数据长度,所述数据长度为不包括所述数据头的有效数据长度。
在一些实施例中,在接收模块根据同步信息在所述第一共享内存中找到目标数据块之后,所述方法还包括:
接收模块根据所述数据头中的数据块开始标识判断目标数据是否有效;
若是,接收模块从目标数据块上读取目标数据;
若否,接收模块提示错误。
在一些实施例中,所述第一共享内存中的各数据块的块号按顺序排列,发送模块从第一共享内存中获取可用的目标数据块,具体为:
发送模块确定上一次发送数据使用的数据块的块号是否为最后一个块号;
若是,发送模块将与首个块号对应的数据块作为目标数据块;
若否,发送模块确定上一次发送数据使用的数据块的块号的下一个块号,并将与下一个块号对应的数据块作为目标数据块。
在一些实施例中,预设流式数据通信配置信息包括流式节点,所述流式节点指定了第一共享内存中各数据块的大小和数据块的数量,所述流式节点下建立有多个业务通道节点,各业务通道节点包括业务标识和可缓存的数据队列数量,首个启动的处理模块创建所述流式通信组件后还对所述流式通信组件进行初始化,所述业务标识在初始化之前为字符串,所述业务标识在初始化过程中由字符串转换为数值。
在一些实施例中,所述方法还包括:
若当前处理模块检测到对状态型数据的访问请求,当前处理模块根据状态型通信组件确定与所述访问请求对应的目标状态块的偏移地址;
当前处理模块根据所述偏移地址在第二共享内存中确定所述目标状态块,并在所述目标状态块中对状态型数据进行读和/或写操作;
其中,所述状态型通信组件是首个启动的处理模块根据预设状态型数据通信配置信息创建的,所述第二共享内存中包括多个带有块标识的状态块,所述预设状态型数据通信配置信息包括状态节点,所述状态节点下包括多个状态块节点,各状态块节点包括状态块的大小和状态块的块标识,状态块的块标识与所述偏移地址对应。
相应的,本发明还提出了一种进程间通信的控制***,包括多个处理模块,各处理模块为同一进程中的不同线程或为不同进程,各处理模块中的数据发送方为发送模块,数据接收方为接收模块,发送模块包括:
获取单元,用于若接收到对流式数据的发送请求,从第一共享内存中获取可用的目标数据块并对目标数据块上互斥锁;
生成单元,用于根据所述发送请求中的数据长度要求生成同步信息,并移动块游标到目标数据块的下一个可写数据位置,解除互斥锁;
第一写入单元,用于根据同步信息在目标数据块写入目标数据,并从同步信息组获取与所述发送请求对应的目标业务通道;
第二写入单元,用于在目标业务通道申请写信号量,并在申请成功后对目标业务通道上写入锁,在目标业务通道写入同步信息并移动写游标到目标业务通道的下一位置,并解除写入锁;
第一释放单元,用于释放目标业务通道的读信号量,以通知已注册目标业务通道的接收模块有新数据需要处理;
其中,所述第一共享内存和所述同步信息组构成流式通信组件,所述流式通信组件是首个启动的处理模块根据预设流式数据通信配置信息创建的,所述第一共享内存包括多个分别设置有块游标的数据块,所述同步信息组包括多个业务通道,每个业务通道包括一个消息通知队列、一组读写信号量以及一组读写游标,同步信息包括目标数据块的块号和目标数据在目标数据块上的数据偏移位置。
在一些实施例中,接收模块包括:
监听单元,用于若监听到目标业务通道的读信号量被释放,对目标业务通道上读取锁;
第一读取单元,用于在目标业务通道中读取同步信息并移动读游标到目标业务通道的下一位置,并解除读取锁;
第二释放单元,用于释放目标业务通道的写信号量,以通知发送模块继续发送数据;
第二读取单元,用于根据同步信息在所述第一共享内存中找到目标数据块,并从目标数据块上读取目标数据。
通过应用以上技术方案,在多个处理模块的***中,各处理模块为同一进程中的不同线程或为不同进程,各处理模块中的数据发送方为发送模块,数据接收方为接收模块,若发送模块接收到对流式数据的发送请求,发送模块从第一共享内存中获取可用的目标数据块并对目标数据块上互斥锁;发送模块根据发送请求中的数据长度要求生成同步信息,并移动块游标到目标数据块的下一个可写数据位置,解除互斥锁;发送模块根据同步信息在目标数据块写入目标数据,并从同步信息组获取与发送请求对应的目标业务通道;发送模块在目标业务通道申请写信号量,并在申请成功后对目标业务通道上写入锁,在目标业务通道写入同步信息并移动写游标到目标业务通道的下一位置,并解除写入锁;发送模块释放目标业务通道的读信号量,以通知已注册目标业务通道的接收模块有新数据需要处理,从而提高了进程间通信的可靠性并保证了高并发。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出了本发明实施例提出的一种进程间通信的控制方法的流程示意图;
图2示出了本发明实施例中流式通信组件的原理图;
图3示出了本发明实施例中预设流式数据通信配置信息示意图;
图4示出了本发明实施例中数据头结构示意图;
图5示出了本发明实施例中同步消息结构示意图;
图6示出了本发明实施例中流式数据发送步骤示意图;
图7示出了本发明实施例中流式数据接收步骤示意图;
图8示出了本发明实施例中预设状态型数据通信配置信息示意图;
图9示出了本发明实施例中状态型数据通信原理图;
图10示出了本发明实施例中状态型数据同步机制示意图;
图11示出了本发明实施例提出的一种进程间通信的控制***中发送模块的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请实施例提供一种进程间通信的控制方法,应用于包括多个处理模块的***中,各处理模块为同一进程中的不同线程或为不同进程,各处理模块中的数据发送方为发送模块,数据接收方为接收模块。
本实施例中,***包括多个处理模块,各处理模块可以为同一进程中的不同线程(即应用软件内部),也可以为不同进程(即应用软件之间)。在处理模块之间进行流式数据通信时,可将处理模块分为数据发送方和数据接收方,数据发送方为发送模块,数据接收方为接收模块。可以理解的是,发送模块和接收模块之间可以为一对一、或一对多、或多对一。
发送模块和接收模块之间通过流式通信组件实现流式数据通信,流式通信组件是首个启动的处理模块根据预设流式数据通信配置信息创建的。每个处理模块启动后先判断流式通信组件是否已经被实例化,如果是,则跳过实例化过程;如果其他处理模块正在进行流式通信组件的实例化,则需要等待其他处理模块实例化完成,处理模块可直接使用已经实例化完成的流式通信组件。流式通信组件由最后退出的处理模块释放,以将资源归还给操作***。
如图2所示,流式通信组件由第一共享内存和同步信息组构成,第一共享内存用于使发送模块和接收模块间进行实际业务数据交互。第一共享内存包括多个分别设置有块游标的数据块,每个数据块形成一个循环队列,每个数据块是一个独立的数据读写单元,数据块首位置预留一个32位数值型区域,用于记录当前数据块待写入通信数据的位置。所有发送模块和接收模块共享这些数据块,每个数据块分配一个互斥锁,用于防止访问数据块时出现数据读写紊乱的情况,可根据硬件配置情况合理指定数据块大小和块数,可最大化提高资源利用率。
如图2所示,同步信息组包括多个业务通道,每个业务通道包括一个消息通知队列、一组读写信号量以及一组读写游标,每个消息通知队列也是一块共享内存,此共享内存的大小受通信配置中各业务的通信队列长度影响,具体为“读游标大小+写游标大小+(通信队列长度*单个通信消息大小)”。消息通知队列采用“生产者-消费者”机制循环记录同步信息,读写信号量用于管理消息通知队列中可读和可写的信息量,读写游标用于标识消息通知队列中当前读写的位置,可根据当前业务需要负载的数据量合理分配消息通知队列大小。
如图1所示,该方法包括以下步骤:
步骤S101,若发送模块接收到对流式数据的发送请求,发送模块从第一共享内存中获取可用的目标数据块并对目标数据块上互斥锁。
本实施例中,流式数据是一组顺序、大量、快速、连续到达的数据序列,一般情况下,流式数据可被视为一个随时间延续而无限增长的动态数据集合(如管理数据、日志数据、消息数据等)。对流式数据的发送请求可以为其他处理模块向发送模块发送的,发送模块收到该发送请求时,从第一共享内存中获取可用的目标数据块并对目标数据块上互斥锁,该互斥锁为块游标的互斥锁,可防止其他发送模块在本次写入操作期间操作此目标数据块的块游标,从而避免由此导致的数据写入错误。
为了进一步保证流式数据通信的可靠性,在本申请一些实施例中,所述第一共享内存中的各数据块的块号按顺序排列,发送模块从第一共享内存中获取可用的目标数据块,具体为:
发送模块确定上一次发送数据使用的数据块的块号是否为最后一个块号;
若是,发送模块将与首个块号对应的数据块作为目标数据块;
若否,发送模块确定上一次发送数据使用的数据块的块号的下一个块号,并将与下一个块号对应的数据块作为目标数据块。
本实施例中,第一共享内存中的各数据块的块号按顺序排列,按照数据块的块号依次循环访问的方式获取,例如,本次发送使用数据块1记录数据,则下一次使用数据块2记录数据,直到访问到最大块号的数据块后,将访问位置移动到数据块1,以此类推,这样就可以借助CPU调度策略,使所有发送模块能均衡访问每一个数据块,以达到通信组件整体的负载均衡。
步骤S102,发送模块根据所述发送请求中的数据长度要求生成同步信息,并移动块游标到目标数据块的下一个可写数据位置,解除互斥锁。
本实施例中,发送请求中包括数据长度要求,该数据长度要求表征了需要发送的流式数据的长度,发送模块根据该数据长度要求生成同步信息,该同步信息包括目标数据块的块号和目标数据在目标数据块上的数据偏移位置,在本申请具体的应用场景中,如图5所示,块号block用于指定发送的数据在第一共享内存中的哪一个数据块;数据偏移位置offset用于指定发送的数据在数据块的哪一个位置,接收模块收到同步消息后可以通过此同步信息快速找到并读取数据。
在生成同步信息后,发送模块已经确定了目标数据块的块号和数据偏移位置,此时可移动块游标到目标数据块的下一个可写数据位置,解除互斥锁。此步骤只移动块游标和生成同步信息,不执行数据写入操作,块游标移动后,其他发送模块将基于移动后的块游标继续操作,不影响本次发送数据时获取到的数据写入位置的操作,从而减少了持有互斥锁时间,提高并行效率。
步骤S103,发送模块根据同步信息在目标数据块写入目标数据,并从同步信息组获取与所述发送请求对应的目标业务通道。
本实施例中,发送模块根据同步信息中的数据偏移位置在目标数据块写入目标数据,为了将同步信息发送到同步信息组,从同步信息组获取与发送请求对应的目标业务通道。
为进一步提高通信可靠性,在本申请一些实施例中,目标数据带有数据头,所述数据头包括数据块开始标识、数据类型和数据长度,所述数据长度为不包括所述数据头的有效数据长度。
在具体的应用场景中,如图4所示,数据头包括数据块开始标识startFlag、数据类型type和数据长度length。数据块开始标识startFlag用于数据验证使用,发送模块发送数据时会将每个数据块开始标识置为一个固定的数值,接收模块通过这个数值判断收到的数据是否已经被篡改,可初步检测数据的有效性;数据类型type用于标识当前数据的类型,由发送模块指定,接收模块可通过此数据类型区分数据并对不同数据执行差异处理,且接收模块也可通过此类型为不同的数据指定不同的处理线程,按照不同的业务对处理性能的要求合理分配CPU资源;数据长度length用于指定当前数据的有效数据长度,接收模块可按照有效数据长度读取数据。可以理解的是,图4中的帧头即为数据头。
步骤S104,发送模块在目标业务通道申请写信号量,并在申请成功后对目标业务通道上写入锁,在目标业务通道写入同步信息并移动写游标到目标业务通道的下一位置,并解除写入锁。
本实施例中,发送模块需要先向目标业务通道申请写信号量,若申请成功,说明可以在目标业务通道写入数据,对目标业务通道上写入锁,防止其他发送模块操作目标业务通道,在目标业务通道写入同步信息,然后移动写游标到目标业务通道的下一位置,并解除写入锁,从而完成同步信息的写入。
为了提高通信可靠性,在本申请一些实施例中,在发送模块在目标业务通道申请写信号量之后,所述方法还包括:
若写信号量为空的时长大于预设时长,流式通信组件提示数据发送失败。
本实施例中,如果没有任何接收模块注册此目标业务通道或已注册的接收模块处理不及时,可能会导致写信号量长时间为空,此时流式通信组件提示数据发送失败,使用者可按照实际要求进行后续处理。
步骤S105,发送模块释放目标业务通道的读信号量,以通知已注册目标业务通道的接收模块有新数据需要处理。
本实施例中,接收模块监听目标业务通道的读信号量,发送模块在目标业务通道写入同步信息后还释放目标业务通道的读信号量,从而通知接收模块有新数据需要处理。
为了提高流式数据通信的可靠性,在本申请一些实施例中,预设流式数据通信配置信息包括流式节点,所述流式节点指定了第一共享内存中各数据块的大小和数据块的数量,所述流式节点下建立有多个业务通道节点,各业务通道节点包括业务标识和可缓存的数据队列数量,首个启动的处理模块创建所述流式通信组件后还对所述流式通信组件进行初始化,所述业务标识在初始化之前为字符串,所述业务标识在初始化过程中由字符串转换为数值。
在本申请具体的应用场景中,如图3所示,流式节点Stream指定了属性Size用于控制数据块大小,属性Blocks用于控制数据块的总块数,可根据实际需要合理配置共享内存资源。在流式节点Stream下建立多个业务通道节点Communicator,通过属性Id(即业务标识)区分不同的业务,通过属性QueueSize指定当前业务可缓存的最大数据队列个数,不同的业务对通信数据量的要求不同,因此同样可以按照实际需要进行合理分配。
业务标识在配置文件中使用字符串标识各个业务,字符串标识相对数值标识具备较高的辨识度,使用者可通过字符串清晰的识别各个业务,在对流式通信组件进行初始化过程中,会将每一个字符串转换为从0开始的系列化的数值,并且将数值作为访问业务通道的数组下标,可极大降低数据交互过程中业务通道检索的时间复杂度,现有技术中二分法时间复杂度为O(log2(n)),本发明将检索时间复杂度降低到最低为O(1)。
为了使接收模块可靠的接收到流式数据,在本申请一些实施例中,所述方法还包括:
若接收模块监听到目标业务通道的读信号量被释放,接收模块对目标业务通道上读取锁;
接收模块在目标业务通道中读取同步信息并移动读游标到目标业务通道的下一位置,并解除读取锁;
接收模块释放目标业务通道的写信号量,以通知发送模块继续发送数据;
接收模块根据同步信息在所述第一共享内存中找到目标数据块,并从目标数据块上读取目标数据。
本实施例中,若接收模块监听到目标业务通道的读信号量被释放,说明目标数据已存入第一共享内存,接收模块对目标业务通道上读取锁,然后在目标业务通道中读取同步信息,移动读游标到目标业务通道的下一位置,并解除读取锁,接收模块再释放目标业务通道的写信号量,以通知发送模块可继续发送数据,接收模块根据同步信息中块号找到目标数据块,并根据同步信息中的数据偏移位置从目标数据块上读取目标数据。
为了进一步提高业务处理效率,在本申请一些实施例中,在接收模块启动之后,所述方法还包括:
接收模块向所述同步信息组注册关注的目标业务并确定目标业务通道;
接收模块在目标业务通道注册关注的数据类型,并根据每种所述数据类型指定不同的数据处理线程。
本实施例中,接收模块启动后先向同步信息组注册自身关注的目标业务,并在目标业务通道注册关注的数据类型,接收模块为每种数据类型指定不同的数据处理线程,从而可提高业务处理效率。
为了进一步提高流式数据的通信可靠性,在本申请一些实施例中,在接收模块根据同步信息在所述第一共享内存中找到目标数据块之后,所述方法还包括:
接收模块根据所述数据头中的数据块开始标识判断目标数据是否有效;
若是,接收模块从目标数据块上读取目标数据;
若否,接收模块提示错误。
本实施例中,发送模块发送数据时会将每个数据头的开始标识置为一个固定的数,接收模块根据数据块开始标识判断目标数据是否已被篡改,从而可判断目标数据是否有效,若有效,接收模块从目标数据块上读取目标数据,否则接收模块提示错误。
为了高效的进行状态型数据通信,在本申请一些实施例中,所述方法还包括:
若当前处理模块检测到对状态型数据的访问请求,当前处理模块根据状态型通信组件确定与所述访问请求对应的目标状态块的偏移地址;
当前处理模块根据所述偏移地址在第二共享内存中确定所述目标状态块,并在所述目标状态块中对状态型数据进行读和/或写操作。
本实施例中,状态型数据为设备或***的状态数据,例如***守护状态、网络状态、设备参数、设备状态等。状态型数据存放在第二共享内存中,各处理模块可通过状态型通信组件访问第二共享内存中的状态型数据。状态型通信组件是首个启动的处理模块根据预设状态型数据通信配置信息创建的,状态型通信组件由最后退出的处理模块释放,以将资源归还给操作***。
第二共享内存中包括多个带有块标识的状态块,第二共享内存的大小为所有状态块大小之和。预设状态型数据通信配置信息包括状态节点,状态节点下包括多个状态块节点,各状态块节点包括状态块的大小和状态块的块标识,状态块的块标识与所述偏移地址对应。在本申请具体的应用场景中,如图8所示,配置中状态节点State下可以建立多个状态块节点Block,通过属性Id标识状态块,通过属性Size指定状态块大小,可以根据实际应用要求建立多个不同大小的状态块,按照实际需要进行合理分配,如图9所示为状态型数据通信原理图。
访问请求可以用户发出的或***自动触发的,若当前处理模块检测到对状态型数据的访问请求,当前处理模块根据状态型通信组件确定目标状态块的块标识,并根据块标识确定偏移地址,然后根据偏移地址在第二共享内存中确定目标状态块,并在目标状态块中对状态型数据进行读和/或写操作。
通过应用以上技术方案,在多个处理模块的***中,各处理模块为同一进程中的不同线程或为不同进程,各处理模块中的数据发送方为发送模块,数据接收方为接收模块,若发送模块接收到对流式数据的发送请求,发送模块从第一共享内存中获取可用的目标数据块并对目标数据块上互斥锁;发送模块根据发送请求中的数据长度要求生成同步信息,并移动块游标到目标数据块的下一个可写数据位置,解除互斥锁;发送模块根据同步信息在目标数据块写入目标数据,并从同步信息组获取与发送请求对应的目标业务通道;发送模块在目标业务通道申请写信号量,并在申请成功后对目标业务通道上写入锁,在目标业务通道写入同步信息并移动写游标到目标业务通道的下一位置,并解除写入锁;发送模块释放目标业务通道的读信号量,以通知已注册目标业务通道的接收模块有新数据需要处理,从而提高了进程间通信的可靠性并保证了高并发。
为了进一步阐述本发明的技术思想,现结合具体的应用场景,对本发明的技术方案进行说明。
本申请实施例提供一种进程间通信的控制方法,应用于包括多个处理模块的***中,该方法一方面用于解决流式数据通信问题,另一方面用于解决状态型数据通信问题,两部分功能通过通信配置文件实现配置管理,可同时启用,也可以根据实际情况只启用其中一部分。
流式数据通信基于流式通信组件,对外提供数据的发送和接收两类接口,其数据交互采用共享内存方式,数据同步采用信号量方式。发送模块和接收模块可以是同一个进程的不同线程,也可以是不同进程,在硬件资源满足的情况下,支持任意数量的收发模块参与数据交互,具备高并发能力。
如图6所示,流式数据发送包括以下步骤:
步骤1.1,任一处理模块都可以提起发送请求,发送模块收到发送请求后,从第一共享内存中获取可用的目标数据块。
步骤1.2,将获取到的目标数据块上互斥锁,然后按照发送请求中的数据长度要求生成同步信息,并移动目标数据块的块游标到下一个可写数据位置,最后解除目标数据块的互斥锁。
步骤1.3,按照同步信息将目标数据写入目标数据块的指定位置,写入时需要附加数据头信息,以供接收模块对数据进行初步验证。
步骤1.4,按照发送请求从同步信息组查找到需要通知到的目标业务通道。
步骤1.5,在目标业务通道上申请写信号量。
步骤1.6,如果申请写信号量成功,则先对此目标业务通道上写入锁,然后写入同步信息并移动写游标到目标业务通道的下一个位置,最后解除写入锁。另外,若写信号量为空的时长大于预设时长,即申请写信号量失败,流式通信组件提示数据发送失败。
步骤1.7,释放目标业务通道的读信号量,以通知接收模块有新数据需要处理。
如图7所示,流式数据接收包括以下步骤:
步骤2.1,接收模块启动后,首先向同步信息组注册自身关注的业务并确定目标业务通道,然后在目标业务通道上注册自身关注的数据类型,并可以为每一个数据类型指定不同的数据处理线程,提高业务数据处理能力。
步骤2.2,接收模块监听被注册的目标业务通道的读信号量。
步骤2.3,接收模块监听到读信号量被释放后,首先对目标业务通道上读取锁,然后读取同步信息并移动读游标到下一个位置,最后解除读取锁。
步骤2.4,接收模块释放写信号量,以通知发送模块可以继续发送数据。
步骤2.5,接收模块根据同步信息中块号查找目标数据块,根据数据偏移位置在目标数据在目标数据块的位置,并通过数据头所携带的信息判断目标数据是否有效,如果无效提示错误,如果有效则读取目标数据。
步骤2.5,接收模块读取目标数据并完成处理后,回到步骤2.2,继续监听目标业务通道的读信号量,循环接收并处理数据。
状态型数据通信基于状态型通信组件,对外提供一个状态数据的偏移地址的获取接口,状态数据存放在第二共享内存。不同处理模块可以访问第二共享内存上同一个区域的状态数据以实现信息交互。状态型通信组件只会被第一个启动的处理模块创建和初始化,后续其它处理模块直接使用即可,最后退出的处理模块负责释放状态型通信组件,将资源归还给操作***。
状态型数据的访问过程如下:
步骤3.1,若当前处理模块检测到对状态型数据的访问请求,当前处理模块根据状态型通信组件确定目标状态块的块标识,并根据块标识确定目标状态块的偏移地址;
步骤3.2,当前处理模块根据偏移地址在第二共享内存中确定目标状态块,并在目标状态块中对状态型数据进行读和/或写操作。
不同处理模块使用相同的块标识访问时,各处理模块获取的偏移地址都指向同一个位置,任何一个处理模块修改目标状态块的数据,其他处理模块可直接读取,无须依赖繁琐的收发和同步流程即可实现数据同步,同步机制如图10所示。
通过应用以上技术方案,与现有技术相比,具有以下技术效果:
1.流式数据通信中采用共享内存通信方式可保障通信的高速率,结合信号量同步机制保障通信数据能安全有效的到达。
2.流式数据通信中的接收模块和发送模块完全独立,具备低耦合性。
3.流式数据通信中为每条数据附加固定数据头,具备数据验证机制,可在流式通信组件中第一时间检测到数据是否被破坏。
4.流式数据通信中通过第一共享内存和同步信息组两个独立的组件将数据管理和同步消息分离,在同一份数据需要发送到多个接收模块进行处理时,可在第一共享内存写入一份数据,通过同步信息组的多个业务通道发送同步信息到多个处理模块,可防止冗余的内存拷贝引起通信效率降低问题,节省通信资源。
5.流式数据通信中采用多块数据块的方式,可保障大量收发模块访问时的并发能力,且每个发送模块采用数据块轮询机制,可在一定程度上实现负载均衡。
6.流式数据通信中具备数据类型标识功能,可在流式通信组件中实现数据甄别。接收模块具备为不同类型的数据分别指定处理线程的功能,可按照数据的量大小和处理复杂度进行CPU资源分配,灵活方便,满足不同的业务要求。
7.状态型数据通信中实现不同收发模块(进程级/线程级)之间状态信息的同步,针对一些特殊数据,无须再使用通信代价较大的流式数据通信方式进行交互,可进一步降低通信代价。
8.流式通信组件已具备内存资源和CPU资源管理功能,生产实施时无须再额外考虑资源管理相关功能。
9.使用常规的共享内存、信号量、读写锁、互斥锁、多线程等技术,不涉及到其他复杂的技术要求,实施难度低,对使用者要求不高。
相应的,本申请实施例还提出了一种进程间通信的控制***,包括多个处理模块,各处理模块为同一进程中的不同线程或为不同进程,各处理模块中的数据发送方为发送模块,数据接收方为接收模块,如图11所示,发送模块包括:
获取单元10,用于若接收到对流式数据的发送请求,从第一共享内存中获取可用的目标数据块并对目标数据块上互斥锁;
生成单元20,用于根据所述发送请求中的数据长度要求生成同步信息,并移动块游标到目标数据块的下一个可写数据位置,解除互斥锁;
第一写入单元30,用于根据同步信息在目标数据块写入目标数据,并从同步信息组获取与所述发送请求对应的目标业务通道;
第二写入单元40,用于在目标业务通道申请写信号量,并在申请成功后对目标业务通道上写入锁,在目标业务通道写入同步信息并移动写游标到目标业务通道的下一位置,并解除写入锁;
第一释放单元50,用于释放目标业务通道的读信号量,以通知已注册目标业务通道的接收模块有新数据需要处理;
其中,所述第一共享内存和所述同步信息组构成流式通信组件,所述流式通信组件是首个启动的处理模块根据预设流式数据通信配置信息创建的,所述第一共享内存包括多个分别设置有块游标的数据块,所述同步信息组包括多个业务通道,每个业务通道包括一个消息通知队列、一组读写信号量以及一组读写游标,同步信息包括目标数据块的块号和目标数据在目标数据块上的数据偏移位置。
在具体的应用场景中,接收模块包括:
监听单元,用于若监听到目标业务通道的读信号量被释放,对目标业务通道上读取锁;
第一读取单元,用于在目标业务通道中读取同步信息并移动读游标到目标业务通道的下一位置,并解除读取锁;
第二释放单元,用于释放目标业务通道的写信号量,以通知发送模块继续发送数据;
第二读取单元,用于根据同步信息在所述第一共享内存中找到目标数据块,并从目标数据块上读取目标数据。
最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不驱使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。
Claims (10)
1.一种进程间通信的控制方法,其特征在于,应用于包括多个处理模块的***中,各处理模块为同一进程中的不同线程或为不同进程,各处理模块中的数据发送方为发送模块,数据接收方为接收模块,所述方法包括:
若发送模块接收到对流式数据的发送请求,发送模块从第一共享内存中获取可用的目标数据块并对目标数据块上互斥锁;
发送模块根据所述发送请求中的数据长度要求生成同步信息,并移动块游标到目标数据块的下一个可写数据位置,解除互斥锁;
发送模块根据同步信息在目标数据块写入目标数据,并从同步信息组获取与所述发送请求对应的目标业务通道;
发送模块在目标业务通道申请写信号量,并在申请成功后对目标业务通道上写入锁,在目标业务通道写入同步信息并移动写游标到目标业务通道的下一位置,并解除写入锁;
发送模块释放目标业务通道的读信号量,以通知已注册目标业务通道的接收模块有新数据需要处理;
其中,所述第一共享内存和所述同步信息组构成流式通信组件,所述流式通信组件是首个启动的处理模块根据预设流式数据通信配置信息创建的,所述第一共享内存包括多个分别设置有块游标的数据块,所述同步信息组包括多个业务通道,每个业务通道包括一个消息通知队列、一组读写信号量以及一组读写游标,同步信息包括目标数据块的块号和目标数据在目标数据块上的数据偏移位置。
2.如权利要求1所述的方法,其特征在于,所述方法还包括:
若接收模块监听到目标业务通道的读信号量被释放,接收模块对目标业务通道上读取锁;
接收模块在目标业务通道中读取同步信息并移动读游标到目标业务通道的下一位置,并解除读取锁;
接收模块释放目标业务通道的写信号量,以通知发送模块继续发送数据;
接收模块根据同步信息在所述第一共享内存中找到目标数据块,并从目标数据块上读取目标数据。
3.如权利要求2所述的方法,其特征在于,在接收模块启动之后,所述方法还包括:
接收模块向所述同步信息组注册关注的目标业务并确定目标业务通道;
接收模块在目标业务通道注册关注的数据类型,并根据每种所述数据类型指定不同的数据处理线程。
4.如权利要求2所述的方法,其特征在于,目标数据带有数据头,所述数据头包括数据块开始标识、数据类型和数据长度,所述数据长度为不包括所述数据头的有效数据长度。
5.如权利要求4所述的方法,其特征在于,在接收模块根据同步信息在所述第一共享内存中找到目标数据块之后,所述方法还包括:
接收模块根据所述数据头中的数据块开始标识判断目标数据是否有效;
若是,接收模块从目标数据块上读取目标数据;
若否,接收模块提示错误。
6.如权利要求1所述的方法,其特征在于,所述第一共享内存中的各数据块的块号按顺序排列,发送模块从第一共享内存中获取可用的目标数据块,具体为:
发送模块确定上一次发送数据使用的数据块的块号是否为最后一个块号;
若是,发送模块将与首个块号对应的数据块作为目标数据块;
若否,发送模块确定上一次发送数据使用的数据块的块号的下一个块号,并将与下一个块号对应的数据块作为目标数据块。
7.如权利要求1所述的方法,其特征在于,预设流式数据通信配置信息包括流式节点,所述流式节点指定了第一共享内存中各数据块的大小和数据块的数量,所述流式节点下建立有多个业务通道节点,各业务通道节点包括业务标识和可缓存的数据队列数量,首个启动的处理模块创建所述流式通信组件后还对所述流式通信组件进行初始化,所述业务标识在初始化之前为字符串,所述业务标识在初始化过程中由字符串转换为数值。
8.如权利要求1所述的方法,其特征在于,所述方法还包括:
若当前处理模块检测到对状态型数据的访问请求,当前处理模块根据状态型通信组件确定与所述访问请求对应的目标状态块的偏移地址;
当前处理模块根据所述偏移地址在第二共享内存中确定所述目标状态块,并在所述目标状态块中对状态型数据进行读和/或写操作;
其中,所述状态型通信组件是首个启动的处理模块根据预设状态型数据通信配置信息创建的,所述第二共享内存中包括多个带有块标识的状态块,所述预设状态型数据通信配置信息包括状态节点,所述状态节点下包括多个状态块节点,各状态块节点包括状态块的大小和状态块的块标识,状态块的块标识与所述偏移地址对应。
9.一种进程间通信的控制***,其特征在于,包括多个处理模块,各处理模块为同一进程中的不同线程或为不同进程,各处理模块中的数据发送方为发送模块,数据接收方为接收模块,发送模块包括:
获取单元,用于若接收到对流式数据的发送请求,从第一共享内存中获取可用的目标数据块并对目标数据块上互斥锁;
生成单元,用于根据所述发送请求中的数据长度要求生成同步信息,并移动块游标到目标数据块的下一个可写数据位置,解除互斥锁;
第一写入单元,用于根据同步信息在目标数据块写入目标数据,并从同步信息组获取与所述发送请求对应的目标业务通道;
第二写入单元,用于在目标业务通道申请写信号量,并在申请成功后对目标业务通道上写入锁,在目标业务通道写入同步信息并移动写游标到目标业务通道的下一位置,并解除写入锁;
第一释放单元,用于释放目标业务通道的读信号量,以通知已注册目标业务通道的接收模块有新数据需要处理;
其中,所述第一共享内存和所述同步信息组构成流式通信组件,所述流式通信组件是首个启动的处理模块根据预设流式数据通信配置信息创建的,所述第一共享内存包括多个分别设置有块游标的数据块,所述同步信息组包括多个业务通道,每个业务通道包括一个消息通知队列、一组读写信号量以及一组读写游标,同步信息包括目标数据块的块号和目标数据在目标数据块上的数据偏移位置。
10.如权利要求9所述的***,其特征在于,接收模块包括:
监听单元,用于若监听到目标业务通道的读信号量被释放,对目标业务通道上读取锁;
第一读取单元,用于在目标业务通道中读取同步信息并移动读游标到目标业务通道的下一位置,并解除读取锁;
第二释放单元,用于释放目标业务通道的写信号量,以通知发送模块继续发送数据;
第二读取单元,用于根据同步信息在所述第一共享内存中找到目标数据块,并从目标数据块上读取目标数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210807075.5A CN114911632B (zh) | 2022-07-11 | 2022-07-11 | 一种进程间通信的控制方法和*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210807075.5A CN114911632B (zh) | 2022-07-11 | 2022-07-11 | 一种进程间通信的控制方法和*** |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114911632A true CN114911632A (zh) | 2022-08-16 |
CN114911632B CN114911632B (zh) | 2022-09-13 |
Family
ID=82771886
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210807075.5A Active CN114911632B (zh) | 2022-07-11 | 2022-07-11 | 一种进程间通信的控制方法和*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114911632B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115840654A (zh) * | 2023-01-30 | 2023-03-24 | 北京万里红科技有限公司 | 消息的处理方法、***、计算设备及可读存储介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101739301A (zh) * | 2009-12-09 | 2010-06-16 | 南京联创科技集团股份有限公司 | Unix环境下进程间大量数据传输的方法 |
US8271996B1 (en) * | 2008-09-29 | 2012-09-18 | Emc Corporation | Event queues |
CN103731328A (zh) * | 2014-01-02 | 2014-04-16 | 烽火通信科技股份有限公司 | 基于Linux共享内存实现家庭网关数据通信的***及方法 |
CN110597640A (zh) * | 2019-08-29 | 2019-12-20 | 深圳市优必选科技股份有限公司 | 进程间的数据传输方法、装置、终端及计算机存储介质 |
CN111352743A (zh) * | 2018-12-24 | 2020-06-30 | 北京新媒传信科技有限公司 | 一种进程通讯方法和装置 |
CN112860458A (zh) * | 2021-02-22 | 2021-05-28 | 北京睿芯高通量科技有限公司 | 一种基于共享内存的进程间通信方法及*** |
-
2022
- 2022-07-11 CN CN202210807075.5A patent/CN114911632B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8271996B1 (en) * | 2008-09-29 | 2012-09-18 | Emc Corporation | Event queues |
CN101739301A (zh) * | 2009-12-09 | 2010-06-16 | 南京联创科技集团股份有限公司 | Unix环境下进程间大量数据传输的方法 |
CN103731328A (zh) * | 2014-01-02 | 2014-04-16 | 烽火通信科技股份有限公司 | 基于Linux共享内存实现家庭网关数据通信的***及方法 |
CN111352743A (zh) * | 2018-12-24 | 2020-06-30 | 北京新媒传信科技有限公司 | 一种进程通讯方法和装置 |
CN110597640A (zh) * | 2019-08-29 | 2019-12-20 | 深圳市优必选科技股份有限公司 | 进程间的数据传输方法、装置、终端及计算机存储介质 |
CN112860458A (zh) * | 2021-02-22 | 2021-05-28 | 北京睿芯高通量科技有限公司 | 一种基于共享内存的进程间通信方法及*** |
Non-Patent Citations (1)
Title |
---|
韩剑辉等: "基于Linux的进程间通信性能问题研究", 《哈尔滨理工大学学报》 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115840654A (zh) * | 2023-01-30 | 2023-03-24 | 北京万里红科技有限公司 | 消息的处理方法、***、计算设备及可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN114911632B (zh) | 2022-09-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11467864B2 (en) | Unified resource scheduling coordinator, method for creating a virtual machine and/or container, and unified resource scheduling system | |
US20200241927A1 (en) | Storage transactions with predictable latency | |
WO2020001320A1 (zh) | 一种资源分配方法、装置及设备 | |
US9996403B2 (en) | System and method for providing message queues for multinode applications in a middleware machine environment | |
JP4624110B2 (ja) | 2つまたはそれ以上の機械の間でデータベース動作を行なうための直接メモリアクセスの用法 | |
CN108647104B (zh) | 请求处理方法、服务器及计算机可读存储介质 | |
CN111966446B (zh) | 一种容器环境下rdma虚拟化方法 | |
CN110134534B (zh) | 基于nio针对大数据分布式***进行消息处理优化的***及方法 | |
JP2009525536A (ja) | 適応型の領域ロック処理 | |
JP2013513174A (ja) | 仮想マシンのストレージスペースおよび物理ホストを管理するための方法およびシステム | |
CN110532109B (zh) | 一种共享多通道进程通信内存结构和方法 | |
CN105357042B (zh) | 一种高可用集群***及其主节点和从节点 | |
US11948021B2 (en) | Method for inter-core communication, processor, inter-core communication system and computer readable storage medium | |
CN111404931B (zh) | 一种基于持久性内存的远程数据传输方法 | |
CN112073456B (zh) | 分布式锁的实现方法、相关设备及*** | |
JP2002505471A (ja) | 遠隔処理の中断および継続の方法と装置 | |
US20140068165A1 (en) | Splitting a real-time thread between the user and kernel space | |
CN114911632B (zh) | 一种进程间通信的控制方法和*** | |
CN111897666A (zh) | 用于多进程之间通信的方法、设备及*** | |
CN112463400A (zh) | 一种基于共享内存的实时数据分发方法及装置 | |
US20190146845A1 (en) | Lock Allocation Method and Apparatus, and Computing Device | |
CN109831394B (zh) | 数据处理方法、终端以及计算机存储介质 | |
CN113821309B (zh) | 一种微内核虚拟机间的通信方法、装置、设备及存储介质 | |
CN116414534A (zh) | 任务调度方法、装置、集成电路、网络设备及存储介质 | |
US20230342087A1 (en) | Data Access Method and Related Device |
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 |