掌桥专利:专业的专利平台
掌桥专利
首页

进程间通信方法、装置和计算机设备和计算机可读介质

文献发布时间:2023-06-19 12:07:15


进程间通信方法、装置和计算机设备和计算机可读介质

技术领域

本发明涉及操作系统领域,特别是涉及一种进程间通信方法、装置和计算机设备和计算机可读介质。

背景技术

在操作系统中,不同的应用程序运行在不同的进程中,当不同的应用程序之间需要合作时,需要使用进程间通信,在微内核场景中,由于驱动等原本在宏内核实现的功能都改为由进程实现,因此存在频繁的进程间切换。

在现有的通信系统中,进程间通信有多种方式,如消息、信号量、共享内存等。这些机制都已经比较成熟,但都无法避开用户态内核态多次切换。在微内核场景中还存在频繁的进程间切换。例如,现有的进程间通信机制通常是管道、消息队列、信号量、socket或共享内存通信机制等,通过这些机制进行进程间通信都需要经历许多次用户态与内核态之间的切换、线程/进程切换才能完成数据传递,并还可能伴随有数据拷贝。这都会给通信带来开销,对于嵌入式系统,且实时性要求较高的应用场景,通信效率较低,无法满足用户需求。

发明内容

基于此,有必要针对现有进程间通信机制的通信效率较低的问题,提出一种进程间通信方法、装置和计算机设备和计算机可读介质。

本发明的一方面提供了一种进程间通信方法,所述方法包括:

对调用进程和被调进程进行初始化,所述调用进程和所述被调进程具有各自的页表和虚拟内存,所述回调函数定义在所述被调进程中;

使用所述调用进程的页表,运行所述调用进程的线程;

通过将使用的页表从所述调用进程的页表切换为所述被调进程的页表,在所述调用进程的线程中执行所述回调函数的指令,以生成所述回调函数的返回值;

将使用的页表从所述被调进程的页表切换回所述调用进程的页表,使用所述调用进程的页表以接收所述回调函数的返回值。

在其中一个实施例中,对调用进程和被调进程进行初始化包括:

在物理内存中保留共享物理内存;

在所述调用进程的虚拟内存中设定第一虚拟内存,并在所述被调进程的虚拟内存中设定第二虚拟内存;以及

建立所述第一虚拟内存与所述共享物理内存之间的第一映射,并建立所述第二虚拟内存与所述共享物理内存之间的第二映射;

其中,所述第一映射和所述第二映射优先于其他虚拟内存与其他物理内存之间的映射。

在其中一个实施例中,使用调用进程的页表,运行所述调用进程的线程包括:

获取与所述回调函数相关联的参数,将所述参数写入至第一寄存器中;

在所述调用进程的线程中执行所述回调函数的指令,以生成所述回调函数的返回值包括:

从所述第一寄存器获取所述参数,基于所述参数执行所述回调函数的指令,生成所述回调函数的返回值;

将所述回调函数的返回值存储在所述第一寄存器中;

使用所述调用进程的页表以接收所述回调函数的返回值包括:从所述第一寄存器读取所述返回值。

在其中一个实施例中,使用所述调用进程的页表,运行所述调用进程的线程包括:

通过所述第一映射将与所述回调函数相关联的参数写入至所述共享物理内存中;

在所述调用进程的线程中执行所述回调函数的指令,以生成所述回调函数的返回值包括:

通过所述第二映射从所述共享物理内存获取所述参数,基于所述参数执行所述回调函数的指令,生成所述回调函数的返回值;

将所述回调函数的返回值存储在所述共享物理内存中;

使用所述调用进程的页表以接收所述回调函数的返回值包括:通过所述第一映射从所述共享物理内存读取所述返回值。

在其中一个实施例中,通过将使用的页表从所述调用进程的页表切换为所述被调进程的页表,在所述调用进程的线程中执行所述回调函数的指令,以生成所述回调函数的返回值还包括:

将切换使用的页表时的所述调用进程的页表的参数存储到内存空间作为切换页表参数;

将使用的页表从所述被调进程的页表切换回所述调用进程的页表包括:

从所述内存空间获取所述切换页表参数,并基于所述切换页表参数继续使用所述调用进程的页表运行所述调用进程。

在其中一个实施例中,该方法还包括:

当在使用所述被调进程的页表的期间所述调用进程的线程被切出时,将此时所述被调进程的页表的参数存储到所述内存空间作为暂停页表参数;

当所述调用进程的线程继续运行时,继续将使用的页表设置为所述被调进程的页表,并基于所述暂停页表参数继续运行所述被调进程。

在其中一个实施例中,在读取所述回调函数的返回值之后,所述方法还包括:

取消所述第一映射和所述第二映射。

在其中一个实施例中,对调用进程和被调进程进行初始化还包括:

在所述调用进程和所述被调进程中设定切换指令,所述切换指令用于指示进行所述调用进程与所述被调进程之间的通信。

本发明的另一方面提供了一种进程间通信装置,包括:

初始化模块,配置为对调用进程和被调进程进行初始化,所述调用进程和所述被调进程具有各自的页表和虚拟内存,所述回调函数定义在所述被调进程中;

第一页表切换模块,配置为使用所述调用进程的页表,运行所述调用进程的线程;通过将使用的页表从所述调用进程的页表切换为所述被调进程的页表,在所述调用进程的线程中执行所述回调函数的指令,以生成所述回调函数的返回值;

第二页表切换模块,配置为将使用的页表从所述被调进程的页表切换回所述调用进程的页表,使用所述调用进程的页表以接收所述回调函数的返回值。

本发明的另一方面提供了一种计算机设备,包括存储器和处理器,所述存储器上存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现上述进程间通信方法。

本发明的另一方面提供了一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现上述进程间通信方法。

根据上述进程间通信方法、装置和计算机设备和计算机可读介质,在运行调用进程时,通过将使用的页表切换为被调进程的页表,从而在运行调用进程的线程时执行被调进程的指令,即实现了在运行调用进程时执行被调进程的指令。因此,在进行进程间通信时,不发生进程和线程的切换以及数据的拷贝就能直接完成数据传递。如此,省去了进程和线程切换开销,节约了内核态与用户态的切换的不必要的处理流程,提高了通信效率。

附图说明

图1是现有的IPC通信机制的示意图;

图2是根据实施例的进程间通信方法的流程示意图;

图3是根据实施例的进程间通信过程的概要示意图;

图4是根据实施例的共享物理内存的示意图;

图5是根据实施例的进程间通信方法的流程示意图;

图6是根据实施例的进程间通信方法的流程示意图;

图7是根据实施例的进程间通信过程的概要示意图;

图8是根据实施例的进程间通信过程的概要示意图;

图9是根据实施例的进程间通信装置的框图;

图10是根据实施例的计算机设备的框图。

具体实施方式

参考图1,在现有的微内核系统中,通常采用IPC(Inter-Process Communication)通信机制来实现进程间通信。例如,在现有的IPC通信机制下,在第一进程调用第二进程的接口向第二进程发送数据时,需要经历以下过程:第一进程将要发送的数据经过系统调用传递到内核,请求内核向第二进程发送数据,同时在第一进程空间提供存放数据的缓存,第一进程由此经历从用户态到内核态的切换;内核将该请求发送给第二进程,并将在第一进程空间中缓存的数据复制到第二进程空间;第二进程接收请求,从内核接收数据并处理数据,第二进程由此经历从内核态到用户态的切换;第二进程产生应答数据,应答数据经过系统调用传递到内核态,第二进程由此经历从用户态到内核态的切换;第一进程从内核接收经处理的应答数据,第一进程由此经历从内核态到用户态的切换。可见,上述过程涉及系统调用及进程切换,要经历多次用户态和内核态的切换以及进程和线程的切换才能完成一次进程间的数据闭环传递,并且存在数据拷贝的开销。

为减少进程间通信的开销,本发明提供了一种进程间通信方法、装置和计算机设备和计算机可读介质,旨在避免进行进程间通信时发生进程和线程的切换,省去数据拷贝,并因此提高通信效率。

参考图2,根据实施例的进程间通信方法包括步骤S100~S106。

步骤S100:对调用进程和被调进程进行初始化,所述调用进程和所述被调进程具有各自的页表和虚拟内存,所述回调函数定义在所述被调进程中;

步骤S102:使用调用进程的页表,运行所述调用进程的线程;

步骤S104:通过将使用的页表从所述调用进程的页表切换为被调进程的页表,在所述调用进程的线程中执行所述回调函数的指令,以生成回调函数的返回值;

步骤S106:将使用的页表从所述被调进程的页表切换回所述调用进程的页表,使用所述调用进程的页表以接收所述回调函数的返回值。

图3是根据实施例的进程间通信过程的概要示意图。如图3所示,在执行调用进程的线程的过程中,通过将使用的页表切换为被调函数的页表,因此能够在被调进程的虚拟地址空间执行调用被调进程的函数。整个通信过程都在调用进程的线程中执行,使得处理器在执行进程间通信时,仍然像是在同一个进程内通过函数调用一样就能实现进程间的数据传递,没有进程和线程的切换,也没有数据拷贝,提高了进程间的通信效率。

根据上述进程间通信方法,在运行调用进程的线程时,通过将使用的页表切换为被调进程的页表,在调用进程的线程执行被调进程的指令,即实现了在使用调用进程时执行被调进程的指令。因此,在进行进程间通信时,不发生进程和线程的切换以及数据的拷贝就能直接完成数据传递。如此,省去了进程和线程切换开销,节约了内核态与用户态的切换的不必要的处理流程,提高了通信效率。

在一些实施例中,在步骤S100中,对调用进程和被调进程进行初始化包括对内存进行初始化,即为调用进程和被调进程保留相应虚拟内存,并保留映射该虚拟内存的物理内存。虚拟内存是操作系统为每个进程独立分配的内存空间,物理内存是基于硬件结构的内存,处理器的地址线可以直接进行寻址的内存空间。虚拟内存的地址与物理内存的地址之间存在映射,该映射存储在页表中,页表由内存管理单元(Memory Management Unit,MMU)使用,每个进程具有相应的页表。

具体地,该步骤还包括:在物理内存中保留共享物理内存;在调用进程的虚拟内存中设定第一虚拟内存,并在被调进程的虚拟内存中设定第二虚拟内存。建立所述第一虚拟内存与所述共享物理内存之间的第一映射,并建立所述第二虚拟内存与所述共享物理内存之间的第二映射。

进一步地,参考图4,可以通过在调用进程的虚拟内存中保留一段固定的虚拟地址范围,来实现在调用进程的虚拟内存中设定第一虚拟内存;同理,可以通过在被调进程的虚拟内存中保留一段固定的虚拟地址范围,来实现在被调进程的虚拟内存中设定第二虚拟内存。类似地,可以通过在物理内存中保留一段固定的物理地址范围,来实现在物理内存中保留共享物理内存。优选地,在Linux系统的seL4微内核场景下,在对内存进行初始化时,可以保留对内存进行管理的字段,例如用于对内存增加权能控制等功能。该共享物理内存由特定接口提供,可以由多个进程同时访问,物理上实际是一块内存空间,但被同时映射到多个进程的虚拟地址的空间中。

通过使用共享物理内存,调用进程和被调进程都能访问共享物理内存,因此可以通过共享内存直接传递数据,在通信过程中不需要发生数据拷贝。

第一虚拟内存、第二虚拟内存和共享物理内存被统一地管理,第一虚拟内存或第二虚拟内存与所述共享物理内存之间的映射与其他虚拟内存与其他物理内存之间的映射同时存在于页表中,由MMU转换实现内存的访问。

优选地,第一映射和第二映射优先于其他虚拟内存与其他物理内存之间的映射。因此,在对进程中的其他虚拟内存与其他物理内存的映射进行分配时,不会覆盖第一虚拟内存或第二虚拟内存与所述共享物理内存之间的映射,从而保证了进程间数据传递的空间。

可以理解,第一映射用于建立第一虚拟内存的虚拟地址与共享物理内存的物理地址之间的对应关系,第二映射用于建立第二虚拟内存的虚拟地址与共享物理内存的物理地址之间的对应关系。因此,进一步优选地,第一虚拟内存的虚拟地址与共享物理内存的物理地址之间的对应关系与第二虚拟内存的虚拟地址与共享物理内存的物理地址之间的对应关系相同,即,同一物理地址对应于相同的第一虚拟内存和第二虚拟内存的虚拟地址。

在一些实施例中,与回调函数相关联的信息被存储到函数信息表中。回调函数信息表由操作系统管理,即,操作系统将进程的可被调用的函数同一管理起来。因此,参考图5,在被调进程中定义回调函数包括:

S1001:申请函数信息表的表项的地址空间;

S1002:根据回调函数的参数对函数信息表的表项进行初始化;

S1003:将基于回调函数的参数的表项加入到函数信息表中。

其中,根据回调函数的参数对函数信息表的表项进行初始化包括:定义回调函数的参数结构,定义虚拟内存指针,以及注册回调函数接口。

回调函数的参数结构例如包括:有效标志、可并行调用数、KEYID(回调函数的识别ID)、所属进程页表地址、专用栈地址、回调函数地址等。

定义虚拟内存指针具体包括定义第一虚拟内存指针和第二虚拟内存指针。该第一虚拟内存指针可以用于入参及出参。当该内存传递的数据需要被被调进程长期使用时,该第一虚拟内存指针可以保留在被调进程中。在第一虚拟内存指针被保留在被调进程中的情况下,还可以定义第二虚拟内存指针,该第二虚拟内存指针用于出参,否则,该第二虚拟内存指针可以为NULL。

回调函数接口的参数可以包括:被调进程的标识,被调进程注册的回调函数指针,回调函数允许的并行调用数(定义该并行调用数以限制恶意调用),区分被调进程中的多个回调函数的区分标识,以及被调进程执行回调函数时使用的栈空间及返回值等中转内存等。

在一些实施例中,对调用进程和被调进程进行初始化还包括:在调用进程中申请调用被调进程的回调函数。

其中,参考图6,在调用进程中申请访问被调进程的回调函数包括:

S1004:查找函数信息表,获取回调函数的索引和回调函数允许的并行调用数;

S1005:赋予调用进程调用回调函数的权限;

S1006:返回回调函数的信息。

通过上述步骤,在调用进程中申请使用被调进程的函数,调用进程的申请调用是通过查找函数信息表从而获取回调函数的索引来实现的。

在一些实施例中,优选地,对调用进程和被调进程进行初始化还包括:在所述调用进程和所述被调进程中设定切换指令,其中,切换指令用于指示进行所述调用进程与所述被调进程之间的通信。

在上述进程间通信过程中,需要进入内核态以进行切换页表、修改栈指针等操作。然而,从用户态切换到内核态时,为了考虑通用性,执行路径会比较长,包含需要保存和恢复的资源也较多,因此常规的切换路径对指令的消耗较大。为实现调用进程与被调进程之间的高效通信,在调用进程和被调进程中设定了切换指令,用于指示调用进程与被调进程之间的通信。通过该指令,处理器能够快速地识别进程间通信请求,并执行用户态与内核态之间的快速切换,而不必经过通用的切换流程,节约指令的消耗,实现用户态与内核态之间的快速切换。

以ARM处理器为例,可以设定svc指令的立即数参数作为该切换指令,例如,设定svc#1用于请求从调用进程切换到被调进程,svc#2用于请求从被调进程切回到调用进程。对于其他功能,则使用svc的其他立即数参数。

如何实现进程间的数据传递是实现进程间通信的关键。以下将详细描述根据本发明的在调用进程和被调进程间的数据传递过程。

在一些实施例中,参见图7,通过使用寄存器来实现调用进程和被调进程间的数据传递。

在该实施例中,在上述步骤S102中,使用调用进程的页表,运行在所述调用进程的线程包括:步骤S1021:获取与回调函数相关联的参数,将所述参数写入至第一寄存器。

其中,调用进程可以通过查找函数信息表并基于回调函数的索引来获取与回调函数相关联的参数。与回调函数相关联的参数可以包括:回调函数栈地址、回调函数所属进程(被调进程)的页表地址、函数地址等,此外,与回调函数相关联的参数还包括回调函数实参,即由调用进程所定义的需要由回调函数执行运算的参数。然后,上述参数存储到第一寄存器。该第一寄存器可以是计算机设备中的通用寄存器,用于传送和暂存数据。以64bit的通用寄存器为例,入参可以传递8个8字节的数据,并且可以返回达到8个8字节的数据作为返回值,可满足大部分通信场景,尤其适用于管理数据的通信。

应当理解,该第一寄存器可以包括多个通用寄存器,例如可以是一组通用寄存器。此外,在不同的CPU架构上,该第一寄存器具有不同的专用名称,只要是能够实现上述功能的寄存器即可。

在上述步骤S104中,通过将使用的页表从所述调用进程的页表切换为被调进程的页表,在所述调用进程的线程中执行所述回调函数的指令,以生成回调函数的返回值,具体可以包括以下步骤S1041-S1046:

步骤S1041:通过执行切换指令切换到内核态。根据上述在调用进程中设定的svc#1指令,将使用的页表从调用进程的页表切换为被调进程的页表。根据上述分析可知,通过执行svc#1指令,处理器能够快速识别并执行切换页表的处理。

步骤S1042:将切换使用的页表时的调用进程的页表的参数存储到内存空间作为切换页表参数。当切换使用的页表时,将此时调用进程的页表的参数存储到内存空间作为切换页表参数,备份调用进程的页表的参数,以便于使用的页表被重新切换回到调用进程的页表时,能够基于该切换页表参数继续运行。上述存放切换页表参数的内存空间是计算机的物理内存中专属于调用进程的内存区域。以ARM处理器为例,切换页表参数例如包括:调用进程的处理器页表地址寄存器(ttbr,用于切换页表)、栈顶指针寄存器(sp,栈顶指针)、子程序返回地址寄存器(lr,用于在回调函数调用返回时使用该地址找到函数调用后的下一条指令)、帧指针寄存器(fp,栈底指针)的相关数据。通过将上述切换页表参数存储到内存空间,能够保存切换页表时的页表信息,以便在将使用的页表重新切换回调用进程的页表时,能够基于调用进程的页表被切换时运行的位置,从而继续运行调用进程,使得调用进程的指令能够顺序、准确地被执行。

步骤S1043:基于被调进程的页表的参数,将使用的页表切换为被调进程的页表。类似地,被调进程的页表的参数例如包括:被调用进程的处理器页表地址寄存器(ttbr,用于切换页表),栈顶指针寄存器(sp,栈顶指针),帧指针寄存器(fp)等的相关数据。

通过该步骤S1043,将使用的页表从调用进程的页表切换为被调进程的页表。具体地,所述调用进程的线程中执行所述回调函数的指令,但由于定义在被调进程中的回调函数不能访问调用进程的线程所对应的栈,并且回调函数不属于被调进程的任何线程,即回调函数此时的实际运行线索不在被调进程的任何线程中,因此,此时需要为回调函数创建回调函数专用栈,以供回调函数被调用执行时使用。回调函数专用栈所需的栈空间在注册回调函数接口时预留,位于被调进程的内存。进一步地,如果支持N个回调函数并行执行,则创建N个回调函数专用栈,回调函数专用栈与回调函数一一对应。在该步骤S1043中,将使用的页表切换为被调进程的页表时,同时将与栈指针相关的参数切换到新创建的回调函数专用栈。

步骤S1044:从所述第一寄存器获取所述参数,基于所述参数执行所述回调函数的指令,生成所述回调函数的返回值。

在该步骤S1044中,基于切换后的栈指针(sp),利用回调函数专用栈执行回调函数。

步骤S1045:通过执行切换指令切换到内核态。

步骤S1046:将所述回调函数的返回值存储在所述第一寄存器中。

换言之,在上述步骤S1041-S1046的过程中,经由第一寄存器来传递需要在调用进程和被调进程之间通信的参数,以实现在执行调用进程的过程中执行被调进程中的回调函数。

在上述步骤S106中,将使用的页表从所述被调进程的页表切换回所述调用进程的页表,使用所述调用进程的页表以接收所述回调函数的返回值,可以包括以下步骤S1061-S1062:

步骤S1061:从所述内存空间获取所述切换页表参数,并基于所述切换页表参数继续使用所述调用进程的页表运行所述调用进程。

应当理解,在步骤S1061中,将使用的页表切换回调用进程的页表,并通过将与栈指针相关的参数切换回到调用进程的线程所对应的栈而将线程栈切换回调用进程的线程所对应的栈。

步骤S1062:从所述第一寄存器读取所述返回值。该返回值可以供调用进程后续使用。

由以上步骤可知,通过切换使用的页表,从而调用在被调进程中定义的回调函数,以获得回调函数的返回值。在一些实施例中,在上述过程中,在从第一寄存器获取与回调函数相关联的参数之前,还将回调函数的调用返回地址存储到第二寄存器中,以便执行回调函数后能够基于调用返回地址继续执行被调进程的指令。此外,当回调函数的返回值是常规的数据类型(例如整数类型、指针类型)时,在生成回调函数的返回值之后,返回值被存储到第二寄存器中,以ARM处理器为例,该第二寄存器可以是用于子程序调用时的参数和返回值传递的X0寄存器,然后从第二寄存器中获取返回值并存储到第一寄存器中。

替代性地,当回调函数的返回值是较大的数据结构时(例如自定义的数据结构),回调函数的返回值被保存在间接结果寄存器所指向的地址空间。间接结果寄存器中的值是一内存地址,该内存地址指向的内存用于存储回调函数的返回值。被调进程的内存中预留有一段地址,这段预留的地址所指向的内存空间用于存储回调函数的返回值。在这种情况下,在将使用的页表切换为被调进程的页表之后,首先将间接结果寄存器存入被调进程的内存中,即,对间接结果寄存器的原有值进行备份,并且同时将预留的地址存储到间接结果寄存器中(用于存储回调函数的返回值);在执行回调函数并生成回调函数的返回值之后,返回值被存储到被调进程的预留的地址所指向的内存中。在从被调进程的用户态切换到内核态之后,再将返回值存储到第一寄存器中。通过第一寄存器,将返回值最终返回到调用进程的用户态。当回调函数执行完毕之后,还将备份的间接结果寄存器的原有值恢复到间接结果寄存器,使得间接结果寄存器恢复原值。在ARM处理器中,该间接结果寄存器可以是×8寄存器。

在一实施例中,用于备份×8寄存器的内存、存储函数返回值的内存以及回调函数专用栈的栈空间是被调进程的内存中的一段专用的连续地址空间,用于栈及数据中转内存。

在上述处理中,调用进程的内存是区别于第一虚拟内存的调用进程的虚拟内存,被调进程的内存是区别于第二虚拟内存的被调进程的虚拟内存。

通过上述处理,在执行调用进程时,通过将使用的页表切换为被调进程的页表,从而在运行调用进程的线程时执行被调进程的指令。在此过程中,线程的执行线索并未经系统调度切换,不会由于进程间的通信而产生线程或进程的切换开销。

在上述通过使用第一寄存器来实现调用进程和被调进程间的数据传递的实施例中,适于传递有限大小的参数。例如,当第一寄存器为64bit的寄存器时,适于传递8个8字节的参数。通过第一寄存器来传递参数,能够实现同步通信。

作为在进程间传递数据的另一示例,在一些实施例中,当调用进程和被调进程间需要传递的数据量较大时,通过使用共享物理内存在实现调用进程和被调进程间的大量数据传递。在该实施例中,进程间通信的过程与图7所示的使用寄存器进行进程间数据传递的过程近似,不同之处在于将第一寄存器替换为共享物理内存。因此,以下仅描述与上述实施例不同的部分。

进一步参考图4和图8,在一些实施例中,在初始化阶段,在物理内存中保留共享物理内存,使得调用进程和被调进程都能访问共享物理内存。

在一些实施例中,在步骤S102中,使用调用进程的页表,运行所述调用进程的线程包括:通过所述第一映射将与回调函数相关联的参数写入至所述共享物理内存。

在步骤S104中,在所述调用进程的线程执行所述回调函数的指令,以生成回调函数的返回值包括:通过所述第二映射从所述共享物理内存获取所述参数,基于所述参数执行所述回调函数的指令,生成所述回调函数的返回值;将所述回调函数的返回值存储在所述共享物理内存中;

在步骤S106中,使用所述调用进程的页表以接收所述回调函数的返回值包括:通过所述第一映射从所述共享物理内存读取所述返回值。

共享物理内存是调用进程和被调进程都能够访问的一段物理内存。由以上步骤可知,通过映射来获取并传递共享物理内存的数据,以实现调用进程与被调进程之间的数据传递。如此,不需要经历数据拷贝。此外,通过共享物理内存实现进程间传递数据,能够传递更大的内存数据,只要所申请的物理共享内存的空间大于所要传递的数据的大小即可。因此,通过共享物理内存传递数据的实施例适用于例如在进程间传递网络数据包、文件缓存等。通过共享物理内存,可以将内存数据传递给被调进程,其他进程获取内存数据后可以先返回该次调用,并将内存数据放入缓存队列,待内存数据处理完成后再通知调用进程,以实现异步通信。替代性地,也可以在回调函数中直接处理数据并返回,即实现同步通信。

当完成参数传递后,即生成回调函数的返回值之后,可以取消第一映射和第二映射,使得调用进程和被调进程不再能从共享物理内存获取数据,保证共享物理内存中的数据安全性。

在本实施例中,切换使用的页表的方式与前述实施例相同,在此不再赘述。当应当理解的是,可以结合使用寄存器和共享物理内存来传递参数,以适应多样化的参数传递需求。

在一些实施例中,当在使用被调进程的页表的期间所述调用进程的线程被操作系统调度切出时,将此时被调进程的页表的参数存储到所述内存空间作为暂停页表参数;当所述调用进程的线程继续运行时,继续将使用的页表设置为被调进程的页表,并基于所述暂停页表参数继续运行被调进程。

调用进程的线程在运行过程中可能被切出而处于休眠状态,如果该进程被切出时回调函数仍未结束,当该线程休眠结束被重新运行时,基于线程被切出时所存储的页表的参数继续将使用的页表设置为被调进程的页表,以确保回调函数被暂停执行之后能够继续被执行。在一些实施例中,暂停页表参数可以存储到线程数据块中,供操作系统调度器访问。此外,在将使用的页表切换到被调进程的页表时,应当立即将暂停页表参数存储到线程数据块中。当回调函数执行完成后,将使用的页表切换回调用进程的页表时,应当恢复线程数据块中的暂存页表为调用进程的页表。

在上述实施例中,描述了在调用进程和被调进程间的通信过程。然而,本发明不限于两个进程间的通信。具体地,被调进程还能进一步调用二级被调进程,二级被调进程还能进一步调用三级被调进程等。三级被调进程返回后,继续执行二级被调进程;二级被调进程返回后,继续执行被调进程;被调进程返回后,继续执行调用进程,以及类推。在这种情况下,需要以栈的方式依次保存上一级进程的切换页表参数,即,依次将调用进程、被调进程、二级被调进程和三级被调进程的切换页表参数保存入栈,返回时依次将三级被调进程、二级被调进程、被调进程和调用进程的切换页表参数出栈,从而逐层恢复上一级进程的页表数据,以保证返回后正确切换回调用者的地址空间。

根据本发明的实施例的进程间通信过程的概要示意图如图8所示,根据发明的进程间通信方法的过程始终在调用进程的线程中执行。在切换使用的页表前,在调用进程的虚拟地址空间执行该方法;在切换使用的页表后,由于使用的页表切换为被调进程的页表,在被调进程的虚拟地址空间执行该方法。因此,仅通过切换使用的页表即实现进程间通信。

根据实施例的上述方法可以由处理器执行,例如ARM处理器,以实现进程间通信。上述方法可以应用于linux操作系统,更具体地应用于seL4微内核系统。但应当理解的是,本领域技术人员可以在做出适当修改和变形的情况下将本发明的方法应用于其他处理器和其他操作系统。

根据本发明的进程间通信方法减少内核态切换开销、省去进程间切换开销、省去数据拷贝开销,精简了通信过程,大大提高了通信效率。这对于通信实时性要求较高的系统,例如自动驾驶车载系统是特别有用的。例如针对seL4微内核,使用根据本发明的进程间通信方法的运行速度是现有通信方法的3~3.8倍。此外,本发明不要求特殊的硬件改造以及内核大规模变更,是一种很易实现的高效进程间通信方法。

参考图9,在其中一个实施例中,提供了一种进程间通信装置800,其包括初始化模块820,第一页表切换模块840和第二页表切换模块860。其中,初始化模块820配置为对调用进程和被调进程进行初始化,所述调用进程和所述被调进程具有各自的页表和虚拟内存,所述回调函数定义在所述被调进程中;第一页表切换模块840配置为使用调用进程的页表,运行所述调用进程的线程;通过将使用的页表从所述调用进程的页表切换为被调进程的页表,在所述调用进程的线程中执行所述回调函数的指令,以生成回调函数的返回值;第二页表切换模块860配置为将使用的页表从所述被调进程的页表切换回所述调用进程的页表,使用所述调用进程的页表以接收所述回调函数的返回值。

根据上述进程间通信装置,在运行调用进程时,通过将使用的页表切换为被调进程的页表,从而在运行调用进程的线程时执行被调进程的指令,即实现了在运行调用进程时执行被调进程的指令。因此,在进行进程间通信时,不发生进程和线程的切换以及数据的拷贝就能直接完成数据传递。如此,省去了进程和线程切换开销,节约了内核态与用户态的切换的不必要的处理流程,提高了通信效率。

在一些实施例中,初始化模块820还配置为:在物理内存中保留共享物理内存;在调用进程的虚拟内存中设定第一虚拟内存,并在被调进程的虚拟内存中设定第二虚拟内存;以及建立所述第一虚拟内存与所述共享物理内存之间的第一映射,并建立所述第二虚拟内存与所述共享物理内存之间的第二映射;其中,所述第一映射和所述第二映射优先于其他虚拟内存与其他物理内存之间的映射。

在一些实施例中,第一页表切换模块840还配置为:获取与回调函数相关联的参数,将所述参数存储到第一寄存器;从所述第一寄存器获取所述参数,基于所述参数执行所述回调函数的指令,生成所述回调函数的返回值;将所述回调函数的返回值存储在所述第一寄存器中;第二页表切换模块860还配置为:使用所述调用进程的页表以接收所述回调函数的返回值包括:从所述第一寄存器读取所述返回值。

在一些实施例中,第一页表切换模块840还配置为:通过所述第一映射将与回调函数相关联的参数写入至所述共享物理内存;通过所述第二映射从所述共享物理内存获取所述参数,基于所述参数执行所述回调函数的指令,生成所述回调函数的返回值;将所述回调函数的返回值存储在所述共享物理内存中;第二页表切换模块860还配置为:通过所述第一映射从所述共享物理内存读取所述返回值。

在一些实施例中,第一页表切换模块840还配置为:将切换使用的页表时的调用进程的页表的数据存储到内存空间作为切换页表参数;第二页表切换模块860还配置为:从所述内存空间获取所述切换页表参数,并基于所述切换页表参数继续使用所述调用进程的页表。

在一些实施例中,第一页表切换模块840还配置为:当在使用被调进程的页表的期间所述调用进程的线程被切出时,将此时被调进程的页表的参数存储到所述内存空间作为暂停页表参数;第二页表切换模块860还配置为:当所述调用线程继续使用时,继续将使用的页表设置为被调进程的页表,并基于所述暂停页表参数继续使用。

在一些实施例中,第二页表切换模块860还配置为:取消所述第一映射和所述第二映射。

在一些实施例中,初始化模块820还配置为:在所述调用进程和所述被调进程中设定切换指令,所述切换指令用于指示进行所述调用进程与所述被调进程之间的通信。

根据实施例的进程间通信装置能够实现与上述进程间通信方法类似的处理,其具体实现过程参照上述进程间通信方法,在此不再赘述。

在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图10所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现上述各个方法实施例中的步骤。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。

本领域技术人员可以理解,图10中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

本发明还提供了一个或多个存储有计算机可读指令的非易失性计算机可读存储介质,计算机可读指令被一个或多个处理器执行时,使得一个或多个处理器执行上述各个方法实施例中的步骤。

在优选的实施例中,上述指令可以加载在调用进程和被调进程的虚拟内存的相同的地址段中,例如,上述指令加载在调用进程的虚拟内存的地址为1000~8000的空间中,并同时加载在被调进程的虚拟内存的地址为1000~8000的空间中。在这种情况下,使得在切换页表的前后CPU顺序加载指令时都能正确地获取当前的指令,实现平滑的页表空间切换,而不影响调用进程的线程的执行。然而,上述指令也可以加载在在调用进程和被调进程的虚拟内存的不同的地址段中,只要增加相应的寻址和跳转指令以正确获取要执行的指令即可。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机可读指令来指令相关的硬件来完成,所述的计算机可读指令可存储于一非易失性计算机可读取存储介质中,该计算机可读指令在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(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)等。

以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。

技术分类

06120113178286