CN109739670B - 节点内进程通信方法、装置、计算机设备和存储介质 - Google Patents
节点内进程通信方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN109739670B CN109739670B CN201910103816.XA CN201910103816A CN109739670B CN 109739670 B CN109739670 B CN 109739670B CN 201910103816 A CN201910103816 A CN 201910103816A CN 109739670 B CN109739670 B CN 109739670B
- Authority
- CN
- China
- Prior art keywords
- message
- shared memory
- node
- index
- read
- 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
Landscapes
- Multi Processors (AREA)
- Mobile Radio Communication Systems (AREA)
Abstract
本申请涉及一种节点内进程通信方法、装置、计算机设备和存储介质。所述方法包括:消息发送进程在消息接收进程对应的共享内存分段的写索引区建立消息存储路径;所述消息发送进程向所述消息存储路径指向的消息存储空间写入消息;消息接收进程根据所述消息存储路径,建立所述共享内存分段的读索引区的消息读取路径;所述消息接收进程根据所述消息读取路径从所述消息存储空间读取消息。本方法实现了进程间可靠、保序且零复制的自适应通信,能够避免通信过程中消息的复制,提高通信效率,进而提高并行运算的运行速率。
Description
技术领域
本申请涉及通信技术领域,特别是涉及一种节点内进程通信方法、装置、计算机设备和存储介质。
背景技术
随着计算机通信技术的发展,出现了并行运算技术,并行运算能够通过多个进程共同处理同一个运算任务,提高了运算的效率。例如,在并行仿真运算中,逻辑实体通过消息交互,在处理消息的过程中推进仿真运算,因此,仿真运算进行过程中存在大量的消息传输,同时并行仿真运算要求消息传输是可靠且保序的,因此消息传输效率对仿真运算的运行速率至关重要。
进程是并行运算中承载和运行逻辑实体的容器,在现代操作系统中不同的进程一般具有不同的逻辑地址,因此不同的进程并不能直接访问对方的数据,逻辑实体间的跨进程的消息需要通过跨进程通信方式完成。最常用的IPC(Inter-Process Communication,跨进程通信)手段是套接字以及基于套接字搭建的中间件,如MPI(Message PassingInterface,消息传输接口),使用套接字进行数据传输就像在需要通信的两个进程空间之间搭建了第三个空间,首先消息发送方将待发送的消息复制到套接字空间,此后接收方再从套接字空间将消息复制到自己的空间中,上述过程很好地隔离了进程之间的空间和数据,使得并行程序的设计和开发具有较好的独立性,其代价是消息被复制多次造成了较高的开销,同时导致了进程之间的通信速度降低。
发明内容
基于此,有必要针对上述技术问题,提供一种能够提高进程之间通信速度的节点内进程通信方法、装置、计算机设备和存储介质。
一种节点内进程通信方法,所述方法包括:
消息发送进程在消息接收进程对应的共享内存分段的写索引区建立消息存储路径;
所述消息发送进程向所述消息存储路径指向的消息存储空间写入消息;其中,所述消息存储空间位于所述共享内存分段的实际消息缓存区;
所述消息接收进程根据所述消息存储路径,建立所述共享内存分段的读索引区的消息读取路径;
所述消息接收进程根据所述消息读取路径从所述消息存储空间读取消息;
其中,根据节点间拓扑关系判断位于同一节点的进程集合,并指定一个分控进程,再由分控进程创建共享内存,所述共享内存由多个共享内存分段组成,位于单个节点内的每个进程使用其中一个对应的共享内存分段,所述多个共享内存分段的控制结构相同。
在其中一个实施例中,所述方法还包括:分控进程根据所述节点创建共享内存,所述节点存在多个进程,所述共享内存包括多个共享内存分段;所述分控进程对所述共享内存分段设置序号后,依次将所述共享内存分段分配给位于所述节点的多个进程,并建立所述进程的编号与所述共享内存的序号对应的共享内存分段映射表;其中,分控进程为位于所述节点的多个进程中的其中一个,所述进程的编号为用于区分所述进程的标识。
在其中一个实施例中,所述消息发送进程在消息接收进程对应的共享内存分段的写索引区建立消息存储路径,包括:所述消息发送进程根据所述共享内存分段映射表查询所述消息接收进程对应的共享内存分段的序号;所述消息发送进程根据所述共享内存分段的序号查询所述共享内存分段;所述消息发送进程向根据所述写索引区建立消息存储路径。
在其中一个实施例中,在所述分控进程根据所述节点创建共享内存,所述节点存在多个进程,所述共享内存包括多个共享内存分段之后,还包括:初始化所述共享内存。
在其中一个实施例中,所述方法还包括:所述消息接收进程释放所述消息所占用的消息存储空间。
在其中一个实施例中,所述共享内存分段的控制结构包括:读区域、写区域和消息缓存区域,所述写索引区位于所述写区域,所述消息存储空间位于所述消息缓存区域,所述读索引区位于所述读区域;其中,所述共享内存的长度等于多个所述共享内存分段的长度之和。
一种并行运算中进程自适应通信方法,所述方法包括:
消息发送进程判断与消息接收进程是否位于同一节点中;
如果消息发送进程与消息接收进程位于同一节点中,则根据上述任一项所述节点内进程通信方法进行进程之间的通信;
如果消息发送进程与消息接收进程不位于同一节点中,则根据跨进程通信方式进行进程之间的通信。
在其中一个实施例中,所述消息发送进程判断与消息接收进程是否位于同一节点中,包括:所述消息发送进程根据邻居进程信息,判断与所述消息接收进程是否位于同一节点中;其中,所述邻居进程信息为除所述进程本身外位于所述节点内其它进程的信息。
在其中一个实施例中,在所述消息发送进程判断与消息接收进程是否位于同一节点中之前,还包括:
使用MPI消息发送接口将进程的拓扑信息发送至主控进程;其中,所述进程的拓扑信息包括进程的编号与所述进程的宿主节点名称;
主控进程根据所述进程的拓扑信息,按照节点的名称对所述进程进行聚类,形成以节点为聚类单元的拓扑映射表;
主控进程根据所述拓扑映射表,向所述节点内每个所述进程发送邻居进程信息;其中,所述邻居进程信息为除所述进程本身外位于所述节点内其它进程的信息;
其中,主控进程为所述参与运算的进程中的任意一个进程。
一种节点内进程通信装置,所述装置包括:消息发送进程,用于在消息接收进程对应的共享内存分段的写索引区建立消息存储路径;所述消息发送进程,还用于向所述消息存储路径指向的消息存储空间写入消息;其中,所述消息存储空间位于所述共享内存分段的实际消息缓存区;
所述消息接收进程,用于根据所述消息存储路径,建立所述共享内存分段的读索引区的消息读取路径;
所述消息接收进程,还用于根据所述消息读取路径从所述消息存储空间读取消息;
其中,根据节点间拓扑关系判断位于同一节点的进程集合,并指定一个分控进程,再由分控进程创建共享内存,所述共享内存由多个共享内存分段组成,位于单个节点内的每个进程使用其中一个对应的共享内存分段,所述多个共享内存分段的控制结构相同。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
消息发送进程在消息接收进程对应的共享内存分段的写索引区建立消息存储路径;
所述消息发送进程向所述消息存储路径指向的消息存储空间写入消息;其中,所述消息存储空间位于所述共享内存分段的实际消息缓存区;
所述消息接收进程根据所述消息存储路径,建立所述共享内存分段的读索引区的消息读取路径;
所述消息接收进程根据所述消息读取路径从所述消息存储空间读取消息;
其中,根据节点间拓扑关系判断位于同一节点的进程集合,并指定一个分控进程,再由分控进程创建共享内存,所述共享内存由多个共享内存分段组成,位于单个节点内的每个进程使用其中一个对应的共享内存分段,所述多个共享内存分段的控制结构相同。
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
消息发送进程在消息接收进程对应的共享内存分段的写索引区建立消息存储路径;
所述消息发送进程向所述消息存储路径指向的消息存储空间写入消息;其中,所述消息存储空间位于所述共享内存分段的实际消息缓存区;
消息接收进程根据所述消息存储路径,建立所述共享内存分段的读索引区的消息读取路径;
所述消息接收进程根据所述消息读取路径从所述消息存储空间读取消息;
其中,根据节点间拓扑关系判断位于同一节点的进程集合,并指定一个分控进程,再由分控进程创建共享内存,所述共享内存由多个共享内存分段组成,位于单个节点内的每个进程使用其中一个对应的共享内存分段,所述多个共享内存分段的控制结构相同。
上述节点内进程通信方法、装置、计算机设备和存储介质,通过在节点内建立共享内存,并根据节点内每个进程分配一个对应的共享内存分段,通过在所述共享内存分段的索引区建立消息存储路径和消息读取路径来写入和获取消息,实现进程之间可靠保序的消息传输,同时避免了消息的多次复制,能够提高进程之间的通信速率,进而提高并行运算的运行速率。
附图说明
图1为一个实施例中节点内进程通信方法的流程示意图;
图2为一个实施例中共享内存分段的控制结构的示意图;
图3为一个实施例中进程发送方将消息写入消息接收进程对应的共享内存分段的写索引区步骤的流程示意图;
图4为一个实施例中向所述写索引区写入消息的流程示意图;
图5为一个实施例中消息接收进程获取消息的流程示意图;
图6为一个实施例中归还所述消息占用的共享内存步骤的流程示意图;
图7为一个实施例中并行运算中进程自适应通信方法的流程示意图;
图8为一个实施例中判断消息发送进程与消息接收进程是否位于同一节点中步骤的流程示意图;
图9为一个具体实施例中并行运算中进程自适应通信方法的流程示意图;
图10为一个实施例中节点内进程通信装置的结构框图;
图11为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
目前,位于同一个计算节点上的进程可以通过共享内存实现快速的数据传输,具体都是通过主流的MPI(Message Passing Interface,消息传输接口)实现,如MPICH、openMPI、intel MPI等,虽然位于同一节点进程间利用共享内存传输数据,但是其实现机制是改用共享内存替代套接字作为实际的传输媒介,在进程间通信时复制消息仍无法避免,主要实现过程为:消息发送进程先将消息存储到自身的消息存储空间,然后再将消息复制到共享内存的消息缓存区,消息接收进程再从消息缓存区将消息复制到自身的消息存储空间。目前的技术方案从本质上讲,共享内存仅提供了进程间数据传输的媒介,即实现了可靠的传输,但是并不能同时满足保序和零复制的通信需求。本申请通过额外的算法控制,利用共享内存实现进程之间通信,达到了保序和零复制的通信需求。其中,保序是指数据按照先发送先接收的方式进行,零复制指的是发送方发送的消息不需要经过复制就能发送到接收方。
在一个实施例中,如图1所示,提供了一种节点内进程通信方法,包括以下步骤:
S110,消息发送进程在消息接收进程对应的共享内存分段的写索引区建立消息存储路径。
其中,根据节点间拓扑关系判断位于同一节点的进程集合,并指定一个分控进程,再由分控进程创建共享内存,所述共享内存由多个共享内存分段组成,位于单个节点内的每个进程使用其中一个对应的共享内存分段,所述多个共享内存分段的控制结构相同。每个节点对应一个共享内存,所述消息发送进程与消息接收进程位于同一节点。所述消息作为并行运算中逻辑进程间交互的媒介,一般包含期望对方逻辑进程处理某个事件的时间、参数等。
其中,逻辑进程为并行运算中用以模拟现实世界中被运算对象的逻辑实体,逻辑进程是有状态的,状态即为表征该运算对象物理状态的参数取值,逻辑进程间可以相互交互。
其中,所述共享内存分段的控制结构包括:读区域、写区域和消息缓存区域,所述写索引区位于所述写区域,所述消息存储空间位于所述消息缓存区域,所述读索引区位于所述读区域;其中,所述共享内存空间的长度等于多个所述共享内存分段的长度之和。
具体的,如图2所示,单个进程访问共享内存时,采用共享内存分段的控制结构shm_entry。读区域包括:用于控制对读索引区互斥访问的互斥量rMutex、标识待读消息索引区起始位置的rBeginIndex(单个整数)、标识待读消息索引区结束位置的rEndIndex(单个整数)、待读消息索引区rPendingMsgIndexes,假设单个进程设置长度为SHM_N_MSG的消息接收缓冲区,则共享内存分段的控制结构shm_entry包括由SHM_N_MSG个整数组成的待读消息索引区rPendingMsgIndexes;写区域包括:用于控制对写索引区互斥访问的互斥量wMutex、标识可写消息索引区起始位置的wBeginIndex(单个整数)、标识可写消息索引区结束位置的wEndIndex(单个整数)、可写消息索引区wAvailableMsgIndexes,假设单个进程设置长度为SHM_N_MSG的消息接收缓冲区,则共享内存分段的控制结构shm_entry包括由SHM_N_MSG个整数组成的可写消息索引区wAvailableMsgIndexes;消息缓存区域包括实际消息缓冲区actualMsg。每个所述共享内存分段的长度Lengthshm_entry=2*sizeof(mutex)+4*sizeof(int)+2*SHM_N_MSG*sizeof(int)+SHM_N_MSG*sizeof(event),其中,定义计算结构大小(以byte为单位)的操作符sizeof,如图2所示,rMutex的长度为单个mutex长度,rBeginIndex的长度为单个int长度,rEndIndex的长度为单个int长度,rPendingMsgIndexes为SHM_N_MSG个int长度,wMutex的长度为单个mutex长度,wBeginIndex的长度为单个int长度,wEndIndex的长度为单个int长度,wAvailableMsgIndexes为SHM_N_MSG个int长度,actualMsgs的长度为SHM_N_MSG个event长度。例如,在32位操作系统下C++语言计算整数int长度为4字节,即sizeof(int)=4,在32位Linux操作系统下,mutex长度为4字节,event指代消息,可以自定义长度。mutex、int和event根据操作系统的不同,其所占用的字节长度不同。
具体的,通过标识可写消息索引区起始位置的wBeginIndex和可写消息索引区wAvailableMsgIndexes两重索引来建立消息存储路径,所述两重索引最终指向消息存储空间。
S120,所述消息发送进程向所述消息存储路径指向的消息存储空间写入消息。其中,所述消息存储空间位于所述共享内存分段的实际消息缓存区actualMsgs。其中,消息存储空间的地址存储到指针e中。
S130,消息接收进程根据所述消息存储路径,建立所述共享内存分段的读索引区的消息读取路径。
具体的,在所述消息发送进程向所述消息存储空间写入消息后,通过标识待读消息索引区起始位置的rBeginIndex和待读消息索引区rPendingMsgIndexes两重索引来建立消息读取路径,所述两重索引最终指向消息存储空间。
S140,所述消息接收进程根据所述消息读取路径从所述消息存储空间读取消息。
具体的,消息接收进程循环扫描对应的共享内存分段的读索引区以获取所述消息。
上述节点内进程通信方法中,通过在节点内建立共享内存,并根据节点内每个进程分配一个对应的共享内存分段,通过在所述共享内存分段的索引区建立消息存储路径和消息读取路径来写入和获取消息,实现进程之间可靠的消息传输,避免了消息的多次复制,能够提高进程之间的通信速率,降低了系统的开销。
在其中一个实施例中,一种节点内进程通信方法还包括:分控进程根据所述节点创建共享内存,所述节点存在多个进程,所述共享内存包括多个共享内存分段;所述分控进程对所述共享内存分段设置序号后,依次将所述共享内存分段分配给位于所述节点的多个进程,并建立所述进程的编号与所述共享内存的序号对应的共享内存分段映射表;其中,分控进程为位于所述节点的多个进程中的其中一个,所述进程的编号为用于区分所述进程的标识。
具体的,对所述多个共享内存分段使用阿拉伯数据进行编号,如节点nodel1上的三个进程分别为进程0、进程2和进程4,对应的三个共享内存分段序号为0、1、2,则节点nodel1中所述进程的共享内存分段映射表为{<0,0>,<1,2>,<2,4>}。
在其中一个实施例中,在所述分控进程根据所述节点创建共享内存,所述节点存在多个进程,所述共享内存包括多个共享内存分段之后,还包括:初始化所述共享内存。具体的,节点内的每个进程对其所分配的共享内存分段进行初始化,所述初始化所述共享内存包括:创建并初始化互斥量rMutex,将rBeginIndex、rEndIndex和wBeginIndex初始化为0,rBeginIndex、rEndIndex为0表示无待读取的消息,wEndIndex初始化为SHM_N_MSG-1(所有写索引区均可用),rPendingMsgIndexes为空,wAvailableMsgIndexes依次设置为0、1、2…、SHM_N_MSG-1,初始化actualMsgs中的每个消息(消息内容为空)。
在其中一个实施例中,如图3所示,所述消息发送进程在消息接收进程对应的共享内存分段的写索引区建立消息存储路径,包括:
S111,所述消息发送进程根据所述共享内存分段映射表查询所述消息接收进程对应的共享内存分段的序号。
具体的,所示消息发送进程根据消息接收进程的编号,在所述共享内存分段映射表中获取所述消息接收进程对应的共享内存分段的序号。对参与运算的进程会进行统一编号,如进程0、进程2和进程4,0、2、4为进程的编号。
S112,所述消息发送进程根据所述共享内存分段的序号查询所述共享内存分段。
S113,所述消息发送进程向根据所述写索引区建立消息存储路径。
具体的,如图4所示,对wMutex加锁,首先判断写索引区中wBeginIndex与wEndIndex是否相等,如果不相等,取出写索引区中的第一个位置wBeginIndex,将所述wBeginIndex的值赋给临时变量pos,wBeginIndex地址自增1,并对消息的个数SHM_N_MSG取模,再解锁wMutex。如果wBeginIndex与wEndIndex相等,则wMutex解锁,采用主流的MPI(Message Passing Interface,消息传输接口)方式实现消息发送。
取出可用索引(wAvailableMsgIndexes)中第pos个元素,将所述索引(wAvailableMsgIndexes)中第pos个元素的值赋给临时变量index,再将消息缓冲区(actualMsgs)中第index个元素的地址赋给指针e。
其中,指针e指向的空间为消息写入的位置,所述消息发送进程向所述消息存储路径指向的消息存储空间写入消息,即为所述消息发送进程向指针e所指向的消息空间写入消息。其中,事件e中设有一个整型字段shm_pos,同时将临时变量index的值写入shm_pos,以便归还此共享空间时使用。
在其中一个实施例中,所述节点内进程通信方法还包括:将所述消息存储路径写入消息接收进程对应共享内存分段的读索引区。
具体的,对rMutex加锁,空闲的读索引区位置由rEndIndex标定,将上述步骤中临时变量index的值写入读索引区(rPendingMsgIndexes)中由rEndIndex标定的位置,rEndIndex地址自增1,并对消息的个数SHM_N_MSG取模,再解锁rMutex。
在其中一个实施例中,所述消息接收进程根据所述消息存储路径,建立所述共享内存分段的读索引区的消息读取路径通过如下方式实现:
如图5所示,加锁rMutex,判断rBeginIndex与rEndIndex是否相等,如果相等则返回(说明无待读取的消息),如果rBeginIndex与rEndIndex不相等,则,取出由rBeginIndex标识的第一个待读取消息在读索引区的位置,并赋值给临时变量pos,rBeginIndex地址自增1,并对消息的个数SHM_N_MSG取模,解锁rMutex,从rPendingMsgIndexes中取出由pos标识的待读取消息的索引位置,并保存在临时变量index中,所述消息的实际存储位置即为actualMsgs中第index个位置,取出所述消息并赋值给指针e,此后消息接收进程便可以获取和使用所述消息,即e所指向的空间,即所述消息已到达消息接收进程。
在其中一个实施例中,一种节点内进程通信方法还包括:所述消息接收进程释放所述消息所占用的消息存储空间。
其中,消息接收进程在处理完所述消息后,需要释放所述消息所占用的共享内存。如果消息是通过主流的MPI(Message Passing Interface,消息传输接口)方式进行传输,则采用相应的内存释放符(如标准C++delete释放符)归还共享内存。如果消息是通过本申请节点内进程通信方法进行传输,则通过如下方法归还共享内存:
如图6所示,首先加锁消息接收进程对应的共享内存分段中wMutex,将shm_pos的值写入wAvailableMsgIndexes中第wEndIndex个位置,同时wEndIndex地址自增1,并对消息的个数SHM_N_MSG取模,解锁wMutex。
在一个实施例中,如图7所示,提供一种并行运算中进程自适应通信方法,所述方法包括步骤:
S210,消息发送进程判断与消息接收进程是否位于同一节点中。
其中,消息发送进程为发送消息的进程,消息接收进程为接收消息的进程。
S220,如果消息发送进程与消息接收进程位于同一节点中,则根据上述节点内进程通信方法进行进程之间的通信。
S230,如果消息发送进程与消息接收进程不位于同一节点中,则根据跨进程通信方式进行进程之间的通信。
其中,跨进程通信方式IPC(Inter-Process Communication,跨进程通信)是套接字以及基于套接字搭建的中间件,如MPI(Message Passing Interface,消息传输接口),使用套接字进行数据传输就像在需要通信的两个进程空间之间搭建了第三个空间,首先消息发送方将待发送的消息复制到套接字空间,此后接收方再从套接字空间将消息复制到自己的空间中。
本申请一种并行运算中进程自适应通信方法,主要应用场景是在多核集群环境下运行的并行仿真运算,多核集群指通过网络互联多个具备多核处理器计算节点所构成的计算机系统,所述节点可以为一台计算机或者一台服务器,每个节点都具有多核处理器,网络是全连通的,即任意两个节点可以直接通信。其中,仿真运算为运算中的一种,。
在其中一个实施例中,所述消息发送进程判断与消息接收进程是否位于同一节点中,包括:所述消息发送进程根据邻居进程信息,判断与所述消息接收进程是否位于同一节点中;其中,所述邻居进程信息为除所述进程本身外位于所述节点内其它进程的信息。
具体的,根据所述消息发送进程的所述邻居进程信息,判断所述消息发送进程的编号是否在所述邻居进程信息中,如果所述消息发送进程的编号在所述邻居进程信息中,则所述消息发送进程与消息接收进程位于同一节点,如果所述消息发送进程的编号不在所述邻居进程信息中,则所述消息发送进程与消息接收进程不位于同一节点。
在其中一个实施例中,如图8所示,在所述消息发送进程判断与消息接收进程是否位于同一节点中之前,还包括:
S211,MPI消息发送接口将进程的拓扑信息发送至主控进程;其中,所述进程的拓扑信息包括进程的编号与所述进程的宿主节点名称。
其中,运算开始时,利用MPI(Message Passing Interface,消息传输接口)提供的mpiexec或mpirun命令启动参与运算的进程,启动过程中,命令参数包括:进程数目、使用的计算节点列表、每个节点上分配的进程数目、进程执行的程序及其它必需参数。由于MPI(Message Passing Interface,消息传输接口)实现的不同,mpiexec命令并不保证按照计算节点列表依次创建进程,即进程编号与计算节点的匹配关系可能因使用的MPI实现不同而不同;所有进程启动后将会分配一个唯一编号,其值为0-(n-1),其中n为进程总数。根据命令参数,能够获取参与运算的节点的名称、参与运算的进程的编号。所述宿主节点为所述进程所在的节点,在部署节点时每个节点会被分配唯一的名称,如node1、node2。
其中,其中,主控进程为所述参与运算的进程中的任意一个进程。在形成进程的拓扑信息后,所述进程将所述拓扑信息发送给0号进程,其中0号进程为主控进程,当然,也可以选取其它进程作为主控进程,那么相应的将所述拓扑信息发送至主控进程。
S212,主控进程根据所述进程的拓扑信息,按照节点的名称对所述进程进行聚类,形成以节点为聚类单元的拓扑映射表。
具体的,主控进程在接收完拓扑信息后,根据所述进程的拓扑信息,将来自同一个节点的进程编号加入到同一个集合中(位于同一个集合的进程互称为邻居进程),形成以节点为聚类单元的拓扑映射表。例如,将进程编号依次为0-5的进程进行聚类,所述进程属于节点node1或节点node2,节点node1包含进程0、2、4,节点node2包含进程1、3、5。
S213,主控进程根据所述拓扑映射表,向所述节点内每个所述进程发送邻居进程信息;其中,所述邻居进程信息为除所述进程本身外位于所述节点内其它进程的信息。
具体的,指定节点内编号最小的进程为分控进程,分控进程用于创建共享内存。主控进程根据所述拓扑映射表,向所有进程发送与所述进程对应的邻居进程信息和分控进程编号。在分控进程创建共享内存的同时,节点内其它进程等待所述分控进程创建共享内存,当所述共享内存创建成功后,各个进程调用系统接口附加到所述共享内存上,并对所述共享内存进程初始化,可通过上述共享内存初始化方法进行初始化,在此不再赘述。
运算过程开始后,例如仿真运算开始后,所有逻辑进程不断地处理消息并按照时戳不减的顺序调度新的消息,发送消息和接收消息的过程一直伴随进行。仿真运算一般设有结束时间,所有逻辑进程不允许调度时间大于结束时间的消息,因此仿真运算开始后存在一个所有事件都处理完毕的时间点,此时,各分控进程释放正在使用的共享内存,所有进程销毁与共享内存使用相关的控制结构。
上述并行运算中进程自适应通信方法,通过判断收发消息的进程所处的位置是位于节点内还是位于节点外,自适应的选择相匹配的进程通信方式进行通信,保证了进程通信的可靠性,同时,通过本申请所述的节点内进程通信方法进行进程通信,避免了消息的多次复制,降低了系统的开销,同时提高了进程之间的通信速率,即在实现了并行运算中可靠、保序且零复制的自适应通信。
应该理解的是,虽然图1-8的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1-8中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
在一个具体的实施例中,如图9所示,在多核集群环境下运行的并行运算,多核集群指通过网络互联多个具备多核处理器计算节点所构成的计算机系统,图9中,每个连入网络的每台计算机101称为一个节点,每个节点都具有多核处理器,通过网络102全联通,即任意两个节点可以直接通信。
运算开始时,利用MPI(Message Passing Interface,消息传输接口)提供的mpiexec或mpirun命令启动参与运算的进程,启动过程中,命令参数包括:进程数目、使用的计算节点列表、每个节点上分配的进程数目、进程执行的程序及其它必需参数。
所有进程启动后将会分配一个唯一编号,其值为0-(n-1),其中n为进程总数。根据命令参数,能够获取参与运算的节点的名称、参与运算的进程的编号。所述宿主节点为所述进程所在的节点,在部署节点时每个节点会被分配唯一的名称,如node1、node2。其中,所述进程的拓扑信息包括进程的编号与所述进程的宿主节点名称。
MPI消息发送接口将进程的拓扑信息发送至主控进程,主控进程在接收完拓扑信息后,根据所述进程的拓扑信息,将来自同一个节点的进程编号加入到同一个集合中(位于同一个集合的进程互称为邻居进程),形成以节点为聚类单元的拓扑映射表。
主控进程指定节点内编号最小的进程为分控进程,分控进程用于创建共享内存。主控进程根据所述拓扑映射表,向所有进程发送与所述进程对应的邻居进程信息和分控进程编号。在分控进程创建共享内存的同时,节点内其它进程等待所述分控进程创建共享内存,当所述共享内存创建成功后,各个进程调用系统接口附加到所述共享内存上,并对所述共享内存进行初始化。
在创建完共享内存后,进程之间的通信方法具体如下:
a1,消息发送进程根据邻居进程信息判断与消息接收进程是否位于同一节点中;如果位于同一节点中,则进入步骤a2;如果不位于同一节点中,则进入步骤a8;
a2,判断所述消息接收进程的共享内存分段的写索引区是否具有空闲位置;其中,所述共享内存由多个共享内存分段组成,位于节点内的每个进程对应一个对应的共享内存分段;如有空闲位置,则进入步骤a3;如没有空闲位置,则进入步骤a8;
a3,在消息接收进程对应的共享内存分段的写索引区建立消息存储路径;
a4,所述消息发送进程向所述消息存储路径指向的消息存储空间写入消息;
a5,消息接收进程根据所述消息存储路径,建立所述共享内存分段的读索引区的消息读取路径;
a6,所述消息接收进程根据所述消息读取路径从所述消息存储空间读取消息;
a7,所述消息接收进程释放所述消息所占用的消息存储空间,进入步骤a10;
a8,通过跨进程通信方式进行进程之间的通信;
a9,通过内存释放符(如标准C++delete释放符)释放消息所占用的消息存储空间;
a10,分控进程释放正在使用的共享内存,所有进程销毁与共享内存使用相关的控制结构;
a11,结束。
在一个实施例中,如图10所示,提供了一种节点内进程通信装置,所述装置包括:消息发送进程310、共享内存分段320和消息接收进程330。其中:
消息发送进程310,用于在消息接收进程对应330的共享内存分段320的写索引区建立消息存储路径。
所述消息发送进程310,还用于向所述消息存储路径指向的消息存储空间写入消息。其中,所述消息存储空间位于所述共享内存分段320的实际消息缓存区。
消息接收进程330,用于根据所述消息存储路径,建立所述共享内存分段320的读索引区的消息读取路径。
所述消息接收进程330,还用于根据所述消息读取路径从所述消息存储空间读取消息。
其中,根据节点间拓扑关系判断位于同一节点的进程集合,并指定一个分控进程,再由分控进程创建共享内存,所述共享内存由多个共享内存分段组成,位于单个节点内的每个进程使用其中一个对应的共享内存分段,所述多个共享内存分段的控制结构相同。
所述共享内存分段320,包括写索引区、读索引区和消息存储空间。共享内存由多个共享内存320分段组成,位于节点内的每个进程对应一个对应的共享内存分段,所述多个共享内存分段的控制结构相同。
在其中一个实施例中,所述节点内进程通信装置还包括:分控进程,用于根据所述节点创建共享内存,所述节点存在多个进程,所述共享内存包括多个共享内存分段;所述分控进程,还用于对所述共享内存分段设置序号;所述分控进程,还用于依次将所述共享内存分段分配给位于所述节点的多个进程,并建立所述进程的编号与所述共享内存的序号对应的共享内存分段映射表;其中,分控进程为位于所述节点的多个进程中的其中一个,所述进程的编号为用于区分所述进程的标识。
在其中一个实施例中,消息发送进程310包括:序号查询单元,用于根据所述共享内存分段映射表查询所述消息接收进程对应的共享内存分段的序号;共享内存分段查询单元,用于根据所述共享内存分段的序号查询所述共享内存分段;存储路径建立单元,用于根据所述写索引区建立消息存储路径。
在其中一个实施例中,所述节点内进程通信装置还包括:初始化模块,用于初始化所述共享内存。
在其中一个实施例中,所述消息接收进程还包括:存储空间释放单元:用于释放所述消息所占用的消息存储空间。
在其中一个实施例中,所述共享内存分段的控制结构包括:读区域、写区域和消息缓存区域,所述写索引区位于所述写区域,所述消息存储空间位于所述消息缓存区域,所述读索引区位于所述读区域;其中,所述共享内存的长度等于多个所述共享内存分段的长度之和。
关于节点内进程通信装置的具体限定可以参见上文中对于节点内进程通信方法的限定,在此不再赘述。上述节点内进程通信装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图11所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储消息数据。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种节点内进程通信方法。
本领域技术人员可以理解,图11中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现以下步骤:
消息发送进程在消息接收进程对应的共享内存分段的写索引区建立消息存储路径;
所述消息发送进程向所述消息存储路径指向的消息存储空间写入消息;其中,所述消息存储空间位于所述共享内存分段的实际消息缓存区;
消息接收进程根据所述消息存储路径,建立所述共享内存分段的读索引区的消息读取路径;
所述消息接收进程根据所述消息读取路径从所述消息存储空间读取消息;
其中,根据节点间拓扑关系判断位于同一节点的进程集合,并指定一个分控进程,再由分控进程创建共享内存,所述共享内存由多个共享内存分段组成,位于单个节点内的每个进程使用其中一个对应的共享内存分段,所述多个共享内存分段的控制结构相同。
在一个实施例中,处理器执行计算机程序时还实现以下步骤:分控进程根据所述节点创建共享内存,所述节点存在多个进程,所述共享内存包括多个共享内存分段;所述分控进程对所述共享内存分段设置序号后,依次将所述共享内存分段分配给位于所述节点的多个进程,并建立所述进程的编号与所述共享内存的序号对应的共享内存分段映射表;其中,分控进程为位于所述节点的多个进程中的其中一个,所述进程的编号为用于区分所述进程的标识。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
消息发送进程在消息接收进程对应的共享内存分段的写索引区建立消息存储路径;
所述消息发送进程向所述消息存储路径指向的消息存储空间写入消息;其中,所述消息存储空间位于所述共享内存分段的实际消息缓存区;
消息接收进程根据所述消息存储路径,建立所述共享内存分段的读索引区的消息读取路径;
所述消息接收进程根据所述消息读取路径从所述消息存储空间读取消息;
其中,根据节点间拓扑关系判断位于同一节点的进程集合,并指定一个分控进程,再由分控进程创建共享内存,所述共享内存由多个共享内存分段组成,位于单个节点内的每个进程使用其中一个对应的共享内存分段,所述多个共享内存分段的控制结构相同。
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:分控进程根据所述节点创建共享内存,所述节点存在多个进程,所述共享内存包括多个共享内存分段;所述分控进程对所述共享内存分段设置序号后,依次将所述共享内存分段分配给位于所述节点的多个进程,并建立所述进程的编号与所述共享内存的序号对应的共享内存分段映射表;其中,分控进程为位于所述节点的多个进程中的其中一个,所述进程的编号为用于区分所述进程的标识。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (10)
1.一种节点内进程通信方法,其特征在于,所述方法包括:
消息发送进程在消息接收进程对应的共享内存分段中通过标识可写消息索引区中可写区段起始位置的索引和可写消息索引区建立消息存储路径,所述可写消息索引区标识实际消息缓冲区中的可写位置;
所述消息发送进程向所述消息存储路径指向的消息存储空间写入消息,并根据所述消息存储路径更新标识待读消息索引区中待读区段结束位置的索引;其中,所述消息存储空间位于所述共享内存分段的实际消息缓存区;
所述消息接收进程在所述共享内存分段中通过标识待读消息索引区中待读区段起始位置的索引和待读消息索引区建立消息读取路径,所述待读消息索引区标识实际消息缓冲区中的待读位置;
所述消息接收进程根据所述消息读取路径从所述消息存储空间读取消息;
其中,根据节点间拓扑关系判断位于同一节点的进程集合,并指定一个分控进程,再由分控进程创建共享内存,所述共享内存由多个共享内存分段组成,位于单个节点内的每个进程使用其中一个对应的共享内存分段,所述多个共享内存分段的控制结构相同。
2.根据权利要求1所述的方法,其特征在于,还包括:
分控进程根据所述节点创建共享内存,所述节点存在多个进程,所述共享内存包括多个共享内存分段;
所述分控进程对所述共享内存分段设置序号后,依次将所述共享内存分段分配给位于所述节点的多个进程,并建立所述进程的编号与所述共享内存的序号对应的共享内存分段映射表;
其中,分控进程为位于所述节点的多个进程中的其中一个,所述进程的编号为用于区分所述进程的标识。
3.根据权利要求2所述的方法,其特征在于,所述消息发送进程在消息接收进程对应的共享内存分段中通过标识可写消息索引区中可写区段起始位置的索引和可写消息索引区建立消息存储路径,包括:
所述消息发送进程根据所述共享内存分段映射表查询所述消息接收进程对应的共享内存分段的序号;
所述消息发送进程根据所述共享内存分段的序号查询所述共享内存分段;
所述消息发送进程在所述共享内存分段中通过标识可写消息索引区中可写区段起始位置的索引和可写消息索引区建立消息存储路径;和/或
在所述分控进程根据所述节点创建共享内存,所述节点存在多个进程,所述共享内存包括多个共享内存分段之后,还包括:初始化所述共享内存。
4.根据权利要求1所述的方法,其特征在于,还包括:所述消息接收进程释放所述消息所占用的消息存储空间;和/或
所述共享内存分段的控制结构包括:读区域、写区域和消息缓存区域,所述读区域包括:标识待读消息索引区中待读区域起始位置的索引、标识待读消息索引区中待读区域结束位置的索引、以及标识实际消息缓冲区中的待读位置的待读消息索引区,所述写区域包括:标识可写消息索引区中可写区域起始位置的索引、标识可写消息索引区中可写区域结束位置的索引、以及标识实际消息缓冲区中的可写位置的可写消息索引区,所述消息缓存区域包括实际消息缓存区;其中,所述共享内存的长度等于多个所述共享内存分段的长度之和。
5.一种并行运算中进程自适应通信方法,其特征在于,所述方法包括:
消息发送进程判断与消息接收进程是否位于同一节点中;
如果消息发送进程与消息接收进程位于同一节点中,则根据权利要求1-4中任一项所述节点内进程通信方法进行进程之间的通信;
如果消息发送进程与消息接收进程不位于同一节点中,则根据跨进程通信方式进行进程之间的通信。
6.根据权利要求5所述的方法,其特征在于,所述消息发送进程判断与消息接收进程是否位于同一节点中,包括:
所述消息发送进程根据邻居进程信息,判断与所述消息接收进程是否位于同一节点中;其中,所述邻居进程信息为除所述进程本身外位于所述节点内其它进程的信息。
7.根据权利要求6所述的方法,其特征在于,在所述消息发送进程判断与消息接收进程是否位于同一节点中之前,还包括:
使用MPI消息发送接口将进程的拓扑信息发送至主控进程;其中,所述进程的拓扑信息包括进程的编号与所述进程的宿主节点名称;
主控进程根据所述进程的拓扑信息,按照节点的名称对所述进程进行聚类,形成以节点为聚类单元的拓扑映射表;
主控进程根据所述拓扑映射表,向所述节点内每个所述进程发送邻居进程信息;其中,所述邻居进程信息为除所述进程本身外位于所述节点内其它进程的信息;
其中,主控进程为所述参与运算的进程中的任意一个进程。
8.一种节点内进程通信装置,其特征在于,所述装置包括:
消息发送进程,用于在消息接收进程对应的共享内存分段中通过标识可写消息索引区中可写区段起始位置的索引和可写消息索引区建立消息存储路径,所述可写消息索引区标识实际消息缓冲区中的可写位置;
所述消息发送进程,还用于向所述消息存储路径指向的消息存储空间写入消息,并根据所述消息存储路径更新标识待读消息索引区中待读区段结束位置的索引;其中,所述消息存储空间位于所述共享内存分段的实际消息缓存区;
所述消息接收进程,用于在所述共享内存分段中通过标识待读消息索引区中待读区段起始位置的索引和待读消息索引区建立消息读取路径,所述待读消息索引区标识实际消息缓冲区中的待读位置;
所述消息接收进程,还用于根据所述消息读取路径从所述消息存储空间读取消息;
其中,根据节点间拓扑关系判断位于同一节点的进程集合,并指定一个分控进程,再由分控进程创建共享内存,所述共享内存由多个共享内存分段组成,位于单个节点内的每个进程使用其中一个对应的共享内存分段,所述多个共享内存分段的控制结构相同。
9.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至7中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910103816.XA CN109739670B (zh) | 2019-02-01 | 2019-02-01 | 节点内进程通信方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910103816.XA CN109739670B (zh) | 2019-02-01 | 2019-02-01 | 节点内进程通信方法、装置、计算机设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109739670A CN109739670A (zh) | 2019-05-10 |
CN109739670B true CN109739670B (zh) | 2021-04-23 |
Family
ID=66367145
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910103816.XA Active CN109739670B (zh) | 2019-02-01 | 2019-02-01 | 节点内进程通信方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109739670B (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 (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114244708B (zh) * | 2021-04-26 | 2023-08-08 | 无锡江南计算技术研究所 | 一种胖树网络结构上的通信优化方法 |
CN113094754B (zh) * | 2021-05-08 | 2022-11-01 | 重庆银行股份有限公司 | 大数据平台数据修改系统及修改、响应、缓存、校验方法 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6629152B2 (en) * | 1998-06-29 | 2003-09-30 | International Business Machines Corporation | Message passing using shared memory of a computer |
CN100588204C (zh) * | 2007-06-01 | 2010-02-03 | 北京航空航天大学 | 一种通信网络仿真工具的实时视景显示平台及其实现方法 |
US9396101B2 (en) * | 2012-06-12 | 2016-07-19 | International Business Machines Corporation | Shared physical memory protocol |
CN106980551A (zh) * | 2017-03-24 | 2017-07-25 | 山东浪潮商用系统有限公司 | 一种进程通信方法及装置 |
CN108600011B (zh) * | 2018-04-26 | 2020-01-24 | 百度在线网络技术(北京)有限公司 | 通信网络数据传输的方法、装置、存储介质及终端设备 |
-
2019
- 2019-02-01 CN CN201910103816.XA patent/CN109739670B/zh active Active
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 |
---|---|
CN109739670A (zh) | 2019-05-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9218299B2 (en) | Recovering data segment contents in a distributed shared memory | |
CN109739670B (zh) | 节点内进程通信方法、装置、计算机设备和存储介质 | |
US6167430A (en) | Multicomputer with distributed directory and operating system | |
US6862595B1 (en) | Method and apparatus for implementing a shared message queue using a list structure | |
CN111338806A (zh) | 一种业务控制方法及装置 | |
CN114461593B (zh) | 日志写入方法及其装置、电子设备及存储介质 | |
CN115203255A (zh) | 数据查询方法、装置、电子设备及存储介质 | |
CN114185558A (zh) | 基于K8s的原生应用选主方法、装置及存储介质 | |
US20140317630A1 (en) | Data processing system with data transmit capability | |
Chakraborty et al. | SHMEMPMI--Shared memory based PMI for improved performance and scalability | |
Simon et al. | High-Performance Match-Action Table Updates from within Programmable Software Data Planes | |
CN112631994A (zh) | 数据迁移方法及系统 | |
CN116755902A (zh) | 数据通信方法及装置、处理系统、电子设备、存储介质 | |
CN111708626B (zh) | 数据访问方法、装置、计算机设备和存储介质 | |
CN114217986A (zh) | 数据处理方法、装置、设备、存储介质及产品 | |
CN112015818A (zh) | 分布式图数据库uuid生成方法、装置、设备及介质 | |
CN111382200A (zh) | 信息加载方法、装置、服务器及存储介质 | |
CN115604345B (zh) | 应用程序的开发方法及计算机可读存储介质 | |
Born | Analytical performance modelling of lock management in distributed systems | |
Fujishima et al. | Distributed shared memory with CAN-based prioritized mutual exclusion for embedded control systems | |
CN113051081B (zh) | 基于内存池的事件状态管理方法、系统及存储介质 | |
Tapus et al. | Distributed synchronization with shared semaphore sets | |
Marovac | On interprocess interaction in distributed architectures | |
CN117056294A (zh) | 一种wal处理方法、装置、电子设备及存储介质 | |
Sahingoz et al. | A Java Based DSM System for User Defined Shared Data Objects |
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 |