CN117149452A - 进程间通信方法、装置、计算机设备及介质 - Google Patents

进程间通信方法、装置、计算机设备及介质 Download PDF

Info

Publication number
CN117149452A
CN117149452A CN202311016375.2A CN202311016375A CN117149452A CN 117149452 A CN117149452 A CN 117149452A CN 202311016375 A CN202311016375 A CN 202311016375A CN 117149452 A CN117149452 A CN 117149452A
Authority
CN
China
Prior art keywords
memory block
message
data
target memory
target
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
Application number
CN202311016375.2A
Other languages
English (en)
Inventor
陈悠湛
杨海平
杨驭帆
彭天帅
梁爽
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Chaoxing Future Technology Co ltd
Original Assignee
Beijing Chaoxing Future Technology Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Chaoxing Future Technology Co ltd filed Critical Beijing Chaoxing Future Technology Co ltd
Priority to CN202311016375.2A priority Critical patent/CN117149452A/zh
Publication of CN117149452A publication Critical patent/CN117149452A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/546Message passing systems or structures, e.g. queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/548Queue

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

进程间通信方法、装置、计算机设备及介质
技术领域
本发明涉及数据通信技术领域,特别涉及一种进程间通信方法、装置、计算机设备及介质。
背景技术
自动驾驶不同模块进程间大数据块通信性能非常重要。在自动驾驶系统中,传感器模块会不断地采集车辆周围的数据,并将其传输到感知模块进行处理,这些数据通常包含大量的信息,如图像、点云等,因此需要高效地进行通信和传输。
如果模块之间的通信性能不佳,可能会导致数据传输延迟或丢失,从而影响自动驾驶系统的性能和安全性。例如,在紧急情况下,感知模块需要快速地获取车辆周围的数据以做出正确的决策,如果通信性能不佳,可能会导致感知模块无法及时获取到所需的数据,从而影响驾驶决策的准确性和及时性。
因此,为了保证自动驾驶系统的正常运行,传感器模块和感知模块之间需要建立高效的大数据块通信机制。简单的高效进程间通信可以直接使用共享内存,也有依赖同进程内的数据共享将进程间通信修改为进程内通信,以避免大数据传输的方案。
但是,直接使用共享内存也存着一些问题。首先,直接使用共享内存时需要处理信号同步问题。在多进程或多线程编程中,多个进程或线程可能会同时访问同一块共享内存区域,这可能会导致数据竞争和不一致的问题。为了避免这种情况,需要使用信号同步机制来保证数据的一致性和安全性。
其次,基于shm(shared Memory,共享内存)进行进程间通信时,简单的设计方案可以采用每条消息占用一块shm空间,一方面shm空间是有限的,另一方面shm每次映射都是需要通过系统调用去映射内存空间,这个操作是耗时的,且系统调用并不能完全确认不会被阻塞,导致通信效率低。
而且,进程内多线程无法完全隔离,一个线程出问题可能会影响到其他线程。这是因为多个线程共享同一个进程的内存空间和资源,如果一个线程出现了问题,例如访问了无效的内存地址、发生了死锁等,就会导致整个进程出现异常,从而影响到其他线程的正常运行。
发明内容
有鉴于此,本发明实施例提供了一种进程间通信方法,以解决现有技术中多个节点参与时的数据有效期问题以及通信效率低的技术问题。该方法包括:
将共享内存划分为若干个内存块,对每个内存块进行唯一编号;
基于所述每个内存块的所述编号形成空闲内存块列表,通过所述空闲内存块列表根据所述编号对所述若干个内存块进行使用状态管理;
在消息订阅者和消息发布者的进程之间建立通信链接;
当消息发布者从所述若干个内存块中申请目标内存块后,将消息发布者待发送的数据写入所述目标内存块,并将目标内存块对应的编号从所述空闲内存块列表中移除,将目标内存块对应的编号由消息发布者持有;
当接收到消息发布者判断目标内存块中的数据是需要发送的消息时,对目标内存块写入校验计数,将目标内存块对应的编号和所述校验计数发送至消息订阅者,同时维护一个先进先出的历史消息队列,将所述编号放入所述历史消息队列中,当所述历史消息队列中最先进入的编号被删除时,将所述最先进入的编号对应的目标内存块归还给所述空闲内存块列表进行管理,其中,所述编号和所述校验计数为消息订阅者获取所述数据的依据;
当接收到消息发布者判断目标内存块中的数据是不需要发送的消息时,将目标内存块归还给所述空闲内存块列表进行管理。
本发明实施例还提供了一种进程间通信装置,以解决现有技术中多个节点参与时的数据有效期问题以及通信效率低的技术问题。该装置包括:
分块模块,用于将共享内存划分为若干个内存块,对每个内存块进行唯一编号;
空闲内存块列表形成模块,用于基于所述每个内存块的所述编号形成空闲内存块列表,通过所述空闲内存块列表根据所述编号对所述若干个内存块进行使用状态管理;
通信链接建立模块,用于在消息订阅者和消息发布者的进程之间建立通信链接;
数据写入模块,用于当消息发布者从所述若干个内存块中申请目标内存块后,将消息发布者待发送的数据写入所述目标内存块,并将目标内存块对应的编号从所述空闲内存块列表中移除,将目标内存块对应的编号由消息发布者持有;
数据发送及归还模块,用于当接收到消息发布者判断目标内存块中的数据是需要发送的消息时,对目标内存块写入校验计数,将目标内存块对应的编号和所述校验计数发送至消息订阅者,同时维护一个先进先出的历史消息队列,将所述编号放入所述历史消息队列中,当所述历史消息队列中最先进入的编号被删除时,将所述最先进入的编号对应的目标内存块归还给所述空闲内存块列表进行管理,其中,所述编号和所述校验计数为消息订阅者获取所述数据的依据;
归还模块,用于当接收到消息发布者判断目标内存块中的数据是不需要发送的消息时,将目标内存块归还给所述空闲内存块列表进行管理。
本发明实施例还提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任意的进程间通信方法,以解决现有技术中多个节点参与时的数据有效期问题以及通信效率低的技术问题。
本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述任意的进程间通信方法的计算机程序,以解决现有技术中多个节点参与时的数据有效期问题以及通信效率低的技术问题。
与现有技术相比,本说明书实施例采用的上述至少一个技术方案能够达到的有益效果至少包括:将共享内存分配为若干个内存块,对每个内存块进行唯一编号;基于各个内存块的编号形成空闲内存块列表,空闲内存块列表通过编号对若干个内存块进行管理;消息订阅者和消息发布者建立通信链接;消息发布者从若干个内存块中申请目标内存块,将有关消息的数据写入目标内存块,并将目标内存块对应的编号从空闲内存块列表中移除,并由消息发布者持有;消息发布者对写入数据的目标内存块中的数据判断是否需要发送;判断写入数据的目标内存块中的数据需要发送时,对该目标内存块写入校验计数,将该目标内存块对应的编号和校验计数发送至消息订阅者,同时维护一个先进先出的历史消息队列,将编号放入历史消息队列中,当历史消息队列中最先进入的编号被删除时,最先进入的编号对应的目标内存块归还给空闲内存块列表进行管理;消息订阅者收到编号和校验计数,并根据编号和校验计数获取数据;判断写入数据的目标内存块中的数据不需要发送时,将该目标内存块归还给空闲内存块列表进行管理。本申请提供了一种无需信号同步的、进程间零拷贝的进程间通信方法,通过建立多个进程能共同访问的内存空间,基于history队列和消息发送前支持直接回收的策略,以及结合标记count_num(编号)的方法,实现订阅者无需要与发送者沟通的数据生命周期系统,解决了多个节点参与时的数据有效期问题,同时消息发布者可直接申请目标内存块进行数据的逻辑判断处理,有效避免在每次消息获取时都进行内存映射,减少数据拷贝,提高了通信效率。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1是本发明实施例提供的一种进程间通信方法的流程图;
图2是本发明实施例提供的空闲内存块列表的示意图;
图3是本发明实施例提供的历史消息队列的示意图;
图4是本发明实施例提供的内存块归还给空闲内存块列表的示意图;
图5是本发明实施例提供的一种计算机设备的结构框图;
图6是本发明实施例提供的一种进程间通信装置的结构框图。
具体实施方式
下面结合附图对本申请实施例进行详细描述。
以下通过特定的具体实例说明本申请的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本申请的其他优点与功效。显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。本申请还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本申请的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请中关于进程间通信方法的相关专业名词如下:
主题(Topic):它是将发布者的DataWriters与订阅者的DataReaders绑定的实体,在DDS域中是唯一的。它是可在进程之间交换的数据的消息,数据表示为可以包含不同数据类型的结构,如整数,字符串等;
数据写入器(DataWriter):它是负责发布消息的实体,用户在创建此实体时必须提供一个主题,该主题将是发布数据的主题;
数据读取器(DataReader):它是订阅主题以接收发布的实体,用户在创建此实体时必须提供订阅主题;
发布者(Publisher):它是负责创建和配置其实现的DataWriters的DCPS实体。DataWriter是负责实际发布消息的实体。每个人都有一个分配的主题,在该主题下发布消息;
订阅者(Subscriber):它是DCPS实体,负责接收在其订阅的主题下发布的数据。它为一个或多个DataReader对象提供服务,这些对象负责将新数据的可用性传达给应用程序。
在本发明实施例中,提供了一种进程间通信方法,如图1所示,该方法包括:
步骤S11、将共享内存划分为若干个内存块,对每个内存块进行唯一编号;
步骤S12、基于所述每个内存块的所述编号(index)形成空闲内存块列表(freebuf列表),通过所述空闲内存块列表根据所述编号对所述若干个内存块进行使用状态管理;
步骤S13、在消息订阅者和消息发布者的进程之间建立通信链接;
步骤S14、当消息发布者从所述若干个内存块中申请目标内存块后,将消息发布者待发送的数据写入所述目标内存块,并将目标内存块对应的编号从所述空闲内存块列表中移除,将目标内存块对应的编号由消息发布者持有,其中,目标内存块为空闲的内存块;
步骤S15、当接收到消息发布者判断目标内存块中的数据是需要发送的消息时,对目标内存块写入校验计数,将目标内存块对应的编号和所述校验计数发送至消息订阅者,同时维护一个先进先出的历史消息队列,将所述编号放入所述历史消息队列中,当所述历史消息队列中最先进入的编号被删除时,将所述最先进入的编号对应的目标内存块归还给所述空闲内存块列表进行管理,其中,所述编号和所述校验计数为消息订阅者获取所述数据的依据;
步骤S16、当接收到消息发布者判断目标内存块中的数据是不需要发送的消息时,将目标内存块归还给所述空闲内存块列表进行管理。
本实施例中,主要涉及两个阶段:内存分配阶段和生命周期管理阶段,生命周期管理阶段包括消息发送前阶段和消息发送阶段,对于消息发送前阶段,消息发布者可以从内存池(共享内存)中申请一块或多块内存块,针对消息发送阶段,消息发送时会将待发送消息的编号作为消息内容发送,同时消息发布者维护一个history队列,history队列是一个维护在使用空间的重要数据结构,简单来说,history队列中的管理块所对应的内存空间都是存放着有效信息的,所有进程都可以使用,当管理块从history中移除后,该内存空间会回到freebuf列表进行管理。
因此,本实施例通过使用一块shm空间承载一个主题中所有消息的思想,大幅提高通信性能。具体的,为实现shm分块使用的思想,通过设置history队列和空闲内存块列表,支持数据发送前直接回收的策略,同时结合count_num用以保存一次发送的消息内容的方法,实现了消息订阅者收到消息后无需再与消息发布者通信即可完成数据的生命周期管理。并允许消息发布者在逻辑处理的早期就申请多块空间用于数据处理判断,最终消息发布者可根据逻辑决定该消息数据是否需要发送,避免了消息发送时再拷贝数据,从而减少数据拷贝量,提高了通信效率。因此,本申请实现了无需信号同步的进程间零拷贝,使用多个进程能共同访问的内存空间,解决了多个节点参与时的数据有效期问题。
具体实施时,所述将共享内存分配为若干个内存块,对每个内存块进行唯一编号,包括:
步骤S111、以主题为单位,根据该主题需要支持历史消息的最大条数,将所述共享内存划分为若干个内存块;
步骤S112、根据每个内存块在共享内存中内存地址的前后顺序,依次对每个内存块进行唯一编号。
更为具体的,所述共享内存的总字节长度L为:
L=N*2*(t+m),
其中,N为该主题中需要支持历史消息的最大条数,N*2为分配的内存块的个数,t为该主题中各条消息的字节长度的最大值,m为所述校验计数的字节长度。
例如,假设某主题A,需要最大支持10条历史消息,一条消息的字节长度最长为t,count_num的长度为16字节,则这块内存被分为20个内存块,为主体A申请10*2(t+16)个消息长度的总共享内存。编号则是按照拆分20个内存块时以内存地址的前后顺序,从0开始依次编号,则得到0~19的20个编号,分别将这20个编号与20个内存块一一对应。
需要说明的是,在本实施例中,共享内存分配的内存块个数是N*2,可以保证history队列中满时(此时,history队列中占用N块内存块)依然有N块空闲的内存块,以供消息发布者使用。当然,也可以分配更多的内存块,但考虑内存的合理分配,本实施例中仅设置共享内存分配的内存块个数是N*2。
具体实施时,参照图2,所述基于所述每个内存块的所述编号形成空闲内存块列表,包括:
步骤S121、基于每个内存块的首地址和所述编号形成一个结构体;
步骤S122、将每个内存块对应的所述结构体依次连接形成所述空闲内存块列表。
例如,假设某主题A,需要最大支持10条历史消息,这块内存被分为20个内存块,将每个内存块的首地址和编号作为一个结构体,则20个内存块形成20个结构体,并根据各内存块的编号顺序依次将20个结构体连接,形成一个freebuf列表,利用freebuf列表对内存块进行管理。
具体实施时,管理内存的管理者处于与消息发布者相同的进程中,在消息订阅者和消息发布者链接建立后,
通过消息订阅者获取所述共享内存的基本信息,所述基本信息包括文件描述符、总字节长度和内存块分块数目;
基于所述基本信息在消息订阅者的进程中映射形成一个链表,所述链表中包含有与所述每个内存块分别对应的管理块,所述管理块中包含内存块的编号和首地址。
例如,所有主题A的订阅者将通过其它方式在初始化过程中获取到该共享内存的基本信息。所述的其它方式,比如:发布者会通过DDS广播另一个以”shminfo”为主题名称的主题,订阅者从这个主题中得到shm的文件描述符(fd)、内存长度和内存块分块数目。并完成内存映射等工作,在订阅者自己的进程中使用相同的映射规则得到一个index与内存首地址的对应表,命名为topicbuf链表。例如,共享内存被分为20个内存块,每个内存块对应一个topicbuf链表中的一个管理块,该管理块中包含与内存块对应的index和首地址。
具体实施时,进程间通信方法还包括:
步骤S151、根据消息订阅者收到的所述编号在所述链表中找到与该编号对应的首地址;
步骤S152、根据消息订阅者收到的所述编号和与该编号对应的首地址定位当前消息的数据所在的写入数据的空闲;
步骤S153、提取定位到的写入数据的空闲中的所述校验计数;
步骤S154、将提取到的所述校验计数与消息订阅者收到的所述校验计数进行比较;
步骤S155、当提取到的所述校验计数与消息订阅者收到的所述校验计数相同时,则使用定位到的写入数据的空闲中的数据;
步骤S156、当提取到的所述校验计数与消息订阅者收到的所述校验计数不相同时,表明消息已过了生命周期,当前消息不再有效,则不使用定位到的写入数据的空闲中的数据。
本实施例中,消息订阅者通过两个途径会得到两个count_num,一个途径是消息发布者发送出来的,另一个途径是在订阅者的进程中映射了共享内存后从共享内存块中的对应位置取出来的,然后将这两个count_num进行比对,通过比较这两个count_num是否一致即可知晓消息是否已过了生命周期。从而实现了订阅者收到消息后无需再与发布者通信即可完成数据的生命周期管理,解决了多个节点参与时的数据有效期问题。
由上述实施例可知,消息发布者会以申请到的内存块为数据载体(写入数据的目标内存块)进行逻辑判断或者处理,处理完成后,对于发布者持有的结构体,可能有两种情况:一种是需要将数据发送出去,一种是因为某种原因数据不作为消息发送,完成生命周期后要释放该块内存。
具体的,对于数据需要发送出去的情况,index和count_num会作为消息内容发送给所有的消息定阅者,例如,使用DDS(Direct Digital Synthesizer,直接数字式频率合成器)将index和count_num发送给消息订阅者,此处DDS设置与history队列长度相同的qos历史长度。消息定阅者将通过这两个值(index值和count_num)来获取定阅的数据。同时将index放入history队列中(参照图3中标号1的步骤),history队列为先进先出队,当新index进入队列后,最旧的index(最先进入该history队列的index)从队列中删除(参照图3中标号2的步骤),count_num值会被清除,旧index送还给freebuf列表管理。也可以理解为,消息发布者发送消息的时候,同步的也会将消息所存放的内存块对应的结构体放入这个队列。
对于数据不发送,释放buf的情况,消息发送者需要将该内存块归还给freebuf列表进行管理。
本实施例中,通过与DDS协同实现了完备的消息机制,易于与已有的自动驾驶系统集成,实现自动驾驶不同模块进程间的大数据块通信。
需要说明的是,在将消息发送给消息订阅者时,还可以通过msgqueue(消息队列)、socket(套接字)、mqtt(Message Queuing Telemetry Transport,消息队列遥测传输协议)的方法进行发送,由于内容短小,通信速度快。
具体实施时,参照图4,将目标内存块归还给所述空闲内存块列表进行管理,包括:
根据目标内存块对应的所述编号和所述首地址定位到目标内存块,参照图4中的步骤a;
如果目标内存块中存在所述校验计数,则将所述校验计数清除,参照图4中的步骤b;
将目标内存块对应的所述结构体添加到所述空闲内存块列表中进行管理。
本实施例中,通过利用空闲内存块列表对各个内存块进行管理,可以清楚地了解到哪些内存块为目标内存块可以被利用,提高了进程间的处理效率。
在本实施例中,提供了一种计算机设备,如图5所示,包括存储器501、处理器502及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任意的进程间通信方法。
具体的,该计算机设备可以是计算机终端、服务器或者类似的运算装置。
在本实施例中,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述任意的进程间通信方法的计算机程序。
具体的,计算机可读存储介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机可读存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读存储介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
基于同一发明构思,本发明实施例中还提供了一种进程间通信装置,如下面的实施例所述。由于进程间通信装置解决问题的原理与进程间通信方法相似,因此进程间通信装置的实施可以参见进程间通信方法的实施,重复之处不再赘述。以下所使用的,术语“单元”或者“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图6是本发明实施例的进程间通信装置的一种结构框图,如图6所示,包括:分块模块601、空闲内存块列表形成模块602、通信链接建立模块603、数据写入模块604、数据发送及归还模块605和归还模块606,下面对该结构进行说明。
分块模块601,用于将共享内存划分为若干个内存块,对每个内存块进行唯一编号;
空闲内存块列表形成模块602,用于基于所述每个内存块的所述编号形成空闲内存块列表,通过所述空闲内存块列表根据所述编号对所述若干个内存块进行使用状态管理;
通信链接建立模块603,用于在消息订阅者和消息发布者的进程之间建立通信链接;
数据写入模块604,用于当消息发布者从所述若干个内存块中申请目标内存块后,将消息发布者待发送的数据写入所述目标内存块,并将目标内存块对应的编号从所述空闲内存块列表中移除,将目标内存块对应的编号由消息发布者持有;
数据发送及归还模块605,用于当接收到消息发布者判断目标内存块中的数据是需要发送的消息时,对目标内存块写入校验计数,将目标内存块对应的编号和所述校验计数发送至消息订阅者,同时维护一个先进先出的历史消息队列,将所述编号放入所述历史消息队列中,当所述历史消息队列中最先进入的编号被删除时,将所述最先进入的编号对应的目标内存块归还给所述空闲内存块列表进行管理,其中,所述编号和所述校验计数为消息订阅者获取所述数据的依据;
归还模块606,用于当接收到消息发布者判断目标内存块中的数据是不需要发送的消息时,将目标内存块归还给所述空闲内存块列表进行管理。
在一个实施例中,分块模块601还用于:以主题为单位,根据该主题需要支持历史消息的最大条数,将所述共享内存划分为若干个内存块;
根据每个内存块在共享内存中内存地址的前后顺序,依次对每个内存块进行唯一编号。
在一个实施例中,分块模块601中的所述共享内存的总字节长度L为:
L=N*2*(t+m),
其中,N为该主题中需要支持历史消息的最大条数,N*2为划分的内存块的个数,t为该主题中各条消息的字节长度的最大值,m为所述校验计数的字节长度。
在一个实施例中,空闲内存块列表形成模块602还用于:基于所述每个内存块的首地址和所述编号形成一个结构体;
将所述每个内存块对应的所述结构体依次连接形成所述空闲内存块列表。
在一个实施例中,所述装置还包括:
共享内存基本信息获取模块,用于通过消息订阅者获取所述共享内存的基本信息,所述基本信息包括文件描述符、总字节长度和内存块分块数目;
映射模块,用于基于所述基本信息在消息订阅者的进程中映射形成一个链表,所述链表中包含有与所述每个内存块分别对应的管理块,所述管理块中包含内存块的编号和首地址。
在一个实施例中,数据发送及归还模块605还用于:
根据消息订阅者收到的所述编号在所述链表中找到与该编号对应的首地址;
根据消息订阅者收到的所述编号和与该编号对应的首地址定位当前消息的数据所在的目标内存块;
提取定位到的目标内存块中的所述校验计数;
将提取到的所述校验计数与消息订阅者收到的所述校验计数进行比较;
当提取到的所述校验计数与消息订阅者收到的所述校验计数相同时,则使用定位到的目标内存块中的数据;
当提取到的所述校验计数与消息订阅者收到的所述校验计数不相同时,表明当前消息不再有效,则不使用定位到的目标内存块中的数据。
在一个实施例中,归还模块606还用于:
根据目标内存块对应的所述编号和所述首地址定位到目标内存块;
如果目标内存块中存在所述校验计数,则将所述校验计数清除;
将目标内存块对应的所述结构体添加到所述空闲内存块列表中进行管理。
本发明实施例实现了如下技术效果:将共享内存分配为若干个内存块,对每个内存块进行唯一编号;基于各个内存块的编号形成空闲内存块列表,空闲内存块列表通过编号对若干个内存块进行管理;消息订阅者和消息发布者建立通信链接;消息发布者从若干个内存块中申请目标内存块,将有关消息的数据写入目标内存块,并将目标内存块对应的编号从空闲内存块列表中移除,并由消息发布者持有;消息发布者对写入数据的目标内存块中的数据判断是否需要发送;判断写入数据的目标内存块中的数据需要发送时,对该目标内存块写入校验计数,将该目标内存块对应的编号和校验计数发送至消息订阅者,同时维护一个先进先出的历史消息队列,将编号放入历史消息队列中,当历史消息队列中最先进入的编号被删除时,最先进入的编号对应的目标内存块归还给空闲内存块列表进行管理;消息订阅者收到编号和校验计数,并根据编号和校验计数获取数据;判断写入数据的目标内存块中的数据不需要发送时,将该目标内存块归还给空闲内存块列表进行管理。本申请提供了一种无需信号同步的进程间零拷贝的进程间通信方法,通过建立多个进程能共同访问的内存空间,基于history队列和消息发送前支持直接回收的策略,以及结合标记count_num的方法,实现订阅者无需要与发送者沟通的数据生命周期系统,解决了多个节点参与时的数据有效期问题,同时消息发布者可直接申请目标内存块进行数据的逻辑判断处理,有效避免在每次消息获取时都进行内存映射,减少数据拷贝,提高了通信效率。
显然,本领域的技术人员应该明白,上述的本发明实施例的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明实施例不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种进程间通信方法,其特征在于,包括:
将共享内存划分为若干个内存块,对每个内存块进行唯一编号;
基于所述每个内存块的所述编号形成空闲内存块列表,通过所述空闲内存块列表根据所述编号对所述若干个内存块进行使用状态管理;
在消息订阅者和消息发布者的进程之间建立通信链接;
当消息发布者从所述若干个内存块中申请目标内存块后,将消息发布者待发送的数据写入所述目标内存块,并将目标内存块对应的编号从所述空闲内存块列表中移除,将目标内存块对应的编号由消息发布者持有;
当接收到消息发布者判断目标内存块中的数据是需要发送的消息时,对目标内存块写入校验计数,将目标内存块对应的编号和所述校验计数发送至消息订阅者,同时维护一个先进先出的历史消息队列,将所述编号放入所述历史消息队列中,当所述历史消息队列中最先进入的编号被删除时,将所述最先进入的编号对应的目标内存块归还给所述空闲内存块列表进行管理,其中,所述编号和所述校验计数为消息订阅者获取所述数据的依据;
当接收到消息发布者判断目标内存块中的数据是不需要发送的消息时,将目标内存块归还给所述空闲内存块列表进行管理。
2.如权利要求1所述的进程间通信方法,其特征在于,所述将共享内存划分为若干个内存块,对每个内存块进行唯一编号,包括:
以主题为单位,根据该主题需要支持历史消息的最大条数,将所述共享内存划分为若干个内存块;
根据每个内存块在共享内存中内存地址的前后顺序,依次对每个内存块进行唯一编号。
3.如权利要求2所述的进程间通信方法,其特征在于,所述共享内存的总字节长度L为:
L=N*2*(t+m),
其中,N为该主题中需要支持历史消息的最大条数,N*2为划分的内存块的个数,t为该主题中各条消息的字节长度的最大值,m为所述校验计数的字节长度。
4.如权利要求1所述的进程间通信方法,其特征在于,所述基于所述每个内存块的所述编号形成空闲内存块列表,包括:
基于所述每个内存块的首地址和所述编号形成一个结构体;
将所述每个内存块对应的所述结构体依次连接形成所述空闲内存块列表。
5.如权利要求1所述的进程间通信方法,其特征在于,所述方法还包括:
通过消息订阅者获取所述共享内存的基本信息,所述基本信息包括文件描述符、总字节长度和内存块分块数目;
基于所述基本信息在消息订阅者的进程中映射形成一个链表,所述链表中包含有与所述每个内存块分别对应的管理块,所述管理块中包含内存块的编号和首地址。
6.如权利要求5所述的进程间通信方法,其特征在于,所述方法还包括:
根据消息订阅者收到的所述编号在所述链表中找到与该编号对应的首地址;
根据消息订阅者收到的所述编号和与该编号对应的首地址定位当前消息的数据所在的目标内存块;
提取定位到的目标内存块中的所述校验计数;
将提取到的所述校验计数与消息订阅者收到的所述校验计数进行比较;
当提取到的所述校验计数与消息订阅者收到的所述校验计数相同时,则使用定位到的目标内存块中的数据;
当提取到的所述校验计数与消息订阅者收到的所述校验计数不相同时,表明当前消息不再有效,则不使用定位到的目标内存块中的数据。
7.如权利要求4所述的进程间通信方法,其特征在于,将目标内存块归还给所述空闲内存块列表进行管理,包括:
根据目标内存块对应的所述编号和所述首地址定位到目标内存块;
如果目标内存块中存在所述校验计数,则将所述校验计数清除;
将目标内存块对应的所述结构体添加到所述空闲内存块列表中进行管理。
8.一种进程间通信装置,其特征在于,包括:
分块模块,用于将共享内存划分为若干个内存块,对每个内存块进行唯一编号;
空闲内存块列表形成模块,用于基于所述每个内存块的所述编号形成空闲内存块列表,通过所述空闲内存块列表根据所述编号对所述若干个内存块进行使用状态管理;
通信链接建立模块,用于在消息订阅者和消息发布者的进程之间建立通信链接;
数据写入模块,用于当消息发布者从所述若干个内存块中申请目标内存块后,将消息发布者待发送的数据写入所述目标内存块,并将目标内存块对应的编号从所述空闲内存块列表中移除,将目标内存块对应的编号由消息发布者持有;
数据发送及归还模块,用于当接收到消息发布者判断目标内存块中的数据是需要发送的消息时,对目标内存块写入校验计数,将目标内存块对应的编号和所述校验计数发送至消息订阅者,同时维护一个先进先出的历史消息队列,将所述编号放入所述历史消息队列中,当所述历史消息队列中最先进入的编号被删除时,将所述最先进入的编号对应的目标内存块归还给所述空闲内存块列表进行管理,其中,所述编号和所述校验计数为消息订阅者获取所述数据的依据;
归还模块,用于当接收到消息发布者判断目标内存块中的数据是不需要发送的消息时,将目标内存块归还给所述空闲内存块列表进行管理。
9.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述的进程间通信方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有执行权利要求1至7中任一项所述的进程间通信方法的计算机程序。
CN202311016375.2A 2023-08-14 2023-08-14 进程间通信方法、装置、计算机设备及介质 Pending CN117149452A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311016375.2A CN117149452A (zh) 2023-08-14 2023-08-14 进程间通信方法、装置、计算机设备及介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311016375.2A CN117149452A (zh) 2023-08-14 2023-08-14 进程间通信方法、装置、计算机设备及介质

Publications (1)

Publication Number Publication Date
CN117149452A true CN117149452A (zh) 2023-12-01

Family

ID=88905274

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311016375.2A Pending CN117149452A (zh) 2023-08-14 2023-08-14 进程间通信方法、装置、计算机设备及介质

Country Status (1)

Country Link
CN (1) CN117149452A (zh)

Similar Documents

Publication Publication Date Title
US5191652A (en) Method and apparatus for exploiting communications bandwidth as for providing shared memory
EP0889622B1 (en) Apparatus and method for remote buffer allocation and management for message passing between network nodes
EP0551242B1 (en) Multiprocessor buffer system
CN106844041B (zh) 内存管理的方法及内存管理系统
US20100064072A1 (en) Dynamically Adjustable Arbitration Scheme
CN111431757B (zh) 虚拟网络的流量采集方法及装置
EP0755013B1 (fr) Système informatique multinodal et procédé de transfert de messages dans ledit système informatique multinodal
CN105630731A (zh) 一种多cpu环境下网卡数据处理方法和装置
JP6763984B2 (ja) インフィニバンド(IB)上で仮想ホストバスアダプタ(vHBA)を管理およびサポートするためのシステムおよび方法、ならびに単一の外部メモリインターフェイスを用いてバッファの効率的な使用をサポートするためのシステムおよび方法
CN103827842A (zh) 向控制器存储器空间写入消息
US11010165B2 (en) Buffer allocation with memory-based configuration
CN114244790B (zh) PCIe设备与主机设备的通信方法、系统及设备
US11928504B2 (en) System and method for queuing work within a virtualized scheduler based on in-unit accounting of in-unit entries
US7710904B2 (en) Ring network with variable token activation
US10229073B2 (en) System-on-chip and method for exchanging data between computation nodes of such a system-on-chip
US5572697A (en) Apparatus for recovering lost buffer contents in a data processing system
CN111857992B (zh) 一种Radosgw模块中线程资源分配方法和装置
US11093405B1 (en) Shared mid-level data cache
CN111475202A (zh) 基于异构多处理系统的核间通信方法及系统
CN104052831A (zh) 一种基于队列的数据传输方法、装置及通信系统
CN117149452A (zh) 进程间通信方法、装置、计算机设备及介质
CN101196833B (zh) 用于存储器利用的方法和装置
US11036643B1 (en) Mid-level instruction cache
CN117608874A (zh) 自动驾驶应用层内存分配方法、装置、计算机设备及介质
US11327890B1 (en) Partitioning in a processor cache

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