基于多核多处理器并行系统的全局消息队列实现方法与流程

文档序号:24235215发布日期:2021-03-12 13:06阅读:52来源:国知局
基于多核多处理器并行系统的全局消息队列实现方法与流程

本发明涉及一种全局消息队列的实现方法,具体为一种基于多核多处理器并行系统的全局消息队列实现方法,属于嵌入式计算机领域。



背景技术:

随着计算机系统的发展以及领域应用对实时性、并行性需求的日益增长,多核多处理器并行系统己成为嵌入式计算机系统发展的重要趋势。

随着多核多处理器并行系统核心数和处理器节点的增多,与传统的多核处理器消息通信方式相比,多核多处理器并行系统的消息通信方式更复杂,其不仅需要实现多核处理器片内处理核心间通信,还需要实现多处理器片间的通信。换言之,消息通信成为影响多核多处理器并行系统性能的瓶颈之一。因此,处理核心之间、处理器之间的高效通信成为多核多处理器并行系统的关键问题。

此外,处理核心之间、处理器之间进行通信时,其线程必须互斥地访问多核处理器上的硬件资源,否则会造成因资源争用导致的访问数据错误等问题,进而导致处理核心之间、处理器之间的通信失败。



技术实现要素:

本发明的目的就在于为了解决上述问题而提供一种基于多核多处理器并行系统的全局消息队列实现方法,该方法利用全局信号量与共享存储区,将线程之间的消息传递交由全局信号量控制,任何使用全局消息队列的线程获取全局信号量后,才能进行全局消息队列的相关操作,满足多核多处理器间的高速通信需求,具有快速、高效、安全的特点,能在极大程度上简化应用开发人员的工作。

本发明通过以下技术方案来实现上述目的:一种基于多核多处理器并行系统的全局消息队列实现方法,该全局消息队列实现方法包括:

s1)多核多处理器并行系统的各处理核心进行系统初始化,通过srio映射一段共享存储空间用于存储全局消息队列与全局消息队列名表;

s2)从线程所属的处理核心对应的全局消息队列缓冲池中创建并初始化全局消息队列,将全局消息队列信息填入全局消息队列名表;

s3)当线程向全局消息队列发送消息或从全局消息队列接收消息时,通过全局信号量对全局消息队列资源进行管理与控制,实现消息的传输。

优选地,所述多核多处理器并行系统的处理器节点数至少有1个;所述处理器节点的处理核心至少有1个;并且所述处理器节点间或处理核心支持srio总线互连。

优选地,步骤s1)中,所述系统初始化的过程包括:

s11)各处理核心初始化srio,通过srio映射一段共享存储空间用于存储全局消息队列与全局消息队列名表;

s12)选取任一处理核心为主处理核心,创建并初始化一张共享的全局消息队列名表,用于记录所有已创建的全局消息队列;

s13)在各处理核心映射出的共享存储空间中,创建全局消息队列缓冲池和消息缓冲池。

优选地,步骤s12)中,所述全局消息队列名表的内容包括控制名表互斥访问的全局信号量、名表中所有已创建的全局消息队列数目,以及所有已创建的全局消息队列信息;

所述全局消息队列信息包括名称、类型、所属处理核心、消息属性、打开次数、数据队列、空闲队列、全局信号量;

其中,消息属性包括最大消息数目、消息大小、消息标识和当前消息数目,全局信号量包括用于控制数据队列访问的全局信号量和用于控制空闲队列访问的全局信号量。

优选地,步骤s13)中,所述全局消息队列缓冲池用于分配全局消息队列,所述消息缓冲池用于分配全局消息队列的空闲队列;

其中,全局消息队列缓冲池和消息缓冲池,为带表头指针的双向链表,链表表头均放置在各自所属的处理核心上,可用自旋锁或者全局信号量管理互斥访问。

优选地,步骤s2)中,所述全局消息队列初始化时,控制数据队列的全局信号量的值初始化为0,控制空闲队列的全局信号量的值初始化为消息队列允许承载的最大消息个数。

优选地,步骤s3)中,所述线程向全局消息队列发送消息的操作具体包括:

s31)获取消息队列内控制空闲队列的全局信号量;

s32)若控制空闲队列的全局信号量为0,表明消息队列已达到最大消息个数,全局消息队列已满,则通过全局信号量将该线程阻塞;

s33)若控制空闲队列的全局信号量不为0,则从空闲队列中取下一块空闲区,将消息复制到空闲区,然后按消息优先级加入数据队列,修改消息属性,释放控制数据队列的全局信号量。

优选地,步骤s3)中,所述线程从消息队列接收消息的操作具体包括:

s34)获取消息队列内控制数据队列的全局信号量;

s35)若控制数据队列的全局信号量为0,表明消息队列为空,则通过全局信号量将该线程阻塞;

s36)若控制数据队列的全局信号量不为0,则根据消息优先级,按照“fifo”原则,从数据队列中取下一个消息,修改消息属性,然后复制消息,将消息加入空闲队列,释放控制空闲队列的全局信号量。

本发明的有益效果是:该基于多核多处理器并行系统的全局消息队列实现方法,利用全局信号量与共享存储区,将线程之间的消息传递交由全局信号量控制,满足多核多处理器间的高速通信需求,具有快速、高效的特点,能在极大程度上简化应用开发人员的工作。

附图说明

图1为本发明实施例应用的一种多核多处理器并行系统结构框图;

图2为本发明实施例应用的一种多核多处理器并行系统全局消息队列实现方法原理;

图3为本发明实施例应用的系统初始化流程图;

图4为本发明实施例应用的全局消息队列名表结构;

图5为本发明实施例应用的全局消息队列发送消息流程图;

图6为本发明实施例应用的全局消息队列接收消息流程图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

一种基于多核多处理器并行系统的全局消息队列实现方法,该全局消息队列实现方法包括:

s1)多核多处理器并行系统的各处理核心进行系统初始化,通过srio映射一段共享存储空间用于存储全局消息队列与全局消息队列名表。

步骤s1)中,所述系统初始化的过程包括:

s11)各处理核心初始化srio,通过srio映射一段共享存储空间用于存储全局消息队列与全局消息队列名表;

s12)选取任一处理核心为主处理核心,创建并初始化一张共享的全局消息队列名表,用于记录所有已创建的全局消息队列;

所述全局消息队列名表的内容包括控制名表互斥访问的全局信号量、名表中所有已创建的全局消息队列数目,以及所有已创建的全局消息队列信息;

所述全局消息队列信息包括名称、类型、所属处理核心、消息属性、打开次数、数据队列、空闲队列、全局信号量;

其中,消息属性包括最大消息数目、消息大小、消息标识和当前消息数目,全局信号量包括用于控制数据队列访问的全局信号量和用于控制空闲队列访问的全局信号量。

s13)在各处理核心映射出的共享存储空间中,创建全局消息队列缓冲池和消息缓冲池。

所述全局消息队列缓冲池用于分配全局消息队列,所述消息缓冲池用于分配全局消息队列的空闲队列;

其中,全局消息队列缓冲池和消息缓冲池,为带表头指针的双向链表,链表表头均放置在各自所属的处理核心上,可用自旋锁或者全局信号量管理互斥访问。

s2)从线程所属的处理核心对应的全局消息队列缓冲池中创建并初始化全局消息队列,将全局消息队列信息填入全局消息队列名表。

所述全局消息队列初始化时,控制数据队列的全局信号量的值初始化为0,控制空闲队列的全局信号量的值初始化为消息队列允许承载的最大消息个数。

s3)当线程向全局消息队列发送消息或从全局消息队列接收消息时,通过全局信号量对全局消息队列资源进行管理与控制,实现消息的传输。

其中,所述线程向全局消息队列发送消息的操作具体包括:

s31)获取消息队列内控制空闲队列的全局信号量;

s32)若控制空闲队列的全局信号量为0,表明消息队列已达到最大消息个数,全局消息队列已满,则通过全局信号量将该线程阻塞;

s33)若控制空闲队列的全局信号量不为0,则从空闲队列中取下一块空闲区,将消息复制到空闲区,然后按消息优先级加入数据队列,修改消息属性,释放控制数据队列的全局信号量。

所述线程从消息队列接收消息的操作具体包括:

s34)获取消息队列内控制数据队列的全局信号量;

s35)若控制数据队列的全局信号量为0,表明消息队列为空,则通过全局信号量将该线程阻塞;

s36)若控制数据队列的全局信号量不为0,则根据消息优先级,按照“fifo”原则,从数据队列中取下一个消息,修改消息属性,然后复制消息,将消息加入空闲队列,释放控制空闲队列的全局信号量。

所述多核多处理器并行系统的处理器节点数至少有1个;所述处理器节点的处理核心至少有1个;并且所述处理器节点间或处理核心支持srio总线互连。

实施例

需要说明的是:

1)如图1所示,本实施例是在一个嵌入式多核多处理器并行系统上实施的实施例;

2)本实施例应用的嵌入式多核多处理器并行系统,包含四块处理板,分别为s0,s1,s2,s3,其中处理板s0、s1、s2包含两片mpc8641d双核处理器和一个srio交换设备,处理板s3包含一片mpc8641d双核处理器和一个srio交换设备,其中每片mpc8641d处理器包含两个e600处理核心,处理核心分别为c0,c1,……,ci,……,c13,选定处理核心c0为主处理核心;

3)处理核心c0上有一个线程a,用于发送消息;处理核心c13上有一个线程b,用于接收消息;

4)本实施例应用的mpc8641d处理器均支持srio总线互连,每片mpc8641d双核处理器之间通过srio交换设备连接;

5)本实施例是基于srio的多核多处理器并行系统。

如图2所示,本实施例中一种多核多处理器并行系统全局消息队列实现方法,包括以下步骤:

s1)mpc8641d多核多处理器并行系统各e600处理核心进行系统初始化,通过srio映射一段共享存储空间用于存储全局消息队列与全局消息队列名表。

s2)各e600处理核心从线程所属处理核心对应的全局消息队列缓冲池中创建并初始化全局消息队列,将全局消息队列信息填入全局消息队列名表。

s3)当线程向全局消息队列发送消息或从全局消息队列接收消息时,通过全局信号量对全局消息队列资源进行管理与控制,实现消息的传输。

如图3所示,步骤s1中,所述系统初始化过程具体包括:

s11)各e600处理核心初始化srio,通过srio映射一段共享存储空间用于存储全局消息队列与全局消息队列名表;

s12)选取处理核心c0为主处理核心,创建并初始化一张共享的全局消息队列名表,用于记录所有已创建的全局消息队列;

s13)在各e600处理核心映射出的共享存储空间中,创建全局消息队列缓冲池和消息缓冲池。

其中,步骤s11中各e600处理核心均从本地地址空间映射长度为4m字节的空间到srio地址空间作为共享内存,供mpc8641d多核多处理器并行系统所有处理核心访问,共享内存的空间首地址依次为0xa4000000,0xa4400000,……,0xa4000000+i*0x400000,……,0xa4000000+13*0x400000。

如图4所示,步骤s12中,所述全局消息队列名表的内容包括控制名表互斥访问的全局信号量、名表中所有已创建的全局消息队列数目,以及所有已创建的全局消息队列信息。其中,全局消息队列信息主要包括名称、类型、所属处理核心、消息属性、打开次数、数据队列、空闲队列、全局信号量等,消息属性包括最大消息数目、消息大小、消息标识和当前消息数目,全局信号量主要包括用于控制数据队列访问的全局信号量和用于控制空闲队列访问的全局信号量。

其中,步骤s13中,所述全局消息队列缓冲池用于分配全局消息队列,所述消息缓冲池用于分配全局消息队列的空闲队列。其中,全局消息队列缓冲池和消息缓冲池,为带表头指针的双向链表,链表表头均放置在各自所属的处理核心上,可用自旋锁或者全局信号量管理互斥访问。

其中,步骤s2中,所述全局消息队列初始化时,控制数据队列的全局信号量的值初始化为0,控制空闲队列的全局信号量的值初始化为消息队列允许承载的最大消息个数。

如图5所示,步骤s3中,线程a向全局消息队列发送消息的操作具体包括:

s31)获取消息队列内控制空闲队列的全局信号量;

s32)若控制空闲队列的全局信号量为0,表明消息队列已达到最大消息个数,全局消息队列已满,则通过全局信号量将该线程阻塞;

s33)若控制空闲队列的全局信号量不为0,则从空闲队列中取下一块空闲区,将消息复制到空闲区,然后按消息优先级加入数据队列,修改消息属性,释放控制数据队列的全局信号量。

如图6所示,步骤s3中,线程b从消息队列接收消息的操作具体包括:

s34)获取消息队列内控制数据队列的全局信号量;

s35)若控制数据队列的全局信号量为0,表明消息队列为空,则通过全局信号量将该线程阻塞;

s36)若控制数据队列的全局信号量不为0,则根据消息优先级,按照“fifo”或其他原则,从数据队列中取下一个消息,修改消息属性,然后复制消息,将消息加入空闲队列,释放控制空闲队列的全局信号量。

对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。

此外,应当理解,虽然本说明书按照实施方式加以描述,但并非每个实施方式仅包含一个独立的技术方案,说明书的这种叙述方式仅仅是为清楚起见,本领域技术人员应当将说明书作为一个整体,各实施例中的技术方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1