一种基于处理器共享内存的数据发送、接收方法及装置.pdf

上传人:54 文档编号:1034687 上传时间:2018-03-27 格式:PDF 页数:29 大小:1.24MB
返回 下载 相关 举报
摘要
申请专利号:

CN200910127803.2

申请日:

2009.03.23

公开号:

CN101504617A

公开日:

2009.08.12

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效|||公开

IPC分类号:

G06F9/46; G06F15/167

主分类号:

G06F9/46

申请人:

华为技术有限公司

发明人:

杨 炼

地址:

518129广东省深圳市龙岗区坂田华为基地总部办公楼

优先权:

专利代理机构:

北京三友知识产权代理有限公司

代理人:

任默闻

PDF下载: PDF下载
内容摘要

本发明提供一种基于处理器共享内存的数据发送、接收方法及装置,其中,该基于处理器共享内存的数据发送方法包括:将数据写入处理器的共享内存池中的至少一内存块;根据内存块的地址信息生成内存块指针;将内存块指针发送给接收方。本发明还提供一种基于处理器共享内存的数据发送装置、一种基于处理器共享内存的数据接收方法及装置。本发明因为采用传递内存块指针,而不是消息数据本身的技术手段,所以克服了消息传送时,消息数据被多次复制的问题,进而达到了降低内存和时间两方面开销的技术效果。

权利要求书

1、  一种基于处理器共享内存的数据发送方法,其特征在于,所述方法包括:
将数据写入处理器的共享内存池中的至少一内存块;
根据所述内存块的地址信息生成内存块指针;
将所述内存块指针发送给接收方。

2、
  如权利要求1所述数据发送方法,其特征在于,如果所述数据发送是消息广播,所述方法具体包括:
消息创建:从内存池获取一内存块,作为消息缓冲区,将需要发送的消息数据写入所述消息缓冲区中的数据区;
指针生成:根据所述消息缓冲区的地址信息生成消息缓冲区指针;
消息发送:生成一队列节点,在所述队列节点中写入所述消息缓冲区的消息缓冲区指针后,将所述队列节点发送到接收任务的消息队列中。

3、
  如权利要求2所述数据发送方法,其特征在于,
所述消息创建步骤中:从内存池获取一内存块,作为消息缓冲区后,在所述消息缓冲区的消息头中增加生存期字段记录所述消息的发送次数,然后返回第一消息句柄,利用所述第一消息句柄将需要发送的消息数据写入所述消息缓冲区中的数据区;
所述消息发送步骤中:将所述消息缓冲区的消息头中的生存期递增1,生成一队列节点,在所述队列节点中写入所述消息缓冲区的消息缓冲区指针后,将所述队列节点发送到接收任务的消息队列中。

4、
  如权利要求3所述数据发送方法,其特征在于,
所述消息创建步骤中:从内存池获取一内存块,作为消息缓冲区后,在所述消息缓冲区的消息头中还写入消息名、消息类型、数据量和发送任务标识中的一种或多种。

5、
  如权利要求3所述数据发送方法,其特征在于,
如果对所述需要发送的消息进行多次广播发送,则重复调用所述消息发送步骤,从而生成多个队列节点,分别发送到不同接收任务的消息队列中。

6、
  如权利要求1所述数据发送方法,其特征在于,如果所述数据发送是消息转发,所述方法具体包括:
消息创建:从内存池获取两个内存块,一个作为消息头,另一个作为数据缓冲区;将需要发送的消息数据写入所述数据缓冲区;
指针生成:根据所述消息头的地址信息生成消息头指针,根据所述数据缓冲区的地址信息生成数据缓冲区指针;向所述消息头写入数据缓冲区指针、父消息指针和发送任务标识,并置所述父消息指针为空;
消息发送:首先判断所述消息头中的发送任务标识与当前任务标识是否一致:若一致,则生成一队列节点,在所述队列节点中写入所述消息头指针后,将所述队列节点发送到接收任务的消息队列中;若不一致,从所述内存池获取另一内存块作为子消息头,原消息头为父消息头,向所述子消息头写入数据缓冲区指针、父消息指针和发送任务标识,并置所述子消息头中的发送任务标识为当前任务标识,所述子消息头中的父消息指针指向所述父消息头;最后,为所述子消息头生成另一队列节点,发送到接收任务的消息队列中。

7、
  如权利要求6所述数据发送方法,其特征在于,
所述指针生成步骤中:根据所述消息头的地址信息生成消息头指针,根据所述数据缓冲区的地址信息生成数据缓冲区指针;向所述消息头写入数据缓冲区指针、父消息指针和发送任务标识,还写入生存期字段,并所述生存期为0,置所述父消息指针为空;
所述消息发送步骤中:若一致,则将所述消息头中的生存期递增1,生成一队列节点,在所述队列节点中写入所述消息头指针后,将所述队列节点发送到接收任务的消息队列中;若不一致,从所述内存池获取另一内存块作为子消息头,原消息头为父消息头,向所述子消息头写入数据缓冲区指针、父消息指针和发送任务标识,还写入生存期字段,并置所述子消息头中的发送任务标识为当前任务标识,所述生存期置1,所述子消息头中的父消息指针指向所述父消息头,所述子消息头中的数据缓冲区指针等于所述父消息头中的数据缓冲区指针,同时将所述父消息头中的生存期递增1;最后,为所述子消息头生成另一队列节点,发送到接收任务的消息队列中。

8、
  如权利要求7所述数据发送方法,其特征在于,
在所述父消息头和所述子消息头中还写入消息名、消息类型和数据量中的一种或多种;
如果对所述需要发送的消息进行多次转发,则重复调用所述消息发送步骤,从而生成多个队列节点,分别发送到不同接收任务的消息队列中。

9、
  一种基于处理器共享内存的数据接收方法,其特征在于,所述方法包括:
接收包含内存块指针的数据接收指令;
从共享内存池中获取所述内存块指针指向的内存块中存储的数据。

10、
  如权利要求9所述数据接收方法,其特征在于,如果所述数据接收是消息广播接收,所述方法具体包括:
接收发送方发送的接收数据的消息;
解析收到的所述消息,从所述消息的接收任务的消息队列取得队列节点,从中取得所述数据的消息缓冲区指针;
利用所述消息缓冲区指针从所述处理器的共享内存池的所述消息缓冲区中的数据区获取所述数据;
或者如果所述数据接收是消息转发接收,所述方法具体包括:
接收发送方发送的接收数据的消息;
解析收到的所述消息,从所述消息的接收任务的消息队列取得队列节点,从中取得所述消息头指针;
利用所述消息头指针取得所述数据的数据缓冲区指针,最后利用所述数据缓冲区指针从所述数据缓冲区获得所述消息数据。

11、
  一种基于处理器共享内存的数据发送装置,其特征在于,所述数据发送装置包括:
数据存储单元,用于将数据写入处理器的共享内存池中的至少一内存块;
指针生成单元,用于根据所述内存块的地址信息生成内存块指针;
指针发送单元,用于将所述内存块指针发送给接收方。

12、
  如权利要求11所述数据发送装置,其特征在于,如果所述数据发送装置发送的是消息广播:
所述数据存储单元包括第一数据写入模块:用于从内存池获取一内存块,作为消息缓冲区,将需要发送的消息数据写入所述消息缓冲区中的数据区;
所述指针生成单元包括第一指针生成模块:用于根据所述消息缓冲区的地址信息生成消息缓冲区指针;
所述指针发送单元包括第一指针发送模块:用于生成一队列节点,在所述队列节点中写入所述消息缓冲区的消息缓冲区指针后,将所述队列节点发送到接收任务的消息队列中。

13、
  如权利要求12所述数据发送装置,其特征在于,
所述第一数据写入模块,具体用于从内存池获取一内存块,作为消息缓冲区后,在所述消息缓冲区的消息头中增加生存期字段记录所述消息的发送次数,然后返回第一消息句柄,利用所述第一消息句柄将需要发送的消息数据写入所述消息缓冲区中的数据区;
所述第一指针发送模块,具体用于将所述消息缓冲区的消息头中的生存期递增1,生成一队列节点,在所述队列节点中写入所述消息缓冲区的消息缓冲区指针后,将所述队列节点发送到接收任务的消息队列中。

14、
  如权利要求13所述数据发送装置,其特征在于,
所述第一数据写入模块,具体用于从内存池获取一内存块,作为消息缓冲区后,在所述消息缓冲区的消息头中还写入消息名、消息类型、数据量和发送任务标识中的一种或多种;
所述第一指针发送模块,如果用于对所述需要发送的消息进行多次广播发送,则重复调用所述指针发送步骤,从而生成多个队列节点,分别发送到不同接收任务的消息队列中。

15、
  如权利要求11所述数据发送装置,其特征在于,如果所述数据发送装置发送的是消息转发:
所述信息写入单元包括第二数据写入模块,用于从内存池获取两个内存块,一个作为消息头,另一个作为数据缓冲区;将需要发送的消息数据写入所述数据缓冲区;
所述指针生成单元包括第二指针生成模块:用于根据所述消息头的地址信息生成消息头指针,根据所述数据缓冲区的地址信息生成数据缓冲区指针;向所述消息头写入数据缓冲区指针、父消息指针和发送任务标识,并置所述父消息指针为空;
所述指针发送单元包括第二指针发送模块,用于首先判断所述消息头中的发送任务标识与当前任务标识是否一致:若一致,则生成一队列节点,在所述队列节点中写入所述消息头指针后,将所述队列节点发送到接收任务的消息队列中;若不一致,则通知所述第二消息创建模块从所述内存池获取另一内存块作为子消息头,原消息头为父消息头,向所述子消息头写入数据缓冲区指针、父消息指针和发送任务标识,并置所述子消息头中的发送任务标识为当前任务标识,所述子消息头中的父消息指针指向所述父消息头;最后,为所述子消息头生成另一队列节点,发送到接收任务的消息队列中。

16、
  如权利要求15所述数据发送装置,其特征在于,
所述第二指针生成模块,具体用于根据所述消息头的地址信息生成消息头指针,根据所述数据缓冲区的地址信息生成数据缓冲区指针;向所述消息头写入数据缓冲区指针、父消息指针和发送任务标识,还写入生存期字段,并所述生存期为0,置所述父消息指针为空;
所述第二指针发送模块,具体用于指针发送中:若判断一致,则将所述消息头中的生存期递增1,生成一队列节点,在所述队列节点中写入所述消息头指针后,将所述队列节点发送到接收任务的消息队列中;所述消息发送步骤中:若判断不一致,则通知所述第二消息创建模块从所述内存池获取另一内存块作为子消息头,原消息头为父消息头,向所述子消息头写入数据缓冲区指针、父消息指针和发送任务标识,还写入生存期字段,并置所述子消息头中的发送任务标识为当前任务标识,所述生存期置1,所述子消息头中的父消息指针指向所述父消息头,所述子消息头中的数据缓冲区指针等于所述父消息头中的数据缓冲区指针,同时将所述父消息头中的生存期递增1;最后,为所述子消息头生成另一队列节点,发送到接收任务的消息队列中。

17、
  如权利要求16所述数据发送装置,其特征在于,
所述第二指针生成模块,具体用于在所述父消息头和所述子消息头中还写入消息名、消息类型和数据量中的一种或多种;
所述第二指针发送模块,如果用于对所述需要发送的消息进行多次转发,则重复调用所述第二指针发送模块的消息发送步骤,从而生成多个队列节点,分别发送到不同接收任务的消息队列中。

18、
  一种基于处理器共享内存的数据接收装置,其特征在于,所述数据接收装置包括:
指令接收单元,用于接收包含内存块指针的数据接收指令;
数据获取单元,用于从共享内存池中获取所述内存块指针指向的内存块中存储的数据。

19、
  如权利要求18所述数据接收装置,其特征在于,如果所述数据接收装置接收的是消息广播,
所述数据获取单元包括第一数据获取模块,用于解析收到的所述消息,从所述消息的接收任务的消息队列取得队列节点,从中取得所述数据的消息缓冲区指针,利用所述消息缓冲区指针从所述处理器的共享内存池的所述消息缓冲区中的数据区获取所述数据;
或者如果所述数据接收装置接收的是消息转发,
所述数据获取单元包括第二数据获取模块,用于解析收到的所述消息,从所述消息的接收任务的消息队列取得队列节点,从中取得所述消息头指针,利用所述消息头指针取得所述数据的数据缓冲区指针,最后利用所述数据缓冲区指针从所述数据缓冲区获得所述消息数据。

说明书

一种基于处理器共享内存的数据发送、接收方法及装置
技术领域
本发明涉及处理器领域,尤其涉及一种基于处理器共享内存的数据发送、接收方法及装置。
背景技术
在处理器系统,尤其是多处理系统中,消息传递因为能够很好的反映“生产者—消费者”关系,而且具有可移植性强的优点,经常作为任务间通信和处理器间通信的主要方式。消息传递接口论坛(Message Passing InterfaceForum,MPIF)为这种通信方式制定了消息传递接口(Message PassingInterface,MPI)标准。在一些应用场合,不仅存在点对点消息传递,即消息被一个发送者发送到一个接收者,也存在点对多点消息广播,即消息被一个发送者发送到多个接收者,以及转发消息,即消息被一个接收者收到后又被它发送到其他的接收者。MPI定义的编程接口支持这些应用。
在多核处理器环境里,内核具有共享的存储空间。任务之间、内核之间的消息传递可以通过访问共享内存来减少数据拷贝次数。然而,现有的消息传递技术却不能让消息广播和消息转发从内存的共享访问中获得性能提升。前一种情况下,发送者无法知道各个接收者何时接收消息,以及消息何时被使用完毕,因此它在发送消息时,只能把同一份数据分多次拷贝进这些接收者的消息缓冲区。后一种情况下,转发者无法知道后一个接收者何时接收消息,同时为了说明消息发送者已经改变,它也必须不得不复制一份数据。
在实现本发明过程中,发明人发现现有技术中至少存在如下问题:MPI虽然建议具体实现避免存储器到存储器的拷贝,但是面对消息广播和转发,它的编程接口无法避免数据被反复复制。现有技术目前存在邮箱和消息池两种实现消息传送的方法:邮箱方法中采用静态缓冲区队列收发消息,一个邮箱对应于一个任务,相应地,邮箱中所有的消息缓冲区都从属于这个任务。消息广播操作包含同一份数据到多个接收任务的消息缓冲区的拷贝过程。对于消息转发操作,数据被再次拷贝进下一个接收任务的消息缓冲区。因此,邮箱方法无法避免因多次拷贝消息数据而产生额外的内存、时间开销。消息池方法引入了动态缓冲区分配机制,采用链表方式管理缓冲区队列,任务控制块(TCB)中的消息队列指针指向这个链表,消息池被所有任务共享。然而,其中的缓冲区一旦被某个任务获取,承载消息发往接收任务后,它就从属于这个接收任务,直到消息接收完成才被释放进消息池。在消息广播场景下,消息发送过程必须获取多个缓冲区,分别拷贝消息数据并填写消息头后,逐一发送到多个接收任务的缓冲区队列中。在消息转发场景下,为了减少数据拷贝次数,可以把携带数据的缓冲区直接转移到下一个接收任务的缓冲区队列,即从本任务的缓冲区队列中摘取这个消息缓冲区,将其消息头中的发送任务标识修改成当前任务,直接发送到下一个接收任务的缓冲区队列。但是,如果当前任务并非被转发消息的唯一接收任务时,这样的处理就出现问题:消息头中发送任务标识的改变会造成其他接收任务处理消息时出错。因此,消息转发过程同样必须获取新的缓冲区,进行数据复制后发送到下一个接收任务的缓冲区队列中。综上可知,现有技术消息传送(特别是面对消息广播和消息转发场景时)存在多次消息数据复制的问题,导致内存和时间两方面开销增加。
发明内容
本发明的发明目的是为了解决消息传送时,消息数据被多次复制的问题。
一方面,本发明实施例提供了一种基于处理器共享内存的数据发送方法,所述方法包括:将数据写入处理器的共享内存池中的至少一内存块;根据内存块的地址信息生成内存块指针;将内存块指针发送给接收方。
另一方面,本发明实施例提供了一种基于处理器共享内存的数据接收方法,所述方法包括:接收包含内存块指针的数据接收指令;从共享内存池中获取内存块指针指向的内存块中存储的数据。
又一方面,本发明实施例提供了一种基于处理器共享内存的数据发送装置,所述数据发送装置包括:数据存储单元,用于将数据写入处理器的共享内存池中的至少一内存块;指针生成单元,用于根据内存块的地址信息生成内存块指针;指针发送单元,用于将内存块指针发送给接收方。
再一方面,本发明实施例提供了一种基于处理器共享内存的数据接收装置,所述数据接收装置包括:指令接收单元,用于接收包含内存块指针的数据接收指令;数据获取单元,用于从共享内存池中获取内存块指针指向的内存块中存储的数据。
上述技术方案具有如下有益效果:因为采用传递内存块指针,而不是消息数据本身的技术手段,所以克服了消息传送时,消息数据被多次复制的问题,进而达到了降低内存和时间两方面开销的技术效果。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,并不构成对本发明的限定。在附图中:
图1是本发明实施例一种基于处理器共享内存的数据发送装置方框示意图;
图2是本发明实施例图1中的数据存储单元的方框示意图;
图3是本发明实施例图1中的指针生成单元的方框示意图;
图4是本发明实施例图1中的指针发送单元的方框示意图;
图5是本发明实施例一种基于处理器共享内存的数据接收装置方框示意图;
图6A是本发明实施例图5中的数据释放单元的方框示意图;
图6B是本发明实施例图5中的数据获取单元的方框示意图;
图7是本发明实施例一种基于处理器共享内存的数据发送方法流程图;
图8是本发明实施例一种基于处理器共享内存的数据接收方法流程图;
图9是本发明实施例消息广播中消息队列与缓冲区分离的队列结构示意图;
图10是本发明实施例一个拥有三个接收任务的消息广播的发送过程示意图;
图11是本发明实施例在图9的基础上进一步分离消息头与数据缓冲区的队列结构示意图;
图12是本发明实施例以消息的两个接收任务之一向第三个任务转发消息的消息转发过程示意图。
具体实施方式
为使本发明的目的、技术方案和有益效果更加清楚明白,下面结合实施方式和附图,对本发明做进一步详细说明。在此,本发明的示意性实施方式及其说明用于解释本发明,但并不作为对本发明的限定。
本发明实施例利用传递数据缓冲区指针,而不是数据本身的技术手段,能够克服消息传送时,消息数据被多次复制的问题。
实施例一:
如图1所示,是本发明实施例一种基于处理器共享内存的消息传送装置方框示意图,数据发送装置10包括:数据存储单元101,用于将数据写入处理器的共享内存池中的至少一内存块;指针生成单元102,用于根据内存块的地址信息生成内存块指针;指针发送单元103,用于将内存块指针发送给接收方。
如果装置10发送的是消息广播:
如图2所示,数据存储单元101可以包括第一数据写入模块1011:用于从内存池获取一内存块,作为消息缓冲区,将需要发送的消息数据写入消息缓冲区中的数据区;如图3所示,指针生成单元102可以包括第一指针生成模块1021:用于根据消息缓冲区的地址信息生成消息缓冲区指针;如图4所示,指针发送单元103可以包括第一指针发送模块1031:用于生成一队列节点,在队列节点中写入消息缓冲区的消息缓冲区指针后,将队列节点发送到接收任务的消息队列中。第一数据写入模块1011,具体用于从内存池获取一内存块,作为消息缓冲区后,在消息缓冲区的消息头中增加生存期字段记录消息的发送次数,然后返回第一消息句柄,利用第一消息句柄将需要发送的消息数据写入消息缓冲区中的数据区;第一指针发送模块1031,具体用于将消息缓冲区的消息头中的生存期递增1,生成一队列节点,在队列节点中写入消息缓冲区的消息缓冲区指针后,将队列节点发送到接收任务的消息队列中。
可选的,第一数据写入模块1011,具体用于从内存池获取一内存块,作为消息缓冲区后,在消息缓冲区的消息头中还写入消息名、消息类型、数据量和发送任务标识中的一种或多种。第一指针发送模块1031,如果用于对需要发送的消息进行多次广播发送,则重复调用指针发送步骤,从而生成多个队列节点,分别发送到不同接收任务的消息队列中。
如果装置10发送的是消息转发:
如图2所示,信息写入单元101可以包括第二数据写入模块1012,用于从内存池获取两个内存块,一个作为消息头,另一个作为数据缓冲区;将需要发送的消息数据写入数据缓冲区;如图3所示,指针生成单元102可以包括第二指针生成模块1022:用于根据消息头的地址信息生成消息头指针,根据数据缓冲区的地址信息生成数据缓冲区指针;向消息头写入数据缓冲区指针、父消息指针和发送任务标识,并置父消息指针为空;如图4所示,指针发送单元103可以包括第二指针发送模块1032,用于首先判断消息头中的发送任务标识与当前任务标识是否一致:若一致,则生成一队列节点,在队列节点中写入消息头指针后,将队列节点发送到接收任务的消息队列中;若不一致,则通知第二消息创建模块从内存池获取另一内存块作为子消息头,原消息头为父消息头,向子消息头写入数据缓冲区指针、父消息指针和发送任务标识,并置子消息头中的发送任务标识为当前任务标识,子消息头中的父消息指针指向父消息头;最后,为子消息头生成另一队列节点,发送到接收任务的消息队列中。
可选的,第二指针生成模块1022,具体用于根据消息头的地址信息生成消息头指针,根据数据缓冲区的地址信息生成数据缓冲区指针;向消息头写入数据缓冲区指针、父消息指针和发送任务标识,还写入生存期字段,并生存期为0,置父消息指针为空;第二指针发送模块1032,具体用于指针发送中:若判断一致,则将消息头中的生存期递增1,生成一队列节点,在队列节点中写入消息头指针后,将队列节点发送到接收任务的消息队列中;消息发送步骤中:若判断不一致,则通知第二消息创建模块从内存池获取另一内存块作为子消息头,原消息头为父消息头,向子消息头写入数据缓冲区指针、父消息指针和发送任务标识,还写入生存期字段,并置子消息头中的发送任务标识为当前任务标识,生存期置1,子消息头中的父消息指针指向父消息头,子消息头中的数据缓冲区指针等于父消息头中的数据缓冲区指针,同时将父消息头中的生存期递增1;最后,为子消息头生成另一队列节点,发送到接收任务的消息队列中。第二指针生成模块1022,具体用于在父消息头和子消息头中还写入消息名、消息类型和数据量中的一种或多种。第二指针发送模块1032,如果用于对需要发送的消息进行多次转发,则重复调用第二指针发送模块的消息发送步骤,从而生成多个队列节点,分别发送到不同接收任务的消息队列中。
如图5所示,是本发明实施例一种基于处理器共享内存的数据接收装置方框示意图,数据接收装置50包括:指令接收单元501,用于接收包含内存块指针的数据接收指令;数据获取单元502,用于从共享内存池中获取内存块指针指向的内存块中存储的数据。可选的,数据接收装置50还包括数据释放单元503。
如果数据接收装置50接收的是消息广播,
如图6B所示,数据获取单元502可以包括第一数据获取模块5021,用于解析收到的消息,从消息的接收任务的消息队列取得队列节点,从中取得数据的消息缓冲区指针;用于利用消息缓冲区指针从处理器的共享内存池的消息缓冲区中的数据区获取数据。如图6A所示,数据接收装置50还可以包括数据释放单元503,其可以包括第一数据释放模块5031,第一数据释放模块5031,用于在完成每次消息接收后,将消息缓冲区的消息头中的生存期递减1:如果此时生存期为0,则向内存池释放消息缓冲区;如果生存期为非0,暂不释放消息缓冲区,直接返回。
如果数据接收装置50接收的是消息转发,
如图6B所示,数据获取单元502可以包括第二数据获取模块5022,用于解析收到的消息,从消息的接收任务的消息队列取得队列节点,从中取得消息头指针;用于利用消息头指针取得数据的数据缓冲区指针,最后利用数据缓冲区指针从数据缓冲区获得消息数据。如图6A所示,数据接收装置50还可以包括数据释放单元503,其可以包括第二数据释放模块5032,第二数据释放模块5032,用于在完成每次消息接收后,将父消息头和子消息头中的生存期同时递减1:如果子消息头中的生存期变为0,而其对应的父消息头中的生存期为非0,则将子消息头释放到内存池;如果父消息头和子消息头中的生存期都为0,则同时释放父消息头和子消息头,以及数据缓冲区;如果父消息头和子消息头中的生存期都为非0,那么不释放父消息头和子消息头,以及数据缓冲区。
如图7所示,是本发明实施例一种基于处理器共享内存的数据发送方法流程图,该方法包括:
步骤701,将数据写入处理器的共享内存池中的至少一内存块。
步骤702,根据内存块的地址信息生成内存块指针。
步骤703,将内存块指针发送给接收方。
如果数据发送是消息广播,所述方法具体可以包括:消息创建:从内存池获取一内存块,作为消息缓冲区,将需要发送的消息数据写入消息缓冲区中的数据区;指针生成:根据消息缓冲区的地址信息生成消息缓冲区指针;消息发送:生成一队列节点,在队列节点中写入消息缓冲区的消息缓冲区指针后,将队列节点发送到接收任务的消息队列中。消息创建步骤中:从内存池获取一内存块,作为消息缓冲区后,在消息缓冲区的消息头中增加生存期字段记录消息的发送次数,然后返回第一消息句柄,利用第一消息句柄将需要发送的消息数据写入消息缓冲区中的数据区;消息发送步骤中:将消息缓冲区的消息头中的生存期递增1,生成一队列节点,在队列节点中写入消息缓冲区的消息缓冲区指针后,将队列节点发送到接收任务的消息队列中。消息创建步骤中:从内存池获取一内存块,作为消息缓冲区后,在消息缓冲区的消息头中还写入消息名、消息类型、数据量和发送任务标识中的一种或多种。如果对需要发送的消息进行多次广播发送,则重复调用消息发送步骤,从而生成多个队列节点,分别发送到不同接收任务的消息队列中。
如果数据发送是消息转发,所述方法具体可以包括:消息创建:从内存池获取两个内存块,一个作为消息头,另一个作为数据缓冲区;将需要发送的消息数据写入数据缓冲区;指针生成:根据消息头的地址信息生成消息头指针,根据数据缓冲区的地址信息生成数据缓冲区指针;向消息头写入数据缓冲区指针、父消息指针和发送任务标识,并置父消息指针为空;消息发送:首先判断消息头中的发送任务标识与当前任务标识是否一致:若一致,则生成一队列节点,在队列节点中写入消息头指针后,将队列节点发送到接收任务的消息队列中;若不一致,从内存池获取另一内存块作为子消息头,原消息头为父消息头,向子消息头写入数据缓冲区指针、父消息指针和发送任务标识,并置子消息头中的发送任务标识为当前任务标识,子消息头中的父消息指针指向父消息头;最后,为子消息头生成另一队列节点,发送到接收任务的消息队列中。指针生成步骤中:根据消息头的地址信息生成消息头指针,根据数据缓冲区的地址信息生成数据缓冲区指针;向消息头写入数据缓冲区指针、父消息指针和发送任务标识,还写入生存期字段,并生存期为0,置父消息指针为空;消息发送步骤中:若一致,则将消息头中的生存期递增1,生成一队列节点,在队列节点中写入消息头指针后,将队列节点发送到接收任务的消息队列中;若不一致,从内存池获取另一内存块作为子消息头,原消息头为父消息头,向子消息头写入数据缓冲区指针、父消息指针和发送任务标识,还写入生存期字段,并置子消息头中的发送任务标识为当前任务标识,生存期置1,子消息头中的父消息指针指向父消息头,子消息头中的数据缓冲区指针等于父消息头中的数据缓冲区指针,同时将父消息头中的生存期递增1;最后,为子消息头生成另一队列节点,发送到接收任务的消息队列中。在父消息头和子消息头中还写入消息名、消息类型和数据量中的一种或多种。如果对需要发送的消息进行多次转发,则重复调用消息发送步骤,从而生成多个队列节点,分别发送到不同接收任务的消息队列中。
如图8所示,是本发明实施例一种基于处理器共享内存的数据接收方法流程图,所述方法包括:
步骤801,接收包含内存块指针的数据接收指令。
步骤802,从共享内存池中获取内存块指针指向的内存块中存储的数据。
如果数据接收是消息广播接收,所述方法具体可以包括:接收发送方发送的接收数据的消息;解析收到的消息,从消息的接收任务的消息队列取得队列节点,从中取得数据的消息缓冲区指针;利用消息缓冲区指针从处理器的共享内存池的消息缓冲区中的数据区获取数据。在完成每次数据接收后,方法还可以包括:消息释放:将消息缓冲区的消息头中的生存期递减1:如果此时生存期为0,则向内存池释放消息缓冲区;如果生存期为非0,暂不释放消息缓冲区,直接返回。
如果数据接收是消息转发接收,所述方法具体可以包括:接收发送方发送的接收数据的消息;解析收到的消息,从消息的接收任务的消息队列取得队列节点,从中取得消息头指针;利用消息头指针取得数据的数据缓冲区指针,最后利用数据缓冲区指针从数据缓冲区获得消息数据。在完成每次数据接收后,方法还可以包括:消息释放:将父消息头和子消息头中的生存期同时递减1:如果子消息头中的生存期变为0,而其对应的父消息头中的生存期为非0,则将子消息头释放到内存池;如果父消息头和子消息头中的生存期都为0,则同时释放父消息头和子消息头,以及数据缓冲区;如果父消息头和子消息头中的生存期都为非0,那么不释放父消息头和子消息头,以及数据缓冲区。
本发明上述实施例因为采用传递内存块指针,而不是消息数据本身的技术手段,所以克服了消息传送时,消息数据被多次复制的问题,进而降低内存和时间两方面的开销。
实施例二:
本发明实施例包括以下两部分:消息队列与缓冲区分离的队列结构,用于高速消息广播。
消息队列与缓冲区分离的队列结构如图9所示。消息队列是以链表形式存在的消息缓冲区指针队列,任务控制块中的队列指针指向消息队列。消息缓冲区由消息头和数据区组成。其中,消息头除了记录消息名、消息类型、数据量和发送任务标识以外,还包含一个生存期。生存期记录该消息的发送次数。
在多核处理器系统里,上述队列结构位于共享存储空间。这样,不仅同一内核的任务之间可以进行消息传递,而且不同内核的任务之间同样可以采用消息通信方式。因此,本发明所提及的发送任务和接收任务包括同属一个内核的情况,也包括分属不同内核的情况。
高速消息广播由消息的创建、发送、接收和释放四个过程构成。
消息创建过程从内存池获取一个消息缓冲区;向消息头填入消息名、消息类型、生存期、数据量和发送任务标识,并置生存期为0;最后返回消息句柄。利用消息句柄发送任务可以将需要发送的消息数据写入数据区。
消息发送过程使被发送消息的生存期递增1;生成一个队列节点;在填入消息缓冲区指针后,将它发送到接收任务的消息队列队尾。如果需要对消息进行广播发送,发送任务可以重复调用消息发送过程,从而生成多个队列节点,分别发送到不同接收任务的消息队列。此时,这些队列节点都指向同一个消息缓冲区,而消息头中的生存期恰好等于该消息被发送的次数,也等于接收任务的数目。如图10所示,以一个拥有三个接收任务的消息为例,说明消息的广播发送过程。
可见,广播消息经多次发送后仅存在一个消息缓冲区,只是它的指针发送到了多个接收任务的消息队列。因此消息广播过程不存在多次数据拷贝操作。
消息接收过程从当前任务的消息队列摘取第一个队列节点;从中取得消息缓冲区指针;返回消息句柄。利用消息句柄接收任务可以从数据区中获得消息数据。
消息释放过程使消息头中的生存期递减1;如果此时生存期为0,表示被释放消息的所有接收任务都已经调用了释放操作,则向内存池释放消息缓冲区;如果生存期非0,表示还有其他的接收任务未使用完这个消息,暂不释放消息缓冲区,直接返回。
针对现有技术面对消息广播场景时无法避免多次数据拷贝的问题,本发明实施例提出一种高速广播的方法,旨在降低消息传送过程中内存和时间两方面的开销,从而提高多核处理器软件的处理性能。尤其适用于内存资源有限且对实时性要求很高的嵌入式多核处理器和多核数字信号处理器(DigitalSignal Processor,DSP)系统。嵌入式多核处理器,尤其是多核DSP,具有内存资源有限和实时性要求高的特点。在消息广播的应用场景避免数据拷贝,一方面可以减少消息缓冲区的使用,降低内存开销,另一方面可以使内核从简单的数据读写操作中解放出来,从而降低时间开销。
实施例三:
本发明实施例包括以下三个部分:消息队列、消息头与数据缓冲区分离的队列结构,用于高速消息转发。
如图11所示,显示了在第二实施例中图9的基础上进一步分离消息头与数据缓冲区的队列结构,消息头和数据缓冲区都独立占用内存块。其中,消息头除了包含消息名、消息类型、数据量、发送任务标识和生存期以外,还增加两个指针:数据缓冲区指针和父消息指针。父消息指针用于被转发的消息指向其父消息。
高速消息转发同样由消息的创建、发送、接收和释放四个过程构成。
消息创建过程从内存池获取两个内存块,一个作为固定大小的消息头,另一个根据发送任务要求的数据量得到数据缓冲区;向消息头填入消息名、消息类型、数据缓冲区指针、父消息指针、生存期、数据量和发送任务标识,并置生存期为0,置父消息指针为空;最后返回消息句柄。利用消息句柄发送任务可以将需要发送的消息数据写入数据区。
消息发送过程首先判断消息头中的发送任务标识与当前任务标识是否一致:若一致则表示发送的是当前任务创建的消息,处理过程与第二实施例类似,不同之处在于:填入队列节点的是消息头指针,而不是消息缓冲区指针。若不一致则说明这是一次消息转发操作。被转发消息的消息头称为子消息头,原来的消息头称为父消息头。
确认消息转发操作后,发送过程从内存池获取一个新的内存块作为子消息头;然后设置子消息头中的发送任务标识为当前任务标识,生存期置1,父消息指针指向父消息头,其余信息与父消息头保持一致;同时还要递增父消息头中的生存期;最后,为子消息头生成一个队列节点,发送到接收任务消息队列的队尾。如图12所示,以消息的两个接收任务之一向第三个任务转发消息为例,说明消息转发过程。
由此可见,消息经转发后,内存开销上只增加了一个作为子消息头的内存块,时间开销上仅增加了少量的设置操作。因此消息转发过程也不存在数据拷贝操作。
消息接收过程与第二实施例相同。
消息释放过程同时递减被释放消息及其父消息的生存期:如果被释放消息的生存期变为0,而父消息的生存期非0,表示还存在父消息的接收任务未使用完这个消息,则仅仅把被释放消息的消息头释放到内存池,而不释放数据缓冲区;如果父消息的生存期也变为0,表示被释放消息及其父消息的所有接收任务都已经调用了释放操作,则同时释放两个消息的消息头,以及数据缓冲区;如果两个消息的生存期都非0,那么消息头和数据缓冲区都不释放。
针对现有技术面对消息转发场景时无法避免多次数据拷贝的问题,本发明实施例提出一种转发消息的方法,旨在降低消息收发过程中内存和时间两方面的开销,从而提高多核处理器软件的处理性能。尤其适用于内存资源有限且对实时性要求很高的嵌入式多核处理器和多核DSP系统。嵌入式多核处理器,尤其是多核DSP,具有内存资源有限和实时性要求高的特点。在消息转发的应用场景避免数据拷贝,一方面可以减少消息缓冲区的使用,降低内存开销,另一方面可以使内核从简单的数据读写操作中解放出来,从而降低时间开销。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关硬件来完成,所述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,包括上述全部或部分步骤,所述的存储介质,如:ROM/RAM、磁盘、光盘等。
本发明上述三个实施例提供的技术方案,在分离消息队列、消息头和/或数据缓冲区的同时,向消息头增加生存期和/或父消息指针。采用消息生存期算法和消息继承算法,充分利用多核处理器具有共享存储空间的特点,使消息广播和消息转发都只进行少量的设置操作,而不拷贝消息数据。无论对同一内核任务,还是不同内核任务,本发明实施例的技术方案都降低了在它们之间进行消息传递的内存开销和时间开销,从而提高了软件的处理性能。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

一种基于处理器共享内存的数据发送、接收方法及装置.pdf_第1页
第1页 / 共29页
一种基于处理器共享内存的数据发送、接收方法及装置.pdf_第2页
第2页 / 共29页
一种基于处理器共享内存的数据发送、接收方法及装置.pdf_第3页
第3页 / 共29页
点击查看更多>>
资源描述

《一种基于处理器共享内存的数据发送、接收方法及装置.pdf》由会员分享,可在线阅读,更多相关《一种基于处理器共享内存的数据发送、接收方法及装置.pdf(29页珍藏版)》请在专利查询网上搜索。

本发明提供一种基于处理器共享内存的数据发送、接收方法及装置,其中,该基于处理器共享内存的数据发送方法包括:将数据写入处理器的共享内存池中的至少一内存块;根据内存块的地址信息生成内存块指针;将内存块指针发送给接收方。本发明还提供一种基于处理器共享内存的数据发送装置、一种基于处理器共享内存的数据接收方法及装置。本发明因为采用传递内存块指针,而不是消息数据本身的技术手段,所以克服了消息传送时,消息数据被。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1