CN110704214B - 进程间通信方法和装置 - Google Patents
进程间通信方法和装置 Download PDFInfo
- Publication number
- CN110704214B CN110704214B CN201910972907.7A CN201910972907A CN110704214B CN 110704214 B CN110704214 B CN 110704214B CN 201910972907 A CN201910972907 A CN 201910972907A CN 110704214 B CN110704214 B CN 110704214B
- Authority
- CN
- China
- Prior art keywords
- node
- memory
- space
- max
- free
- 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
-
- 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/542—Event management; Broadcasting; Multicasting; Notifications
-
- 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)
- Multimedia (AREA)
- Mobile Radio Communication Systems (AREA)
Abstract
本公开提出一种进程间通信方法和装置,涉及计算机技术领域。本公开的一种进程间通信方法包括:确定通讯消息的数据大小;根据数据大小向内存分配器申请共享内存,获取分配的共享内存地址;根据分配的共享内存地址将通讯消息存入共享内存,更新存储通讯消息的共享内存地址的状态;通过广播消息发送通讯消息在共享内存的存放信息,以便接收方根据存放信息读取通讯消息。通过这样的方法,能够基于通讯消息的大小申请共享内存,从而为通讯消息分配合适的空间,避免空间的浪费和碎片化,提高通讯成功的可能性,减少了排队的可能性,从而提高了进程间通讯的可靠性和效率。
Description
技术领域
本公开涉及计算机技术领域,特别是一种进程间通信方法和装置。
背景技术
进程间通信是为了实现不同进程之间相互传递信息的通信,在数据通讯的各种运用中有广泛使用。进程间通讯的可靠度和效率对其应用场景的反应速度和可靠性都有很大的影响,如在无人车的跨进程模块的通讯中,对进程间通讯的可靠性和效率较高。
在相关技术中,进程间通讯可以通过网络接口在本地进行通信实现。进程间通讯也可以基于固定块大小的共享内存,使用一组拥有固定大小的片段的共享内存进行通信,一般使用循环队列实现,进程1将数据写在某一个大小足够的片段中,将该片段地址通过网络广播出去,进程2,3,4等监听该广播的进程通过地址,进入该内存片段提取信息。
发明内容
本公开的一个目的在于提高进程间通信的可靠度和效率。
根据本公开的一个方面,提出一种进程间通信方法,包括:确定通讯消息的数据大小;根据数据大小向内存分配器申请共享内存,获取分配的共享内存地址;根据分配的共享内存地址将通讯消息存入共享内存,更新存储通讯消息的共享内存地址的状态;通过广播消息发送通讯消息在共享内存的存放信息,以便接收方根据存放信息读取通讯消息。
在一些实施例中,进程间通信方法还包括:将通讯消息序列化处理,获取序列化数据;确定通讯消息的数据大小为:获取序列化数据的数据大小。
在一些实施例中,进程间通信方法还包括:在将通讯消息存入共享内存时,设置通讯消息在共享内存的过期时间,并标识存储通讯消息的共享内存地址的状态为已占用;在通讯消息在共享内存中存储的时间达到过期时间的情况下,清除共享内存中的通讯消息,并标识清空的共享内存的状态为未占用。
在一些实施例中,根据数据大小向内存分配器申请共享内存包括:将数据大小以原子单位大小向上取整,获取请求量;向内存分配器申请不小于请求量的连续空间。
在一些实施例中,根据数据大小向内存分配器申请共享内存还包括:内存分配器比较请求量与当前内存结点的本区间内连续最长可分配区间大小max_free_space;其中,内存以线段树结构管理,每个内存结点对应一段内存区间[内存区间的开始地址,内存区间的结束地址),线段树的叶子结点为单个原子单位大小;
若max_free_space小于请求量,则确定在当前内存结点分配失败;
若max_free_space等于请求量,则返回当前内存结点的内存区间地址;
若max_free_space大于请求量,则确定在当前内存结点分配共享内存空间存储通讯消息。
在一些实施例中,确定在当前内存结点分配共享内存空间存储通讯消息包括:若max_free_space大于请求量,则判断当前内存结点的左子结点的max_free_space是否不小于请求量;若左子结点的max_free_space不小于请求量,则以左子结点为当前内存结点,执行比较请求量与当前内存结点的max_free_space的操作;
若左子结点的max_free_space小于请求量,则判断当前内存结点的右子结点的max_free_space是否不小于请求量;若右子结点的max_free_space不小于请求量,则以右子结点为当前内存结点,执行比较请求量与当前内存结点的max_free_space的操作;
若左子结点的max_free_space小于请求量且右子结点的max_free_space小于请求量,则确定分配内存起始点地址S为当前内存结点的左子结点的截止点地址与左子结点的内存区间内从右侧开始的连续可分配区间大小max_right_free_space之差,返回内存区间地址[S,S+请求量)。
在一些实施例中,标识存储通讯消息的共享内存地址的状态包括:
将分配的内存区间的状态标记为已占用;
更新当前内存结点及到叶子结点的各级子结点的max_free_space、内存区间内从左侧开始的连续可分配区间大小max_left_free_space和max_right_free_space。
在一些实施例中,更新当前内存结点及到叶子结点的各级子结点的max_free_space、max_left_free_space和max_right_free_space包括:
在当前内存结点非叶子结点的情况下:
若当前内存结点的状态为已占用,则将当前内存结点的左子结点、右字结点的max_free_space、max_left_free_space和max_right_free_space设置为0;
若当前内存结点的状态为未占用,且左子结点的长度为L,右子结点的长度为R,则将左子结点的max_free_space、max_left_free_space和max_right_free_space设置为L,将右子结点的max_free_space、max_left_free_space和max_right_free_space设置为R。
在一些实施例中,清除共享内存中的通讯消息包括:将清除通讯消息的内存区间的状态标记为未占用;更新当前内存结点及到叶子结点的各级子结点的本区间内连续最长可分配区间大小max_free_space、内存区间内从左侧开始的连续可分配区间大小max_left_free_space和内存区间内从右侧开始的连续可分配区间大小max_right_free_space。
在一些实施例中,接收方根据存放信息读取通讯消息包括:接收广播消息,在确定需要读取数据的情况下,根据广播消息中的共享内存地址读取数据;解密读取的数据并做校验处理;在校验成功的情况下,将数据反序列化后推送给对应的线程。
通过这样的方法,能够基于通讯消息的大小申请共享内存,从而为通讯消息分配合适的空间,避免空间的浪费和碎片化,提高通讯成功的可能性,减少了排队的可能性,从而提高了进程间通讯的可靠性和效率。
根据本公开的另一些实施例的一个方面,提出一种进程间通信装置,包括:数据大小确定单元,被配置为确定通讯消息的数据大小;地址请求单元,被配置为根据数据大小向内存分配器申请共享内存,获取分配的共享内存地址;存储单元,被配置为根据分配的共享内存地址将通讯消息存入共享内存;消息发送单元,被配置为通过广播消息发送通讯消息在共享内存的存放信息,以便接收方根据存放信息读取通讯消息;和内存分配器,被配置为根据数据大小分配共享内存,反馈共享内存地址,并更新存储通讯消息的共享内存地址的状态。
在一些实施例中,进程间通信装置还包括:接收单元,被配置为接收广播消息,在确定需要读取数据的情况下,根据广播消息中的共享内存地址读取数据;解密单元,被配置为解密读取的数据并做校验处理;推送单元,被配置为在校验成功的情况下,将数据反序列化后推送给对应的线程。
根据本公开的又一些实施例的一个方面,提出一种进程间通信装置,包括:存储器;以及耦接至存储器的处理器,处理器被配置为基于存储在存储器的指令执行上文中任意一种进程间通信方法。
这样的进程间通信装置能够基于通讯消息的大小申请共享内存,从而为通讯消息分配合适的空间,避免空间的浪费和碎片化,提高通讯成功的可能性,减少了排队的可能性,从而提高了进程间通讯的可靠性和效率。
根据本公开的再一些实施例的一个方面,提出一种计算机可读存储介质,其上存储有计算机程序指令,该指令被处理器执行时实现上文中任意一种进程间通信方法的步骤。
通过执行这样的计算机可读存储介质上的指令,能够基于通讯消息的大小申请共享内存,从而为通讯消息分配合适的空间,避免空间的浪费和碎片化,提高通讯成功的可能性,减少了排队的可能性,从而提高了进程间通讯的可靠性和效率。
附图说明
此处所说明的附图用来提供对本公开的进一步理解,构成本公开的一部分,本公开的示意性实施例及其说明用于解释本公开,并不构成对本公开的不当限定。在附图中:
图1为本公开的进程间通信方法的一些实施例的流程图。
图2A为本公开的进程间通信方法中分配共享内存的一些实施例的流程图。
图2B为本公开的进程间通信方法中内存管理的一些实施例的示意图。
图3为本公开的进程间通信方法的另一些实施例的流程图。
图4为本公开的进程间通信装置的一些实施例的示意图。
图5为本公开的进程间通信装置的另一些实施例的示意图。
图6为本公开的进程间通信装置的又一些实施例的示意图。
具体实施方式
下面通过附图和实施例,对本公开的技术方案做进一步的详细描述。
在相关的进程间通信方式中,若采用网络接口在本地进行通信的方法,则所有通信数据都需要通过网络接口进行传输。数据越大,频率越高,则延时越大,资源占用越大。
另外,若采用基于固定块大小的共享内存进行进程间通信,则:
a.假设内存块划分数为n,已被占用的内存区间数为m,则算法判断内存是否可用,需要对分配区间,遍历已占用内存的集合做区间与区间是否相交的判断,复杂度O(nm),在释放内存时,也需要对占用内存的集合进行o(m)的操作,效率低。
b.每个内存块需要有一个存活时间,当终止时需要被系统释放和重新利用。而与过期管理结合时,由于每次释放的复杂度高,系统效率低下。
c.即便如此,线性分配返回的区间属于先找到先处理,对全局分布不敏感,比线段树分配更易出现碎片。
d.需要占用大量内存,内存利用率低下。因为每一份数据都需要一个足够大小的内存片段进行存储。然而若数据过小,内存片段过大,便会浪费内存空间。因此,内存片段可以通过提供几组大小不同的内存片段来适应数据传输的需求。然而,不同情况下的数据大小不一致,常常会有数据集中使用其中某几个片段的情况,其余大小的内存片段则长期处于闲置状态。除非可以提前对通信信息大小做预估,否则无法很好地适应变化。因此,共享内存所需内存空间大,而空间利用率过低。
本公开的进程间通信方法的一些实施例的流程图如图1所示。
在步骤101中,确定通讯消息的数据大小。在一些实施例中,可以先将通讯消息序列化处理,获取序列化数据,进而获取序列化数据的数据大小。
在步骤102中,根据数据大小向内存分配器申请共享内存,获取分配的共享内存地址。
在一些实施例中,内存空间以线段树的方式管理。线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个结点在若干条线段中出现的次数。内存分配器会按照数据大小分配适合的空闲空间,该空闲空间不小于数据大小,且大于数据大小的量小于线段树的原子单位,该原子单位为线段树叶子结点的大小。
在步骤103中,根据分配的共享内存地址将通讯消息存入共享内存,更新存储通讯消息的共享内存地址的状态。
在步骤104中,通过广播消息发送通讯消息在共享内存的存放信息,以便接收方根据存放信息读取通讯消息。在一些实施例中,广播消息中可以包括存放通讯消息的共享内存地址的共享内存偏移量以便接收端读取。在一些实施例中,为确定接收端使用该消息的线程,广播消息中还可以包括消息的channel。在一些实施例中,为了提高可靠性、安全性等,广播消息中还可以包括与共享内存加密密钥、大小以及校验码等。
通过这样的方法,能够基于通讯消息的大小申请共享内存,从而为通讯消息分配合适的空间,避免空间的浪费和碎片化,提高通讯成功的可能性,减少了排队的可能性,从而提高了进程间通讯的可靠性和效率。
本公开的进程间通信方法中分配共享内存的一些实施例的流程图如图2A所示。
在步骤201中,将数据大小以原子单位大小向上取整,获取请求量。在一些实施例中,原子单位可以是将共享内存空间以线段树结构管理后叶子结点的空间大小,如1MB。读取将要写入数据的数据大小(size),对size向上取整到最接近的原子单位大小,例如当原子单位是1MB时,1.2MB向上取整为2MB,从而计算出在线段树上的量为2MB/MB=2,即需要占用两个叶子结点的存储空间。
线段树每个结点代表了一段内存区间[start,end),左为闭区间,右为开区间。在一些实施例中,线段树内存管理结构可以如图2B所示,可以对线段树内存管理结构做如下处理:
1.添加字段max_free_space,代表本区间内连续最长的可分配区间大小。
2.添加字段max_left_free_space代表本区间内,从左开始,连续最长的可分配区间大小。
3.添加字段max_right_free_space代表本区间内,从右开始,连续最长的可分配区间大小。
4.添加字段lazy,取值为-1,0,1,分别表示已标记为全部释放,未被标记,已标记为全部占用。
在步骤202中,向内存分配器申请不小于请求量的连续空间。
在步骤203中,内存分配器比较请求量与当前内存结点的本区间内连续最长可分配区间大小max_free_space。在max_free_space<请求量的情况下,执行步骤204;在max_free_space=请求量的情况下,执行步骤205;在max_free_space>请求量的情况下,执行步骤206。
在步骤204中,确定当前内存结点的存储空间不足,在当前内存结点分配失败。在一些实施例中,可以按照预定顺序选择下一内存结点执行步骤203的操作。
在步骤205中,确定当前内存结点的剩余空间恰好能够满足需求,返回当前内存结点的内存区间地址。
在步骤206中,判断当前内存结点的左子结点的max_free_space是否不小于请求量。左子结点为与当前内存结点层级相邻的当前内存结点的儿子结点。若左子结点的max_free_space小于请求量,则执行步骤208;若不小于请求量,则执行步骤207。
在步骤207中,以左子结点为当前内存结点,继而执行步骤203。
在步骤208中,判断当前内存结点的右子结点的max_free_space是否不小于请求量。右子结点为与当前内存结点层级相邻的当前内存结点的儿子结点。若右子结点的max_free_space小于请求量,则执行步骤210;若不小于请求量,则执行步骤209。
在步骤209中,以右子结点为当前内存结点。
在一些实施例中,也可以先判断当前内存结点的右子结点的max_free_space是否不小于请求量,其次进行左子结点的比较,从而优先存储于右子结点。
在步骤210中,确定可用区间必然跨了左右子结点的区间,确定分配内存起始点地址S为当前内存结点的左子结点的截止点地址与左子结点的内存区间内从右侧开始的连续可分配区间大小max_right_free_space之差,返回内存区间地址[S,S+请求量)。
通过这样的方法,能够在循环递归过程中,以原子单位大小为颗粒度进行内存资源的分配,每次存储的通讯消息占用一个或多个原子单位大小的共享内存资源,提高对共享内存资源的利用率。另外,这样的分配方法得到了O(logn)的复杂度保障,提高了操作效率。在一些实施例中,可以将本公开的进程间通信方法应用于无人车,实现跨进程模块的通讯,从而保障了无人车进程间通信的效率。
在一些实施例中,在共享内存资源分配过程中,要实时更新各个、各层结点的状态,包括上文中提到的max_free_space、max_left_free_space、max_right_free_space以及lazy。在一些实施例中,可以按照如下步骤执行:
1.1.如果当前内存区间的lazy=1,则当前内存区间已被占用,
向调用者返回。
1.2.在当前内存结点非叶子结点的情况下,若lazy不为0:
1.2.1.若当前lazy为1,即已占用
1.2.1.1.左子结点max_free_space=0,
max_left_free_space=0,
max_right_free_space=0。
1.2.1.2.右子结点max_free_space=0,
max_left_free_space=0,
max_right_free_space=0。
1.2.2.若当前lazy为-1,即未占用,左子结点代表区间长度为L,右子结点代表区间长度R,则:
1.2.2.1.左子结点max_free_space=L,
max_left_free_space=L,
max_right_free_space=L。
1.2.2.2.右子结点max_free_space=R,
max_left_free_space=R,
max_right_free_space=R。
1.3.如果当前区间即是目标区间,则设置
lazy=1,
max_free_space=0,
max_left_free_space=0,
max_right_free_space=0,
向调用者返回。
1.4.如果要占用的区间,当前内存结点的截止点end、当前内存结点的起始点strat,以及中间点为mid,存在如下关系:
end<=mid=(start+end)/2,则将当前结点设为左子结点,递归执行步骤1.1。
1.5.否则,如果要占用的区间start>=mid,则将当前结点设为右子结点,递归执行步骤1.1。
1.6.否则,说明要占用的区间在左右孩子结点都需要进行占用,假设锁定区间为[lock_start,lock_end)。
1.6.1.将占用区间修改为[lock_start,mid),当前区间设定为左子结点,递归执行步骤1.1。
1.6.2.将占用区间修改为[mid,lock_end),当前区间设定为右子结点,递归执行步骤1.1。
1.7.利用动态规划,更新当前区间的状态值。
1.7.1.当前结点的max_free_space的最大值为左子结点max_free_space,右子结点max_free_space,左子结点max_right_free_space+右子结点max_right_free_space这三个值中的最大值。
1.7.2.设置当前结点的max_left_free_space为左子结点max_left_free_space。
1.7.3.设置当前结点的max_right_free_space为右子结点max_right_free_space。
1.7.4.当左子结点max_left_free_space等于左子结点的区间长度时,设置当前结点的max_left_free_space为左子结点max_left_free_space+右子结点max_left_free_space。
1.7.5.当右子结点max_right_free_space等于右子结点的区间长度时,设置当前结点的max_right_free_space为右子结点max_right_free_space+左子结点max_right_free_space。
1.7.6.向调用者返回
通过这样的方法,能够及时记录共享内存空间的状态,以便在共享内存资源分配过程中能够迅速、准确的分配资源,避免内存资源重复占用造成的通信故障,提高交互的可靠性。
在一些实施例中,为保障共享内存资源的循环利用,可以在数据拷贝入共享内存时设置过期时间,可以推入本进程的过期管理模块内以时间从小到大顺序排序的优先队列;另外,在内存释放过程中也要实时更新各个、各层结点的状态,包括上文中提到的max_free_space、max_left_free_space、max_right_free_space以及lazy。在一些实施例中,可以按照如下步骤执行:
1.1.如果当前的区间lazy=-1,向调用者返回。
1.2.若非叶子结点,且lazy不为0
1.2.1.若当前lazy为1
1.2.1.1.左子结点max_free_space=0,
max_left_free_space=0,
max_right_free_space=0。
1.2.1.2.右子结点max_free_space=0,
max_left_free_space=0,
max_right_free_space=0。
1.2.2.若当前lazy为-1,即未占用,左子结点代表区间长度为L,右子结点代表区间长度R,则:
1.2.2.1.左子结点max_free_space=L,
max_left_free_space=L,
max_right_free_space=L。
1.2.2.2.右子结点max_free_space=R,
max_left_free_space=R,
max_right_free_space=R。
1.3.如果当前区间即是目标区间,则lazy=-1,max_free_space=区间长度,max_left_free_space=区间长度,max_right_free_space=区间长度,向调用者返回。
1.4.如果要释放的区间,end<=mid=(start+end)/2,则将当前结点设为左子结点,递归执行步骤1.1。
1.5.否则,如果要释放的区间,start>=mid,则将当前结点设为右子结点,递归执行步骤1.1。
1.6.否则,说明要释放的区间在左右孩子结点都需要进行释放,假设释放区间为[release_start,release_end)。
1.6.1.将占用区间修改为[release_start,mid),当前区间设定为左子结点,递归执行步骤1.1。
1.6.2.将占用区间修改为[mid,release_end),当前区间设定为右子结点,递归执行步骤1.1。
1.7.利用动态规划,更新当前区间的状态值。
1.7.1.max_free_space的最大值为左子结点max_free_space,右子结点max_free_space,左子结点max_right_free_space+右子结点max_right_free_space这三个值中的最大值。
1.7.2.max_left_free_space为左子结点max_left_free_space。
1.7.3.max_right_free_space为右子结点max_right_free_space。
1.7.4.当左子结点max_left_free_space等于左子结点的区间长度时,设置当前结点max_left_free_space为左子结点max_left_free_space+右子结点max_left_free_space。
1.7.5.max_right_free_space等于右子结点的区间长度时,设置当前结点的max_right_free_space为右子结点max_right_free_space+左子结点max_right_free_space。
1.7.6.向调用者返回
通过这样的方法,能够及时使共享内存中存储的数据过期,并更新内存结点的相关信息,使共享内存资源得到循环利用,提高资源的利用率,同时也提高通讯成功的可能性,减少了排队的可能性,提高进程间通讯的可靠性和效率。
本公开的进程间通信方法的另一些实施例的流程图如图3所示。
在步骤301中,将通讯消息序列化处理,获取序列化数据,获取序列化数据的数据大小。
在步骤302中,根据数据大小向内存分配器申请共享内存,获取分配的共享内存地址。在一些实施例中,内存分配器可以采用如图2所示实施例中的方式进行共享内存资源的分配,在一些实施例中,内存分配器还可以对内存结点的状态进行管理。
在步骤303中,根据内存分配器分配的共享内存地址将通讯消息存入共享内存。
在步骤304中,设置通讯消息在共享内存的过期时间,并标识存储通讯消息的共享内存地址的状态为已占用。在一些实施中,可以由内存分配器针对过期时间对内存空间进行管理。
在步骤305中,通过广播消息发送通讯消息在共享内存的存放信息。
在步骤306中,接收方接收广播消息,判断是否进行读取。在确定需要读取数据的情况下,根据广播消息中的共享内存地址读取数据。
在步骤307中,解密读取的数据并做校验处理。在一些实施例中,可以根据读取的数据生成校验信息,与广播消息中校验码比对。
在步骤308中,在校验码与生成的校验信息匹配成功的情况下,执行步骤309;在一些实施例中,若校验不成功,则可以重新从共享内存中读取信息。
在步骤309中,将数据推送给对应的线程。在一些实施例中,由于通讯信息是序列化后存入共享内存,因此在读取后可以先执行反序列化操作,进而推送给对应的线程。在一些实施例中,可以将反序列化的数据生成内存对象,根据广播消息中的channel信息,将内存对象存入channel所在的队列,等待应用回调。
通过这样的方法,利用线段树这一数据表示方法表示了共享内存的区间,通过对其结点状态的记录,利用树型动态规划实现了基于此的内存分配方法,使得以上操作的效率得到了O(logn)的复杂度保障,保证了内存利用率和通讯效率。
在一些实施例中,内存管理器可以实时管理存入共享内存的数据的过期状态,如图3所示:
在步骤311中,判断通讯消息在共享内存中存储的时间达到过期时间。若未达到过期时间,则可以持续监测;若达到过期时间,则执行步骤312。
在步骤312中,清除共享内存中的通讯消息,并标识清空的共享内存的状态为未占用。
在步骤313中,更新当前内存结点及到叶子结点的各级子结点的max_free_space、max_left_free_space和max_right_free_space。在一些实施例中,可以采用上文中提到的方法、步骤执行标识共清空的共享内存的状态和更新相关信息的操作。
通过这样的方法,能够使共享内存资源得到循环利用,提高资源的利用率和通讯成功的可能性,减少了排队的可能性,提高进程间通讯的可靠性和效率。
本公开的进程间通信装置400的一些实施例的示意图如图4所示。进程间通信装置400包括发送端功能模块和内存管理器。
内存分配器410能够根据数据大小分配共享内存,向请求者反馈共享内存地址,并更新存储通讯消息的共享内存地址的状态。
发送端功能模块可以包括:
数据大小确定单元401能够确定通讯消息的数据大小。在一些实施例中,可以先将通讯消息序列化处理,获取序列化数据,进而获取序列化数据的数据大小。
地址请求单元402能够根据数据大小向内存分配器申请共享内存,获取分配的共享内存地址。在一些实施例中,内存空间以线段树的方式管理。内存分配器会按照数据大小分配适合的空闲空间,该空闲空间不小于数据大小,且大于数据大小的量小于线段树的原子单位,该原子单位为线段树叶子结点的大小。
存储单元403能够根据分配的共享内存地址将通讯消息存入共享内存。
消息发送单元404能够通过广播消息发送通讯消息在共享内存的存放信息,以便接收方根据存放信息读取通讯消息。在一些实施例中,广播消息中可以包括存放通讯消息的共享内存地址的共享内存偏移量以便接收端读取。在一些实施例中,为确定接收端使用该消息的线程,广播消息中还可以包括消息的channel。在一些实施例中,为了提高可靠性、安全性等,广播消息中还可以包括与共享内存加密密钥、大小以及校验码等。
这样的装置能够基于通讯消息的大小申请共享内存,从而为通讯消息分配合适的空间,避免空间的浪费和碎片化,提高通讯成功的可能性,减少了排队的可能性,从而提高了进程间通讯的可靠性和效率。
在一些实施例中,进程间通信装置400还可以包括接收端功能模块,包括:
接收单元421,能够接收广播消息,判断是否进行读取。在确定需要读取数据的情况下,根据广播消息中的共享内存地址读取数据。
解密单元422,能够解密读取的数据并做校验处理。在一些实施例中,可以根据读取的数据生成校验信息,与广播消息中校验码比对。
推送单元423,能够在校验成功的情况下,将数据反序列化后推送给对应的线程。在一些实施例中,由于通讯信息是序列化后存入共享内存,因此在读取后可以先执行反序列化操作,进而推送给对应的线程。在一些实施例中,可以将反序列化的数据生成内存对象,根据广播消息中的channel信息,将内存对象存入channel所在的队列,等待应用回调。
这样的装置利用线段树这一数据表示方法表示了共享内存的区间,通过对其结点状态的记录,利用树型动态规划实现了基于此的内存分配方法,使得以上操作的效率得到了O(logn)的复杂度保障,保证了内存利用率和通讯效率。
本公开进程间通信装置的一个实施例的结构示意图如图5所示。进程间通信装置包括存储器501和处理器502。其中:存储器501可以是磁盘、闪存或其它任何非易失性存储介质。存储器用于存储上文中进程间通信方法的对应实施例中的指令。处理器502耦接至存储器501,可以作为一个或多个集成电路来实施,例如微处理器或微控制器。该处理器502用于执行存储器中存储的指令,能够提高进程间通讯的可靠性和效率。
在一个实施例中,还可以如图6所示,进程间通信装置600包括存储器601和处理器602。处理器602通过BUS总线603耦合至存储器601。该进程间通信装置600还可以通过存储接口604连接至外部存储装置605以便调用外部数据,还可以通过网络接口606连接至网络或者另外一台计算机系统(未标出)。此处不再进行详细介绍。
在该实施例中,通过存储器存储数据指令,再通过处理器处理上述指令,能够提高进程间通讯的可靠性和效率。
在另一个实施例中,一种计算机可读存储介质,其上存储有计算机程序指令,该指令被处理器执行时实现进程间通信方法对应实施例中的方法的步骤。本领域内的技术人员应明白,本公开的实施例可提供为方法、装置、或计算机程序产品。因此,本公开可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本公开可采用在一个或多个其中包含有计算机可用程序代码的计算机可用非瞬时性存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本公开是参照根据本公开实施例的方法、设备(系统)和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
至此,已经详细描述了本公开。为了避免遮蔽本公开的构思,没有描述本领域所公知的一些细节。本领域技术人员根据上面的描述,完全可以明白如何实施这里公开的技术方案。
可能以许多方式来实现本公开的方法以及装置。例如,可通过软件、硬件、固件或者软件、硬件、固件的任何组合来实现本公开的方法以及装置。用于所述方法的步骤的上述顺序仅是为了进行说明,本公开的方法的步骤不限于以上具体描述的顺序,除非以其它方式特别说明。此外,在一些实施例中,还可将本公开实施为记录在记录介质中的程序,这些程序包括用于实现根据本公开的方法的机器可读指令。因而,本公开还覆盖存储用于执行根据本公开的方法的程序的记录介质。
最后应当说明的是:以上实施例仅用以说明本公开的技术方案而非对其限制;尽管参照较佳实施例对本公开进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本公开的具体实施方式进行修改或者对部分技术特征进行等同替换;而不脱离本公开技术方案的精神,其均应涵盖在本公开请求保护的技术方案范围当中。
Claims (13)
1.一种进程间通信方法,包括:
确定通讯消息的数据大小;
根据所述数据大小向内存分配器申请共享内存,包括:
将所述数据大小以原子单位大小向上取整,获取请求量;
向所述内存分配器申请不小于所述请求量的连续空间;
所述内存分配器比较所述请求量与当前内存结点的本区间内连续最长可分配区间大小max_free_space;其中,所述内存以线段树结构管理,每个内存结点对应一段内存区间[内存区间的开始地址,内存区间的结束地址),所述线段树的叶子结点为单个原子单位大小;
若max_free_space大于所述请求量,则确定在当前内存结点分配共享内存空间存储所述通讯消息,包括:
若max_free_space大于所述请求量,则判断当前内存结点的左子结点的max_free_space是否不小于所述请求量;若所述左子结点的max_free_space不小于所述请求量,则以所述左子结点为所述当前内存结点,执行比较所述请求量与当前内存结点的max_free_space的操作;
若左子结点的所述max_free_space小于所述请求量,则判断当前内存结点的右子结点的max_free_space是否不小于所述请求量;若所述右子结点的max_free_space不小于所述请求量,则以所述右子结点为所述当前内存结点,执行比较所述请求量与当前内存结点的max_free_space的操作;
若左子结点的所述max_free_space小于所述请求量且所述右子结点的所述max_free_space小于所述请求量,则确定分配内存起始点地址S为当前内存结点的左子结点的截止点地址与所述左子结点的内存区间内从右侧开始的连续可分配区间大小max_right_free_space之差,返回内存区间地址[S,S+请求量);
获取分配的共享内存地址;
根据分配的所述共享内存地址将所述通讯消息存入所述共享内存,更新存储所述通讯消息的共享内存地址的状态;
通过广播消息发送所述通讯消息在所述共享内存的存放信息,以便接收方根据所述存放信息读取所述通讯消息。
2.根据权利要求1所述的方法,还包括:将通讯消息序列化处理,获取序列化数据;
所述确定通讯消息的数据大小为:获取序列化数据的数据大小。
3.根据权利要求1所述的方法,还包括:
在将所述通讯消息存入所述共享内存时,设置所述通讯消息在所述共享内存的过期时间,并标识存储所述通讯消息的共享内存地址的状态为已占用;
在所述通讯消息在所述共享内存中存储的时间达到所述过期时间的情况下,清除所述共享内存中的所述通讯消息,并标识清空的所述共享内存的状态为未占用。
4.根据权利要求3所述的方法,其中,所述根据所述数据大小向内存分配器申请共享内存还包括:
若max_free_space小于所述请求量,则确定在当前内存结点分配失败;
若max_free_space等于所述请求量,则返回所述当前内存结点的内存区间地址。
5.根据权利要求1所述的方法,其中,所述根据所述数据大小向内存分配器申请共享内存还包括:
若max_free_space小于所述请求量,则确定在当前内存结点分配失败;
若max_free_space等于所述请求量,则返回所述当前内存结点的内存区间地址。
6.根据权利要求4所述的方法,其中,所述标识存储所述通讯消息的共享内存地址的状态包括:
将分配的内存区间的状态标记为已占用;
更新当前内存结点及到叶子结点的各级子结点的max_free_space、内存区间内从左侧开始的连续可分配区间大小max_left_free_space和max_right_free_space。
7.根据权利要求6所述的方法,其中,所述更新当前内存结点及到叶子结点的各级子结点的max_free_space、max_left_free_space和max_right_free_space包括:
在当前内存结点非叶子结点的情况下:
若当前内存结点的状态为已占用,则将当前内存结点的左子结点、右子结点的max_free_space、max_left_free_space和max_right_free_space设置为0;
若当前内存结点的状态为未占用,且左子结点的长度为L,右子结点的长度为R,则将左子结点的max_free_space、max_left_free_space和max_right_free_space设置为L,将右子结点的max_free_space、max_left_free_space和max_right_free_space设置为R。
8.根据权利要求3所述的方法,其中,所述清除所述共享内存中的所述通讯消息包括:
将清除通讯消息的内存区间的状态标记为未占用;
更新当前内存结点及到叶子结点的各级子结点的本区间内连续最长可分配区间大小max_free_space、内存区间内从左侧开始的连续可分配区间大小max_left_free_space和内存区间内从右侧开始的连续可分配区间大小max_right_free_space。
9.根据权利要求1所述的方法,其中,所述接收方根据所述存放信息读取所述通讯消息包括:
接收所述广播消息,在确定需要读取数据的情况下,根据所述广播消息中的共享内存地址读取数据;
解密读取的数据并做校验处理;
在校验成功的情况下,将数据反序列化后推送给对应的线程。
10.一种进程间通信装置,包括:
数据大小确定单元,被配置为确定通讯消息的数据大小;
地址请求单元,被配置为根据所述数据大小向内存分配器申请共享内存,获取分配的共享内存地址,包括:将所述数据大小以原子单位大小向上取整,获取请求量;向内存分配器申请不小于所述请求量的连续空间;
存储单元,被配置为根据分配的所述共享内存地址将所述通讯消息存入所述共享内存;
消息发送单元,被配置为通过广播消息发送所述通讯消息在所述共享内存的存放信息,以便接收方根据所述存放信息读取所述通讯消息;和
内存分配器,被配置为根据所述数据大小分配共享内存,反馈共享内存地址,并更新存储所述通讯消息的共享内存地址的状态,包括:
比较所述请求量与当前内存结点的本区间内连续最长可分配区间大小max_free_space;其中,所述内存以线段树结构管理,每个内存结点对应一段内存区间[内存区间的开始地址,内存区间的结束地址),所述线段树的叶子结点为单个原子单位大小;
若max_free_space大于所述请求量,则确定在当前内存结点分配共享内存空间存储所述通讯消息,包括:
若max_free_space大于所述请求量,则判断当前内存结点的左子结点的max_free_space是否不小于所述请求量;若所述左子结点的max_free_space不小于所述请求量,则以所述左子结点为所述当前内存结点,执行比较所述请求量与当前内存结点的max_free_space的操作;
若左子结点的所述max_free_space小于所述请求量,则判断当前内存结点的右子结点的max_free_space是否不小于所述请求量;若所述右子结点的max_free_space不小于所述请求量,则以所述右子结点为所述当前内存结点,执行比较所述请求量与当前内存结点的max_free_space的操作;
若左子结点的所述max_free_space小于所述请求量且所述右子结点的所述max_free_space小于所述请求量,则确定分配内存起始点地址S为当前内存结点的左子结点的截止点地址与所述左子结点的内存区间内从右侧开始的连续可分配区间大小max_right_free_space之差,返回内存区间地址[S,S+请求量)。
11.根据权利要求10所述的装置,还包括:
接收单元,被配置为接收所述广播消息,在确定需要读取数据的情况下,根据所述广播消息中的共享内存地址读取数据;
解密单元,被配置为解密读取的数据并做校验处理;
推送单元,被配置为在校验成功的情况下,将数据反序列化后推送给对应的线程。
12.一种进程间通信装置,包括:
存储器;以及
耦接至所述存储器的处理器,所述处理器被配置为基于存储在所述存储器的指令执行如权利要求1至9任一项所述的方法。
13.一种计算机可读存储介质,其上存储有计算机程序指令,该指令被处理器执行时实现权利要求1至9任意一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910972907.7A CN110704214B (zh) | 2019-10-14 | 2019-10-14 | 进程间通信方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910972907.7A CN110704214B (zh) | 2019-10-14 | 2019-10-14 | 进程间通信方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110704214A CN110704214A (zh) | 2020-01-17 |
CN110704214B true CN110704214B (zh) | 2021-05-25 |
Family
ID=69199444
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910972907.7A Active CN110704214B (zh) | 2019-10-14 | 2019-10-14 | 进程间通信方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110704214B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP4170497A1 (en) * | 2021-12-24 | 2023-04-26 | Beijing Baidu Netcom Science Technology Co., Ltd. | Access control method and apparatus for shared memory, electronic device and autonomous vehicle |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2021233187A1 (zh) * | 2020-05-18 | 2021-11-25 | 中科寒武纪科技股份有限公司 | 一种在存储器中为数据分配存储地址的方法和设备 |
CN112214329B (zh) * | 2020-11-04 | 2023-09-22 | 腾讯科技(上海)有限公司 | 内存管理方法、装置、设备及计算机可读存储介质 |
CN113485834A (zh) * | 2021-07-12 | 2021-10-08 | 深圳华锐金融技术股份有限公司 | 共享内存管理方法、装置、计算机设备和存储介质 |
CN114040136A (zh) * | 2021-11-05 | 2022-02-11 | 北京京东乾石科技有限公司 | 轨道巡检装置、图像处理方法、装置、设备和介质 |
CN113961378B (zh) * | 2021-11-16 | 2024-03-26 | 国汽智控(北京)科技有限公司 | 基于共享内存的进程间通信方法、装置及电子设备 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040268363A1 (en) * | 2003-06-30 | 2004-12-30 | Eric Nace | System and method for interprocess communication |
CN102012870A (zh) * | 2010-11-18 | 2011-04-13 | 清华大学 | 内存分配方法 |
CN103425538A (zh) * | 2012-05-24 | 2013-12-04 | 深圳市腾讯计算机系统有限公司 | 进程通讯方法及系统 |
-
2019
- 2019-10-14 CN CN201910972907.7A patent/CN110704214B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040268363A1 (en) * | 2003-06-30 | 2004-12-30 | Eric Nace | System and method for interprocess communication |
CN102012870A (zh) * | 2010-11-18 | 2011-04-13 | 清华大学 | 内存分配方法 |
CN103425538A (zh) * | 2012-05-24 | 2013-12-04 | 深圳市腾讯计算机系统有限公司 | 进程通讯方法及系统 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP4170497A1 (en) * | 2021-12-24 | 2023-04-26 | Beijing Baidu Netcom Science Technology Co., Ltd. | Access control method and apparatus for shared memory, electronic device and autonomous vehicle |
Also Published As
Publication number | Publication date |
---|---|
CN110704214A (zh) | 2020-01-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110704214B (zh) | 进程间通信方法和装置 | |
US11474972B2 (en) | Metadata query method and apparatus | |
CN111427707B (zh) | 一种基于共享内存池的ipc通信方法 | |
CN110858162B (zh) | 内存管理方法及装置、服务器 | |
CN110188110B (zh) | 一种构建分布式锁的方法及装置 | |
CN107066498B (zh) | 键值kv存储方法和装置 | |
US9372879B1 (en) | Balanced append tree data structure | |
US9602364B2 (en) | Dynamic and adaptive quota shares | |
CN109144406B (zh) | 分布式存储系统中元数据存储方法、系统及存储介质 | |
US20110131192A1 (en) | Approaches to Reducing Lock Communications In a Shared Disk Database | |
CN112905342B (zh) | 资源调度方法、装置、设备及计算机可读存储介质 | |
US10795579B2 (en) | Methods, apparatuses, system and computer program products for reclaiming storage units | |
CN112099728B (zh) | 一种执行写操作、读操作的方法及装置 | |
CN113849260A (zh) | 一种实例的处理核分配方法及装置 | |
CN113626399B (zh) | 数据同步方法、装置、服务器及存储介质 | |
CN116450328A (zh) | 内存分配方法、装置、计算机设备和存储介质 | |
CN114327642A (zh) | 一种数据读写的控制方法及电子设备 | |
CN106537321B (zh) | 存取文件的方法、装置和存储系统 | |
CN113778688B (zh) | 内存管理系统、内存管理方法、内存管理装置 | |
CN116360696A (zh) | 分布式块存储系统、介质及其电子设备 | |
CN113032414B (zh) | 数据管理方法、装置、系统、计算设备及存储介质 | |
CN112346848A (zh) | 一种管理内存池的方法、装置及终端 | |
CN112883239B (zh) | 一种资源分配方法、装置、计算机设备及存储介质 | |
CN114371945A (zh) | 报文的传输方法、装置、电子设备及计算机存储介质 | |
CN110865901B (zh) | 组建ec条带的方法和装置 |
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 |