一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

同步进程间通信方法、装置、设备及存储介质与流程

2022-12-19 23:21:05 来源:中国专利 TAG:
1.本技术涉及计算机通信技术,尤其涉及一种同步进程间通信方法、装置、设备及存储介质。
背景技术
::2.同步进程间通信(inter-processcommunication,简称ipc)是微内核操作系统(microkerneloperatingsystem,简称mos)中的一种不同进程间同步传输数据的机制,在嵌入式实时操作系统(real-timeoperatingsystem,简称rtos)向完整可移植操作系统(portableoperatingsysteminterfaceofunix,简称posix)的转换中起着至关重要的作用。在微内核操作系统架构中,不同用户进程间基于同步ipc进行通信,例如processmanager通过同步ipc与文件系统通信。因此,同步ipc被认为是应用程序运行时开销的一个主要因素,它决定了应用程序在微内核上的性能。3.相关技术中,第一进程和第二进程分别调用内存分配函数分配虚拟内存。在第一进程通过同步ipc向第二进程传输数据时,将第一进程的用户空间虚拟地址映射到第二进程对应的用户空间虚拟地址,根据映射的用户空间虚拟地址执行数据拷贝,以实现第一进程和第二进程的同步ipc。4.但采用上述技术实现第一进程和第二进程的同步ipc时,存在较大的时间开销,从而影响同步ipc的实时性。技术实现要素:5.本技术提供一种同步进程间通信方法、装置、设备及存储介质,能够节省同步ipc数据传输的时间开销,提升同步ipc的数据传输性能。6.第一方面,本技术提供一种同步进程间通信方法,包括:第一进程调用同步ipc发送接口向第二进程发送第一进程数据,第一进程数据存放在第一进程用户空间虚拟地址中;在第一进程接收到来自第二进程的接收指示时,第一进程基于第一偏移量和第二偏移量,将第一进程用户空间虚拟地址转换为第一进程内核空间虚拟地址;在第二进程接收到来自第一进程的发送指示时,第二进程基于第三偏移量和第二偏移量,将第二进程用户空间虚拟地址转换为第二进程内核空间虚拟地址,并根据第一进程内核空间虚拟地址和第二进程内核空间虚拟地址完成第一进程数据的拷贝;其中,第一进程用户空间虚拟地址和第二进程用户空间虚拟地址对应的物理地址连续,第一偏移量为第一进程用户空间虚拟地址相对物理地址的偏移量,第二偏移量为内核空间虚拟地址相对物理地址的固定偏移量,第三偏移量为第二进程用户空间虚拟地址相对物理地址的偏移量。7.可选的,第一进程基于第一偏移量和第二偏移量,将第一进程用户空间虚拟地址转换为第一进程内核空间虚拟地址,包括:第一进程调用第一函数,将第一进程用户空间虚拟地址转换为第一进程内核空间虚拟地址;第一函数为:kva1=va1-pool1_offset physvirt_offset,其中,kva1表示第一进程内核空间虚拟地址,va1表示第一进程用户空间虚拟地址,pool1_offset表示第一偏移量,physvirt_offset表示第二偏移量。8.可选的,第二进程基于第三偏移量和第二偏移量,将第二进程用户空间虚拟地址转换为第二进程内核空间虚拟地址,包括:第二进程调用第二函数,将第二进程用户空间虚拟地址转换为第二进程内核空间虚拟地址;第二函数为:kva2=va2-pool2_offset physvirt_offset,其中,kva2表示第二进程内核空间虚拟地址,va2表示第二进程用户空间虚拟地址,pool2_offset表示第三偏移量,physvirt_offset表示第二偏移量。9.可选的,根据第一进程内核空间虚拟地址和第二进程内核空间虚拟地址完成第一进程数据的拷贝,包括:第二进程根据第一进程内核空间虚拟地址、第二进程内核空间虚拟地址和第一进程数据的大小,通过内存复制函数完成第一进程数据的拷贝。10.可选的,在第一进程需进行同步ipc时,第一进程调用第一分配接口,得到第一进程用户空间虚拟地址,第一分配接口用于在同步ipc池中为进程分配对应连续物理地址的用户空间虚拟内存,同步ipc池是同步ipc池初始化时为第一进程分配的。11.可选的,第一分配接口在为第一进程分配第一进程用户空间虚拟地址时,具体用于:第一分配接口检查同步ipc池中的空闲内存是否满足第一进程的虚拟内存需求;若是,则从同步ipc池中为第一进程分配用户空间虚拟内存,得到第一进程用户空间虚拟地址。12.可选的,第一分配接口还用于:在同步ipc池中的空闲内存不满足第一进程的虚拟内存需求时,第一分配接口通过调用内存分配函数为第一进程分配用户空间虚拟内存,得到第三用户空间虚拟内存,第三用户空间虚拟内存对应物理地址非连续;方法还包括:当第一进程需要向第二进程发送第一进程数据时,第一进程调用同步ipc发送接口向第二进程发送存放第一进程数据的第三用户空间虚拟地址。13.可选的,在第一进程使用同步ipc之前,第一进程执行同步ipc池初始化,同步ipc池初始化用于从进程虚拟地址空间中为第一进程分配同步ipc池,并在预留物理内存中为第一进程分配物理地址,将物理地址映射至同步ipc池,记录第一偏移量,预留物理内存是内核初始化时在内核中预留的连续的物理内存。14.第二方面,本技术实施例还提供一种同步进程间通信装置,包括:发送模块,用于通过第一进程调用同步ipc发送接口向第二进程发送第一进程数据,第一进程数据存放在第一进程用户空间虚拟地址中;处理模块,用于在第一进程接收到来自第二进程的接收指示时,通过第一进程基于第一偏移量和第二偏移量,将第一进程用户空间虚拟地址转换为第一进程内核空间虚拟地址;以及,在第二进程接收到来自第一进程的发送指示时,通过第二进程基于第三偏移量和第二偏移量,将第二进程用户空间虚拟地址转换为第二进程内核空间虚拟地址,并通过第二进程根据第一进程内核空间虚拟地址和第二进程内核空间虚拟地址完成第一进程数据的拷贝;其中,第一进程用户空间虚拟地址和第二进程用户空间虚拟地址对应的物理地址连续,第一偏移量为第一进程用户空间虚拟地址相对物理地址的偏移量,第二偏移量为内核空间虚拟地址相对物理地址的固定偏移量,第三偏移量为第二进程用户空间虚拟地址相对物理地址的偏移量。15.第三方面,本技术实施例还提供一种电子设备,包括:存储器和处理器;存储器,用于存储程序指令和数据;处理器,用于调用程序指令,以执行如上述第一方面提供的同步进程间通信方法的方案。16.第四方面,本技术实施例还提供一种可读存储介质,可读存储介质上存储有程序指令;程序指令被执行时,实现如上述第一方面提供的同步进程间通信方法的方案。17.第五方面,本技术实施例还提供一种计算机程序产品,计算机程序产品包含计算机程序,当计算机程序被执行时,实现如上述第一方面的同步进程间通信方法的方案。18.本技术提供的同步进程间通信方法、装置、设备及存储介质,通过为进程分配物理地址连续的虚拟地址空间,基于进程的用户空间虚拟地址相对物理地址的偏移量、内核空间虚拟地址相对物理地址的偏移量,将进程的用户空间虚拟地址分别转换为内核空间虚拟地址,进而实现数据的同步ipc。由于进行同步ipc的两个进程存储数据的虚拟地址对应的物理地址连续,将进程的用户空间虚拟地址分别转换为内核空间虚拟地址的操作仅通过简单的计算即可实现,从而节省了同步ipc数据传输的时间开销,提升了同步ipc的数据传输性能。附图说明19.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本技术的实施例,并与说明书一起用于解释本技术的原理。20.图1为本技术实施例提供的同步进程间通信方法的应用场景的一示例图;21.图2为本技术实施例提供的同步进程间通信方法的流程示意图一;22.图3为本技术实施例提供的同步进程间通信方法的流程示意图二;23.图4为本技术实施例提供的同步进程间通信方法的初始化内存映射示意图;24.图5为本技术实施例提供的同步进程间通信方法的内存分配示意图;25.图6为本技术实施例提供的同步进程间通信装置的结构示意图;26.图7为本技术实施例提供的电子设备的结构示意图。27.通过上述附图,已示出本技术明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本技术构思的范围,而是通过参考特定实施例为本领域技术人员说明本技术的概念。具体实施方式28.这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本技术相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本技术的一些方面相一致的装置和方法的例子。29.为了便于本领域技术人员对本技术实施例的理解,首先对本技术实施例中涉及到的术语进行介绍:30.虚拟地址空间,每个进程都分配有自己的虚拟地址空间,而且只能访问自己被分配使用的虚拟地址空间,以实现进程隔离。31.虚拟地址空间和物理地址空间之间存在映射,映射是通过内存管理单元(memorymanagementunit,简称mmu)来完成的,进程可以通过操作自己的虚拟地址空间间接地操作物理地址空间。32.用户空间(userspace)是用户程序运行的空间,内核空间(kernelspace)是系统内核运行的空间。现在的操作系统都是采用的虚拟存储器,对于32位的操作系统而言,它的虚拟地址空间就是2的32次方,即4gb。操作系统的核心是内核,它独立于普通的应用程序,可以访问受保护的虚拟地址空间,也可以访问底层硬件设备。为了保护用户进程不能直接操作内核,保证内核的安全,操作系统从逻辑上将虚拟地址空间划分为用户空间和内核空间。针对linux操作系统而言,将最高的1gb字节供内核使用,称为内核空间,较低的3gb字节供各进程使用,称为用户空间。其中,进程共享内核空间。33.用户态,运行在用户空间的进程处于用户态。34.内核态,运行在内核空间的进程处于内核态。在内核态下,cpu可以访问内存的所有数据,包括外围设备,cpu也可以将自己从一个进程切换到另一个进程。35.操作系统虽然从逻辑上将虚拟地址空间划分为用户空间和内核空间,但不可避免的会存在某些运行在用户空间的进程需要访问内核空间的资源,而系统调用是用户空间的进程访问内核空间的唯一方式,保证了所有的操作都是在内核的控制下进行的,避免了用户空间的进程对内核空间的越权访问,提升系统的安全性和稳定性。36.客户端/服务器(client/server,简称c/s)模型,是一种典型的ipc模型。在c/s模型中,通信双方的进程分别为客户端进程和服务器进程。37.接下来,以c/s模型为例,说明客户端进程和服务器进程两端通过同步ipc进行数据通信的具体实现。38.在客户端进程和服务器进程两端通过同步ipc进行数据通信时,由于大部分操作系统及使用场景会启动mmu,而mmu会使这两端不属于同一虚拟地址空间,因此,无法通过客户端进程和服务器进程这两端的虚拟地址进行一次数据拷贝。39.基于上述,针对客户端进程和服务器进程的数据传递,一般方法是执行两次拷贝实现:从客户端进程的用户空间虚拟地址拷贝数据到内核空间虚拟地址,再将数据从内核空间虚拟地址拷贝到服务器进程的用户空间虚拟地址。对于大数据进行两次数据拷贝,会产生较大的性能开销。且,由于内核不清楚传送多大的数据,因此内核空间虚拟地址的大小很难确定,如果临时申请内存,会带来较大的性能开销。另外,对于智能驾驶领域微内核临时分配内存会产生不确定性,不满足功能安全规范。40.或者,针对客户端进程和服务器进程的数据传递,使用虚拟地址映射和一次拷贝实现:通过软件方式将客户端进程的用户空间虚拟地址映射到服务器进程对应的用户空间虚拟地址,根据映射的用户空间虚拟地址执行一次数据拷贝。但该种实现中,地址映射操作页表会产生较大的时间开销。41.针对相关技术中存在的较大时间开销问题,本技术提供一种同步进程间通信方法、装置、设备及存储介质,引入对应连续物理地址的快速缓存(fastbuffer),通过一次虚拟地址映射和一次数据拷贝即可完成数据传输,其中,虚拟地址映射是通过地址偏移实现的。42.相比两次数据拷贝方案,减少了一次数据拷贝,能节省较大的数据拷贝时间开销,实现同步ipc的性能优化;对比上述一次虚拟地址映射和一次数据拷贝的方案,优化了虚拟地址映射逻辑,只需一条语句即可完成虚拟地址映射,无需通过复杂的逻辑操作页表来完成地址映射,能节省较大的地址映射导致的时间开销,实现同步ipc的性能优化。可以理解,需传输的数据量越大,本技术同步ipc性能优化效果越好。43.本技术可以应用于智能驾驶领域等
技术领域
:。对于智能驾驶领域,能够达到保障功能安全,维护人身财产安全,确保智能驾驶组件能够及时响应,以及保证实时操作系统(realtimeoperatingsystem,简称rtos)的实时性的效果。44.图1为本技术实施例提供的同步进程间通信方法的应用场景的一示例图。如图1所示,在多进程操作系统中,每个进程都被分配有独立的虚拟内存(或称虚拟地址空间),使得进程间相互隔离,这种隔离是为了避免进程之间(例如,图1中的第一进程和第二进程)互相影响。进程是通过虚拟地址空间实现隔离的,具体地,第一进程的虚拟地址空间和第二进程的虚拟地址空间不同,这样就可以防止第一进程修改第二进程中的数据。进程可以通过操作自己的虚拟地址空间而间接地操作物理内存(或称物理地址空间)。45.虚拟地址空间可以分为用户空间和内核空间,用户进程在用户空间运行(用户态),不能直接访问物理内存;内核进程在内核空间运行(内核态),能够访问内核空间的资源,比如访问物理内存等操作,用户进程可以执行系统调用而从用户空间进入内核空间。其中,内核空间是被所有进程共享的。进程在被执行前或被释放后处于用户空间,在被执行时进入内核空间,即从用户态切换为内核态。其中,不同进程的用户空间被映射到不同的物理内存区域,而内核空间则被映射到同一块物理内存区域。46.下面以具体地实施例对本技术的技术方案以及本技术的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本技术的实施例进行描述。47.图2为本技术实施例提供的同步进程间通信方法的流程示意图一。如图2所示,该同步进程间通信方法包括:48.s201:第一进程调用同步ipc发送接口向第二进程发送第一进程数据,第一进程数据存放在第一进程用户空间虚拟地址中。49.在本实施例中,由第一进程向第二进程发送数据。例如,第一进程可以是由客户端(client端)对应的应用程序发起,第二进程可以是由服务器(server端)对应的应用程序发起。其中,第一进程被分配有第一进程用户空间虚拟地址,第二进程被分配有第二进程用户空间虚拟地址,第一进程用户空间虚拟地址和第二进程用户空间虚拟地址对应的物理地址连续。50.该第一进程数据由第一进程写入用户空间。可选的,第一进程可以申请分配一段用户空间虚拟地址,将第一进程数据存放其中,这一段由第一进程申请分配的用户空间虚拟地址即为第一进程用户空间虚拟地址。当第一进程需要向第二进程发送第一进程数据时,第一进程调用同步ipc发送接口向第二进程第一进程数据。51.示例性的,同步ipc发送接口可以采用send()函数实现,第一进程调用send()函数将第一进程数据发送给第二进程。之后,第一进程由系统调用进入内核态,等待第二进程释放接收指示,进入等待(pending)状态。其中,该接收指示用于向第一进程通知其已接收成功的状态。52.一些实施例中,第二进程可以采用receive()函数作为同步ipc接收接口,实现对第一进程发送的第一进程数据的接收。之后,第二进程由系统调用进入内核态,释放接收指示,激活第一进程获得调度,并等待第一进程释放发送指示,进入等待(pending)状态。53.可选的,第二用户空间虚拟地址可以与第一用户空间虚拟地址的空间大小相同,也可以不相同。54.其中,第一进程用户空间虚拟地址相对其物理地址的偏移量为第一偏移量,该第一偏移量在第一进程初始化时被确定,可以由第一进程进行查询和记录;第二进程用户空间虚拟地址相对其物理地址的偏移量为第三偏移量,该第三偏移量在第二进程初始化时被确定,第三偏移量可以由第二进程进行查询和记录。55.s202:在第一进程接收到来自第二进程的接收指示时,第一进程基于第一偏移量和第二偏移量,将第一进程用户空间虚拟地址转换为第一进程内核空间虚拟地址。56.其中,第二偏移量为内核空间虚拟地址相对物理地址的固定偏移量,第二偏移量在内核初始化时被确定。57.可选地,第一进程响应于接收到来自第二进程的接收指示,由等待(pending)状态转为运行(running)状态。之后,第一进程根据第一偏移量和第二偏移量,将第一进程用户空间虚拟地址转换为第一进程内核空间虚拟地址。58.示例性的,第一进程可以调用地址转换函数实现上述地址转换。由于第一进程用户空间虚拟地址对应物理连续的内存,因此,只需简单的数学计算即可完成虚拟地址映射。59.第一进程将第一进程用户空间虚拟地址转换为第一进程内核空间虚拟地址后,释放发送指示,激活第二进程获得调度,等待第二进程释放回复指示,第一进程进入等待(pending)状态。60.s203:在第二进程接收到来自第一进程的发送指示时,第二进程基于第三偏移量和第三偏移量,将第二进程用户空间虚拟地址转换为第二进程内核空间虚拟地址,并根据第一进程内核空间虚拟地址和第二进程内核空间虚拟地址完成第一进程数据的拷贝。61.可选地,第二进程在接收到来自第一进程的发送指示后,由等待(pending)状态转为运行(running)状态;然后,将第二进程用户空间虚拟地址转换为第二进程内核空间虚拟地址,并根据第一进程内核空间虚拟地址和第二进程内核空间虚拟地址完成第一进程数据的拷贝。62.示例性的,第二进程可以调用地址转换函数实现上述地址转换。同理,由于第二进程用户空间虚拟地址对应物理连续的内存,因此,只需简单的数学计算即可完成虚拟地址映射。63.可选地,第二进程在根据第一进程内核空间虚拟地址和第二进程内核空间虚拟地址完成数据的拷贝时,可以具体为:第二进程根据第一进程内核空间虚拟地址、第二进程内核空间虚拟地址和第一进程数据的大小,通过内存复制函数完成第一进程数据的拷贝。示例地,第二进程可以通过memcpy(kva2,kva1,size)完成数据拷贝,kva2表示第二进程内核空间虚拟地址,kva1表示第一进程内核空间虚拟地址,size表示数据大小。64.可选地,在完成数据拷贝后,第二进程调用reply()接口释放回复指示,通知第一进程同步ipc结束,结束第二进程。对应地,第一进程在接收到回复指示后,由等待(pending)状态转为运行(running)状态,结束第一进程。65.本技术实施例中,在确保进行同步ipc的两个进程存储数据的虚拟地址对应的物理地址连续的前提下,基于进程的用户空间虚拟地址相对物理地址的偏移量、内核空间虚拟地址相对物理地址的偏移量,将进程的用户空间虚拟地址分别转换为内核空间虚拟地址,进而实现数据的同步ipc。由于物理地址连续,将进程的用户空间虚拟地址分别转换为内核空间虚拟地址的操作仅通过简单的计算即可实现,从而节省了同步ipc数据传输的时间开销,提升了同步ipc的数据传输性能。66.在上述实施例中,在基于第一偏移量和第二偏移量,将第一进程用户空间虚拟地址转换为第一进程内核空间虚拟地址,或,基于第三偏移量和第二偏移量,将第二进程用户空间虚拟地址转换为第二进程内核空间虚拟地址时,可以通过多种方式实现,以下进行举例说明:67.一种示例中,第一进程基于第一偏移量和第二偏移量,将第一进程用户空间虚拟地址转换为第一进程内核空间虚拟地址,可以包括:第一进程调用第一函数,将第一进程用户空间虚拟地址转换为第一进程内核空间虚拟地址。68.其中,第一函数可以为:69.kva1=va1-pool1_offset physvirt_offset70.其中,kva1表示第一进程内核空间虚拟地址,va1表示第一进程用户空间虚拟地址,pool1_offset表示第一偏移量,physvirt_offset表示第二偏移量。71.可选的,在上述实施例中,第二进程基于第三偏移量和第二偏移量,将第二进程用户空间虚拟地址转换为第二进程内核空间虚拟地址,可以包括:第二进程调用第二函数,将第二进程用户空间虚拟地址转换为第二进程内核空间虚拟地址。其中,第二函数可以为:72.kva2=va2-pool2_offset physvirt_offset73.其中,kva2表示第二进程内核空间虚拟地址,va2表示第二进程用户空间虚拟地址,pool2_offset表示第三偏移量,physvirt_offset表示第二偏移量。74.需说明的是,上述不构成对本技术的限制,例如,可以在上述公式的基础上进行简单变形得到其他公式。75.进一步地,第二偏移量在内核初始化时被确定,第二偏移量可以通过执行以下函数查询获得:76.adrx0,physvirt_offset;ldrx1,=physvirt_offset;subx1,x1,x0;strx1,[x0],[0077]其中,x0为内核空间的物理地址,x1为内核空间的虚拟地址,将x1减去x0即可得到虚拟地址到物理地址的第二偏移量。记录第二偏移量。[0078]图3为本技术实施例提供的同步进程间通信方法的流程示意图二。如图3所示,该同步进程间通信方法包括:[0079]s301:第一进程初始化本进程的同步ipc池,记录第一偏移量pool1_offset。[0080]在第一进程使用同步ipc之前,第一进程执行同步ipc池初始化,同步ipc池初始化用于从进程虚拟地址空间中为第一进程分配同步ipc池,并在预留物理内存中为第一进程分配物理地址,将物理地址映射至同步ipc池,记录第一偏移量,预留物理内存是内核初始化时在内核中预留的连续的物理内存。[0081]图4举例说明了本技术实施例提供的同步进程间通信方法的初始化内存映射示意图,结合图4,内核初始化时会在内核中预留一块连续的物理内存(例如图4示出的p区),这段物理内存被固定偏移映射到内核空间(阴影部分)。第一进程执行同步ipc池初始化过程具体包括:在第一进程使用同步ipc之前执行同步ipc池初始化,从对应的用户空间虚拟地址中分配一块连续16kb的空间作为本进程的同步ipc池,并在物理地址p上分配一块连续的内存,大小16kb,映射到第一进程的同步ipc池。需要说明的是,每个进程都拥有一段独立的同步ipc池,大小可由应用程序根据实际使用场景进行配置,本实施例所举例的16kb大小仅为一种示例,并不对本技术技术方案造成限定。[0082]第一进程记录第一进程用户空间虚拟地址相对其物理地址的第一偏移量。可选的,第一进程可以通过执行以下地址初始化函数获取第一进程用户空间虚拟地址:[0083]va=vm_init(sync_ipc_pool_size,false,&phys),其中,sync_ipc_pool_size表示进程的同步ipc池的大小,phys表示进程的用户空间虚拟地址对应的物理地址。基于返回的va,根据以下公式计算得到偏移量:[0084]pool_offset=phys–va。[0085]s302:第二进程初始化本进程的同步ipc池,记录第三偏移量pool2_offset。[0086]与s301同理,在第二进程使用同步ipc之前,第二进程执行同步ipc池初始化。同步ipc池初始化用于从进程虚拟地址空间中为第二进程分配第二进程用户空间虚拟地址,并在预留物理内存中为第二进程分配物理地址,将物理地址映射至第二进程用户空间虚拟地址。其中,预留物理内存是内核初始化时在内核中预留的连续的物理内存。[0087]结合图4,第二进程的同步ipc池初始化与步骤s301相对应,在第二进程使用同步ipc之前执行该初始化。示例性的,第二进程的同步ipc池初始化从对应的用户空间虚拟地址中分配一块连续16kb的空间作为本进程的同步ipc池,并在物理地址p上分配一块连续的内存,大小16kb,映射到第二进程的同步ipc池。[0088]第二进程记录第二进程用户空间虚拟地址相对其物理地址的第三偏移量pool2_offset。可选的,第二进程也可以通过上述地址初始化函数获取第二进程用户空间虚拟地址和物理地址。[0089]s303:第一进程调用第一分配接口,得到第一进程用户空间虚拟地址va1,记录va1;将数据写入va1。[0090]s304:第二进程调用第一分配接口,得到第二进程用户空间虚拟地址va2,记录va2。[0091]在第一进程需进行同步ipc时,第一进程调用第一分配接口,得到第一进程用户空间虚拟地址,第一分配接口用于在同步ipc池中为进程分配对应连续物理地址的用户空间虚拟内存,同步ipc池是同步ipc池初始化时为第一进程分配的。具体的,第一分配接口优先从同步ipc池中分配空间。第一进程将需要发送给第二进程的数据写入第一进程用户空间虚拟地址va1。同理,在第二进程需进行同步ipc时,第二进程调用第一分配接口,得到第二进程用户空间虚拟地址,第一分配接口用于为进程分配对应连续物理地址的用户空间虚拟内存。[0092]可选的,第一分配接口在为第一进程分配第一进程用户空间虚拟地址时,具体用于:第一分配接口检查同步ipc池中的空闲内存是否满足第一进程的虚拟内存需求;若是,则从同步ipc池中为第一进程分配用户空间虚拟内存,得到第一进程用户空间虚拟地址。也即,第一分配接口优先从同步ipc池中分配空间。第一分配接口检查同步ipc池中的空闲内存情况,判断该空闲内存是否能够分配完整的第一进程用户空间,若是,则优先从同步ipc池中为第一进程分配用户空间虚拟内存,得到第一进程用户空间虚拟地址。[0093]可选的,第一分配接口还用于:在同步ipc池中的空闲内存不满足第一进程的虚拟内存需求时,第一分配接口通过调用内存分配函数为第一进程分配用户空间虚拟内存,得到第三用户空间虚拟内存,第三用户空间虚拟内存对应物理地址非连续;当第一进程需要向第二进程发送数据时,第一进程调用同步ipc发送接口向第二进程发送存放数据的第三用户空间虚拟地址。也即,当第一分配接口检查到同步ipc池中的空闲内存不足以分配完整的第一进程用户空间时,会调用内存分配函数,例如malloc()函数,向同步ipc池之外的普通内存区域分配空间作为补充。[0094]图5举例说明了本技术实施例提供的同步进程间通信方法的内存分配示意图,如图5所示,第一分配接口在为进程分配虚拟地址时,优先调用池分配接口从同步ipc池中分配空间,例如,从同步ipc池中分配完整的16kb空间,这16kb的虚拟内存所对应的物理地址连续。当第一分配接口检查到同步ipc池中的空闲内存无法分配出完整的16kb空间时,调用普通分配接口从同步ipc池之外的普通内存区域分配空间作为补充,例如调用malloc函数分配得到第三用户空间虚拟内存,第三用户空间对应的物理地址可能不连续。[0095]s305:第一进程调用同步ipc发送接口send()。用于向第二进程发送第一进程数据。[0096]此时,第一进程数据并未被真实地发送出去,而是处于发送状态中。之后,第一进程由运行(running)状态进入等待(pending)状态,等待接收第二进程释放的接收指示recvsemaphore。[0097]s306:第二进程调用同步ipc接收接口receive()。[0098]第一进程和第二进程从用户态进入内核态。[0099]s307:第二进程向第一进程发送接收指示recvsemaphore。[0100]之后,第二进程由运行(running)状态进入等待(pending)状态,等待接收由第一进程释放的发送指示sendsemaphore。[0101]s308:第一进程调用第一函数,将第一进程用户空间虚拟地址va1转换为第一进程内核空间虚拟地址kva1。[0102]s309:第一进程向第二进程发送发送指示sendsemaphore。[0103]之后,第一进程由运行(running)状态进入等待(pending)状态,等待接收由第二进程释放的完成指示replysemaphore。[0104]s310:第二进程调用第二函数,将第二进程用户空间虚拟地址va2转换为第二进程内核空间虚拟地址kva2。[0105]s311:第二进程调用复制函数memcpy(kva2,kva1,size)完成数据拷贝。[0106]s312:第二进程调用reply()接口,向第一进程发送完成指示replysemaphore。[0107]之后,第二进程结束本次进程,第一进程接收完成指示replysemaphore,结束本次进程,第一进程、第二进程从内核态重新进入用户态,等待下一次任务。[0108]其中,s305-s312与步骤s201-s203相对应,基于进程的用户空间虚拟地址相对物理地址的偏移量、内核空间虚拟地址相对物理地址的偏移量,将进程的用户空间虚拟地址分别转换为内核空间虚拟地址,进而实现数据在内核空间之间的拷贝,具体的相关说明如前描述,此处不再赘述。[0109]本技术实施例中,在确保同步进程存储数据虚拟地址对应的物理地址连续的前提下,基于进程的用户空间虚拟地址相对物理地址的偏移量、内核空间虚拟地址相对物理地址的偏移量,将进程的用户空间虚拟地址分别转换为内核空间虚拟地址,进而实现数据在内核空间之间的拷贝。由于虚拟地址对应物理地址连续,将进程的用户空间虚拟地址分别转换为内核空间虚拟地址的操作仅通过简单的计算即可实现,无需操作页表或多次拷贝,节省了同步ipc数据传输的时间开销,提升了同步ipc的数据传输性能。[0110]优选的,初始化同步ipc池时,为同步ipc池分配足够的内存空间,使各进程能够从同步ipc池中分配得到完整的虚拟内存。本实施例能够进一步降低同步ipc数据传输的时间开销,这是因为,使用malloc分配的普通内存进行地址映射时会存在较大的性能开销,对于同步ipc性能敏感的进程,尽量调整同步ipc池的大小,使同步ipc池的大小能满足进程使用同步ipc的绝大部分场景,尽可能获得同步ipc性能优化。[0111]下述为本技术装置实施例,可以用于执行本技术方法实施例。对于本技术装置实施例中未披露的细节,请参照本技术方法实施例。[0112]图6为本技术实施例提供的同步进程间通信装置的结构示意图。如图6所示,该同步进程间通信装置包括:[0113]发送模块601,用于通过第一进程调用同步ipc发送接口向第二进程发送第一进程数据,第一进程数据存放在第一进程用户空间虚拟地址中;[0114]处理模块602,用于在第一进程接收到来自第二进程的接收指示时,通过第一进程基于第一偏移量和第二偏移量,将第一进程用户空间虚拟地址转换为第一进程内核空间虚拟地址;以及,在第二进程接收到来自第一进程的发送指示时,通过第二进程基于第三偏移量和第二偏移量,将第二进程用户空间虚拟地址转换为第二进程内核空间虚拟地址,并通过第二进程根据第一进程内核空间虚拟地址和第二进程内核空间虚拟地址完成第一进程数据的拷贝;[0115]其中,第一进程用户空间虚拟地址和第二进程用户空间虚拟地址对应的物理地址连续,第一偏移量为第一进程用户空间虚拟地址相对物理地址的偏移量,第二偏移量为内核空间虚拟地址相对物理地址的固定偏移量,第三偏移量为第二进程用户空间虚拟地址相对物理地址的偏移量。[0116]一种可能的实施方式中,处理模块602可以具体用于:调用第一函数,将第一进程用户空间虚拟地址转换为第一进程内核空间虚拟地址;第一函数为:kva1=va1-pool1_offset physvirt_offset,其中,kva1表示第一进程内核空间虚拟地址,va1表示第一进程用户空间虚拟地址,pool1_offset表示第一偏移量,physvirt_offset表示第二偏移量。[0117]一种可能的实施方式中,处理模块602还可以具体用于:调用第二函数,将第二进程用户空间虚拟地址转换为第二进程内核空间虚拟地址;第二函数为:kva2=va2-pool2_offset physvirt_offset,其中,kva2表示第二进程内核空间虚拟地址,va2表示第二进程用户空间虚拟地址,pool2_offset表示第三偏移量,physvirt_offset表示第二偏移量。[0118]一种可能的实施方式中,处理模块602还可以具体用于:根据第一进程内核空间虚拟地址、第二进程内核空间虚拟地址和第一进程数据的大小,通过内存复制函数完成第一进程数据的拷贝。[0119]一种可能的实施方式中,发送模块601可以具体用于:调用第一分配接口,得到第一进程用户空间虚拟地址,第一分配接口用于为进程分配对应连续物理地址的用户空间虚拟内存。[0120]一种可能的实施方式中,发送模块601还可以具体用于:调用第一分配接口检查同步ipc池中的空闲内存是否满足第一进程的虚拟内存需求;若是,则从同步ipc池中为第一进程分配用户空间虚拟内存,得到第一进程用户空间虚拟地址。[0121]一种可能的实施方式中,发送模块601还可以具体用于:在同步ipc池中的空闲内存不满足第一进程的虚拟内存需求时,第一分配接口通过调用内存分配函数为第一进程分配用户空间虚拟内存,得到第三用户空间虚拟内存,第三用户空间虚拟内存对应物理地址非连续;当第一进程需要向第二进程发送第一进程数据时,第一进程调用同步ipc发送接口向第二进程发送存放第一进程数据的第三用户空间虚拟地址。[0122]图7为本技术实施例提供的电子设备的结构示意图。参照图7,电子设备700包括:处理器701、存储器702和系统总线703。[0123]其中,存储器702通过系统总线703与处理器701连接并完成相互间的通信,存储器702用于存储程序指令和数据,处理器701用于调用存储器中的程序指令以执行如上述方法实施例的同步进程间通信方法的方案。[0124]具体地,处理器701可以包括一个或多个处理单元,例如:处理器701可以是中央处理单元(centralprocessingunit,简称cpu),也可以是数字信号处理器(digitalsignalprocessor,简称dsp)、专用集成电路(applicationspecificintegratedcircuit,简称asic)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合申请所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。[0125]存储器702可以用于存储程序指令和数据。存储器702可以包括存储程序区和存储数据区。其中,存储程序区可存储操作系统,至少一个功能所需的应用程序(比如声音播放功能等)等。存储数据区可存储电子设备700使用过程中所创建的数据(比如第一进程数据等)等。此外,存储器702可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件,闪存器件,通用闪存存储器(universalflashstorage,简称ufs)等。处理器701通过运行存储在存储器702的程序指令,执行电子设备700的各种功能应用以及数据处理。[0126]系统总线703可以是外设部件互连标准(peripheralcomponentinterconnect,简称pci)总线或扩展工业标准结构(extendedindustrystandardarchitecture,简称eisa)总线等。该系统总线703可以分为地址总线、数据总线、控制总线等。为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。[0127]需说明的是,对于存储器702及处理器701的个数,本技术实施例不对其进行限制,其均可以为一个或多个,图7以一个为例进行图示;存储器702及处理器701之间,可以通过多种方式进行有线连接,例如通过总线连接。实际应用中,该电子设备700可以是各种形式的计算机或移动终端。其中,计算机例如为膝上型计算机、台式计算机、工作台、服务器、刀片式服务器、大型计算机等;移动终端例如为个人数字处理、蜂窝电话、智能电话、可穿戴设备以及其它类似的计算装置。[0128]本实施例的电子设备,可以用于执行上述方法实施例中的技术方案,其实现原理和技术效果类似,此处不再赘述。[0129]本技术实施例还提供一种可读存储介质,可读存储介质上存储有计算机程序,当计算机程序被执行时,实现如上同步进程间通信方法的方案,例如可以通过计算机软件实现同步进程间通信方法,相应的软件可以存储在可读取存储介质中,例如存储在计算机的硬盘、光盘或软盘中。[0130]本技术实施例还提供一种计算机程序产品,计算机程序产品包含计算机程序,当计算机程序被执行时,实现如上同步进程间通信方法的方案。[0131]本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:rom、ram等各种可以存储程序代码的介质。[0132]最后应说明的是:以上各实施例仅用以说明本技术的技术方案,而非对其限制;尽管参照前述各实施例对本技术进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本技术各实施例技术方案的范围。当前第1页12当前第1页12
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献