发明内容
本发明实施例提供了一种进程间共享数据的方法、装置及终端,以一定程度上改善传统技术中,通过共享内存实现不同进程之间的数据共享时,内存资源的使用效率低的问题。
为了解决上述技术问题,本发明实施例公开了如下技术方案:
根据本公开实施例的第一方面,提供一种进程间共享数据的方法,包括:
在第一进程和第二进程初始化的过程中,将操作系统创建的虚拟i/o设备分别映射到所述第一进程的虚拟地址空间和所述第二进程的虚拟地址空间中,其中,所述第一进程和第二进程均运行于所述操作系统中,设定所述虚拟i/o设备在所述第一进程中占用的虚拟地址空间为第一目标地址空间,所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间为第二目标地址空间,所述第一目标地址空间和所述第二目标地址空间相同;
将所述操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间中,建立所述内存块与所述第一目标地址空间中的第一地址段的映射关系,并将所述内存块的信息以及所述映射关系存储至操作系统预先创建的页表管理模块中,其中,所述内存块是所述操作系统根据所述第一进程触发的内存分配请求分配的,所述内存块用于存储所述第一进程需要共享的数据;
检测所述操作系统是否产生访问异常,其中,所述第二进程访问所述第一地址段中的虚拟地址时,触发所述操作系统产生访问异常;
基于所述操作系统产生访问异常的检测结果,指示所述虚拟i/o设备执行异常处理例程,所述异常处理例程包括:获取触发所述操作系统产生访问异常时,所述第二进程访问的所述第一地址段的虚拟地址,并根据所述第一地址段的虚拟地址和所述页表管理模块中存储的所述内存块的信息以及所述映射关系,获取所述内存块的信息,根据所述内存块的信息,将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据。
结合第一方面,在第一方面的第一种可能的实现方式中,在所述第二进程获取所述内存块中存储的数据后,还包括:
将所述内存块从所述第一目标地址空间中去映射;
将虚拟i/o设备映射至所述第一地址段指示的虚拟地址空间中;
或者,
将所述内存块从所述第二进程的虚拟地址空间中去映射;
确定将所述内存块映射至所述第二进程后,所述第二进程的虚拟地址空间中的第二地址段与所述内存块存在映射关系,将虚拟i/o设备映射至所述第二地址段指示的虚拟地址空间中。
结合第一方面,在第一方面的第二种可能的实现方式中,所述指示所述虚拟i/o设备执行异常处理例程之前,还包括:
判断所述第二进程是否具备所述内存块的访问权限;
基于所述第二进程具备所述内存块的访问权限的判断结果,再执行指示所述虚拟i/o设备执行异常处理例程的操作。
根据本公开实施例的第二方面,提供一种进程间共享数据的方法,应用于由操作系统创建的虚拟i/o设备,所述虚拟i/o设备被分别映射至所述操作系统中第一进程的虚拟地址空间和第二进程的虚拟地址空间中,所述虚拟i/o设备在所述第一进程中占用的虚拟地址空间为第一目标地址空间,所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间为第二目标地址空间,并且所述第一目标空间地址和第二目标空间地址相同,所述进程间共享数据的方法包括:
接收执行异常处理例程的指示,其中,所述指示是将操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间中后,若所述第二进程访问第一地址段中的虚拟地址时,触发操作系统指示虚拟i/o设备向所述虚拟i/o设备发送的;所述内存块的信息,以及所述内存块与所述第一目标地址空间中的第一地址段之间的映射关系被存储至操作系统预先创建的页表管理模块中,所述内存块是所述操作系统根据所述第一进程触发的内存分配请求分配的,所述内存块用于存储所述第一进程需要共享的数据;
获取触发所述操作系统产生访问异常时,所述第二进程访问的所述第一地址段的虚拟地址,并根据所述第一地址段的虚拟地址和所述页表管理模块中存储的所述内存块的信息以及所述映射关系,获取所述内存块的信息;
根据所述内存块的信息,将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据。
根据本公开实施例的第三方面,提供一种进程间共享数据的装置,包括:
虚拟i/o设备映射模块,用于在第一进程和第二进程初始化的过程中,将操作系统创建的虚拟i/o设备分别映射到所述第一进程的虚拟地址空间和所述第二进程的虚拟地址空间中,其中,所述第一进程和第二进程均运行于所述操作系统中,设定所述虚拟i/o设备在所述第一进程中占用的虚拟地址空间为第一目标地址空间,所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间为第二目标地址空间,所述第一目标地址空间和所述第二目标地址空间相同;
内存块映射模块,用于将所述操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间中,建立所述内存块与所述第一目标地址空间中的第一地址段的映射关系,并将所述内存块的信息以及所述映射关系存储至操作系统预先创建的页表管理模块中,其中,所述内存块是所述操作系统根据所述第一进程触发的内存分配请求分配的,所述内存块用于存储所述第一进程需要共享的数据;
访问异常检测模块,用于检测所述操作系统是否产生访问异常,其中,所述第二进程访问所述第一地址段中的虚拟地址时,触发所述操作系统产生访问异常;
指示模块,用于基于所述操作系统产生访问异常的检测结果,指示所述虚拟i/o设备执行异常处理例程,所述异常处理例程包括:获取触发所述操作系统产生访问异常时,所述第二进程访问的所述第一地址段的虚拟地址,并根据所述第一地址段的虚拟地址和所述页表管理模块中存储的所述内存块的信息以及所述映射关系,获取所述内存块的信息,根据所述内存块的信息,将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据。
结合第三方面,在第三方面的第一种可能的实现方式中,所述进程间共享数据的装置还包括:
第一去映射模块,用于将所述内存块从所述第一目标地址空间中去映射;
第一映射模块,用于将虚拟i/o设备映射至所述第一地址段指示的虚拟地址空间中;
或者,
第二去映射模块,用于将所述内存块从所述第二进程的虚拟地址空间中去映射;
第二映射模块,用于确定将所述内存块映射至所述第二进程后,所述第二进程的虚拟地址空间中的第二地址段与所述内存块存在映射关系,将虚拟i/o设备映射至所述第二地址段指示的虚拟地址空间中。
结合第三方面,在第三方面的第二种可能的实现方式中,所述进程间共享数据的装置还包括:
判断模块,用于指示所述虚拟i/o设备执行异常处理例程之前,判断所述第二进程是否具备所述内存块的访问权限;
所述指示模块还用于,基于所述第二进程具备所述内存块的访问权限的判断结果,再执行指示所述虚拟i/o设备执行异常处理例程的操作。
根据本公开实施例的第四方面,提供一种进程间共享数据的装置,其特征在于,应用于由操作系统创建的虚拟i/o设备,所述虚拟i/o设备被分别映射至所述操作系统中第一进程的虚拟地址空间和第二进程的虚拟地址空间中,所述虚拟i/o设备在所述第一进程中占用的虚拟地址空间为第一目标地址空间,所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间为第二目标地址空间,并且所述第一目标空间地址和第二目标空间地址相同,所述进程间共享数据的装置包括:
指示接收模块,用于接收执行异常处理例程的指示,其中,所述指示是将操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间中后,若所述第二进程访问第一地址段中的虚拟地址时,触发操作系统指示虚拟i/o设备向所述虚拟i/o设备发送的;所述内存块的信息,以及所述内存块与所述第一目标地址空间中的第一地址段之间的映射关系被存储至操作系统预先创建的页表管理模块中,所述内存块是所述操作系统根据所述第一进程触发的内存分配请求分配的,所述内存块用于存储所述第一进程需要共享的数据;
内存块信息获取模块,用于获取触发所述操作系统产生访问异常时,所述第二进程访问的所述第一地址段的虚拟地址,并根据所述第一地址段的虚拟地址和所述页表管理模块中存储的所述内存块的信息以及所述映射关系,获取所述内存块的信息;
第二进程映射模块,用于根据所述内存块的信息,将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据。
根据本公开实施例的第五方面,提供一种终端,包括:处理器、存储器和总线,其中,
所述处理器通过总线,与所述存储器相连接;
所述存储器,用于存储进程间共享数据的方法的程序代码;
所述处理器,用于获取所述存储器中存储的程序代码,并根据所述程序代码执行以下操作:
在第一进程和第二进程初始化的过程中,将操作系统创建的虚拟i/o设备分别映射到所述第一进程的虚拟地址空间和所述第二进程的虚拟地址空间中,其中,所述第一进程和第二进程均运行于所述操作系统中,设定所述虚拟i/o设备在所述第一进程中占用的虚拟地址空间为第一目标地址空间,所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间为第二目标地址空间,所述第一目标地址空间和所述第二目标地址空间相同;
将所述操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间中,建立所述内存块与所述第一目标地址空间中的第一地址段的映射关系,并将所述内存块的信息以及所述映射关系存储至操作系统预先创建的页表管理模块中,其中,所述内存块是所述操作系统根据所述第一进程触发的内存分配请求分配的,所述内存块用于存储所述第一进程需要共享的数据;
检测所述操作系统是否产生访问异常,其中,所述第二进程访问所述第一地址段中的虚拟地址时,触发所述操作系统产生访问异常;
基于所述操作系统产生访问异常的检测结果,指示所述虚拟i/o设备执行异常处理例程,所述异常处理例程包括:获取触发所述操作系统产生访问异常时,所述第二进程访问的所述第一地址段的虚拟地址,并根据所述第一地址段的虚拟地址和所述页表管理模块中存储的所述内存块的信息以及所述映射关系,获取所述内存块的信息,根据所述内存块的信息,将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据。
根据本公开实施例的第六方面,提供一种终端,包括:处理器、存储器和总线,其中,
所述处理器通过总线,与所述存储器相连接;
所述存储器,用于存储进程间共享数据的方法的程序代码;
所述处理器,用于获取所述存储器中存储的程序代码,并根据所述程序代码执行以下操作:
生成由操作系统创建的虚拟i/o设备,所述虚拟i/o设备被分别映射至所述操作系统中第一进程的虚拟地址空间和第二进程的虚拟地址空间中,所述虚拟i/o设备在所述第一进程中占用的虚拟地址空间为第一目标地址空间,所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间为第二目标地址空间,并且所述第一目标空间地址和第二目标空间地址相同,
所述虚拟i/o设备接收执行异常处理例程的指示,其中,所述指示是将操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间中后,若所述第二进程访问第一地址段中的虚拟地址时,触发操作系统指示虚拟i/o设备向所述虚拟i/o设备发送的;所述内存块的信息,以及所述内存块与所述第一目标地址空间中的第一地址段之间的映射关系被存储至操作系统预先创建的页表管理模块中,所述内存块是所述操作系统根据所述第一进程触发的内存分配请求分配的,所述内存块用于存储所述第一进程需要共享的数据;
所述虚拟i/o设备获取触发所述操作系统产生访问异常时,所述第二进程访问的所述第一地址段的虚拟地址,并根据所述第一地址段的虚拟地址和所述页表管理模块中存储的所述内存块的信息以及所述映射关系,获取所述内存块的信息;
所述虚拟i/o设备根据所述内存块的信息,将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据。
本申请公开一种进程间共享数据的方法、装置及终端,本申请中,预先由操作系统创建虚拟i/o设备,并且将虚拟i/o设备分别映射至第一进程的虚拟地址空间和第二进程的虚拟地址空间中,并且所述虚拟i/o设备占用的第一目标地址空间和第二目标地址空间相同。当第一进程需要共享数据时,所述第一进程向所述操作系统传输内存分配请求,所述操作系统根据所述内存分配请求分配内存块,并将所述内存块映射到所述第一目标地址空间中,建立所述内存块与所述第一目标地址空间中的第一地址段的映射关系,将所述内存块的信息以及所述映射关系存储至操作系统预先创建的页表管理模块中。若第二进程需要获取所述内存块中存储的数据,所述第二进程会访问所述第一地址段中的虚拟地址,触发所述操作系统产生访问异常。若所述操作系统产生访问异常,会指示所述虚拟i/o设备执行异常处理例程,从而将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据,该内存块即成为共享内存。
本申请公开方案,不需要预先分配共享内存,而是在需要共享数据时,才由第一进程触发操作系统分配内存块,实现动态分配共享内存,该分配共享内存的方法用时短,便于根据共享数据的需求,实时迅速的调整共享内存的大小,提高内存的利用效率。
具体实施方式
本申请实施例提供一种进程间共享数据的方法、装置及终端,以一定程度上改善传统技术中,通过共享内存实现不同进程之间的数据共享时,内存资源的使用效率低的问题。
为了使本领域的技术人员更好地理解本发明实施例中的技术方案,并使本发明实施例的上述目的、特征和优点能够更加明显易懂,下面结合附图对本发明实施例中技术方案作进一步详细的说明。
本申请公开一种进程间共享数据的方法,应用该方法的操作系统中的CPU读取多个应用程序的程序代码,生成多个进程,其中,所述程序代码存储在存储器中,并且,至少有两个进程之间有共享数据的需求。本申请中,为简明起见,仅以两个进程(即第一进程和第二进程)为例进行说明。
操作系统除了能够生成多个进程,还创建了虚拟i/o设备和页表管理模块。其中,所述虚拟i/o设备为一个虚拟的设备驱动模块,所述页表管理模块用于存储系统分配的各个内存块的信息等。
参见图1所示的工作流程示意图,本申请公开的进程间共享数据的方法包括:
步骤S11、在第一进程和第二进程初始化的过程中,将操作系统创建的虚拟i/o设备分别映射到所述第一进程的虚拟地址空间和所述第二进程的虚拟地址空间中,其中,所述第一进程和第二进程均运行于所述操作系统中,设定所述虚拟i/o设备在所述第一进程中占用的虚拟地址空间为第一目标地址空间,所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间为第二目标地址空间,所述第一目标地址空间和所述第二目标地址空间相同。
虚拟i/o设备为一个虚拟的设备驱动模块,将虚拟i/o设备映射到进程的虚拟地址空间,指的是将虚拟i/o设备与进程的虚拟地址空间中的一个地址段关联起来,建立所述虚拟i/o设备与该地址段的映射关系,所述映射关系通常存储至页表管理模块中。其中,所述进程的虚拟地址空间中,与所述虚拟i/o设备存在映射关系的地址段,指的是所述虚拟i/o设备占用的虚拟地址空间。
参见图2,图2为将虚拟i/o设备映射至所述第一进程的虚拟地址空间和所述第二进程的虚拟地址空间后,第一进程的虚拟地址空间和第二进程的虚拟地址空间的示意图。在将所述虚拟i/o设备映射到第一进程的虚拟地址空间和第二进程的虚拟地址空间中时,通常会将所述虚拟i/o设备所占用的虚拟地址空间,设置为所述第一进程和第二进程最大可能使用的共享内存的虚拟地址空间。例如,预先设定所述第一进程最大可能使用1Gigabyte的共享内存,则所述第一进程会将虚拟i/o设备映射到1Gigabyte的虚拟地址空间中。
另外,在本申请中,第一目标地址空间和第二目标地址空间相同,指的是所述虚拟i/o设备在第一进程中占用的虚拟地址空间,和所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间相同。例如,虚拟i/o设备与第一进程的虚拟地址空间中(0x00100000,0x00B00000)这一地址段存在映射关系,则所述虚拟i/o设备在第二进程的虚拟地址空间中占用的地址段也为(0x00100000,0x00B00000),也就是说,所述虚拟i/o设备与第二进程的虚拟地址空间中(0x00100000,0x00B00000)这一地址段也存在映射关系。
步骤S12、将所述操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间中,建立所述内存块与所述第一目标地址空间中的第一地址段的映射关系,并将所述内存块的信息以及所述映射关系存储至操作系统预先创建的页表管理模块中,其中,所述内存块是所述操作系统根据所述第一进程触发的内存分配请求分配的,所述内存块用于存储所述第一进程需要共享的数据。
当需要共享数据时,第一进程会触发操作系统,操作系统根据所述第一进程的触发,为所述第一进程分配内存块。在将所述内存块映射到所述第一目标地址空间之后,第一进程则可以向所述内存块中写入数据。
在将操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间后,所述第一进程的虚拟地址空间的示意图如图3所示,该图中,假设操作系统为所述第一进程分配的内存块为第二个内存块,并且,将所述第二个内存块映射到所述第一目标地址空间中。
另外,需要将所述内存块的信息存储至操作系统预先创建的页表管理模块中。其中,所述内存块的信息包括:所述内存块的地址和大小,所述内存块的地址可以为所述内存块的起始地址,或者,为所述内存块的开始地址或结束地址,并且,所述内存块的地址包括虚拟地址和物理地址两种类型。
步骤S13、检测所述操作系统是否产生访问异常,其中,所述第二进程访问所述第一地址段中的虚拟地址时,触发所述操作系统产生访问异常。
虚拟i/o设备为一个虚拟的设备驱动模块,若将虚拟i/o设备映射到进程的虚拟地址空间中,并不会占用实际的内存。若虚拟i/o设备映射的某一进程的虚拟地址空间没有对应实际的内存页面,该进程在访问所述虚拟i/o设备映射的所述虚拟地址空间时,操作系统会产生访问异常。
在步骤S12中,将所述内存块映射至第一目标地址空间中,并且,所述第一目标地址空间中的第一地址段与所述内存块存在映射关系。所述内存块中存储有所述第一进程写入的数据之后,若第二进程需要共享该数据,则所述第二进程需要访问所述第一地址段中的虚拟地址。
其中,所述第二进程可通过多种方式获取所述第一地址段这一虚拟地址。在其中一种方式中,所述第一进程将需要共享的数据存储至所述内存块后,产生通知信息,所述通知信息中包含与所述内存块存在映射关系的虚拟地址,即第一地址段,并且,所述第一进程直接将所述通知信息传输给第二进程,或通过其他进程将所述通知信息转发给第二进程。所述第二进程接收到所述通知信息后,对所述通知信息进行解析,即可获取所述第一地址段。
在另外一种方式中,通过对操作系统的预先操作,为操作系统中分布的各个内存块设置相应次序,操作系统根据该次序依次为第一进程分配内存块。例如,在上一次共享数据时,已经为所述第一进程分配了第一内存块,那么本次在进程间共享数据时,操作系统在所述第一进程的触发下,会为所述第一进程分配第二内存块,这种情况下,第二进程能够根据该次序,确定本次操作分配的是第二内存块,进而根据预先存储的映射关系,确定与所述第二内存块具有映射关系的地址段,即第一地址段。
当然,所述第二进程还可以通过其他方式确定所述第一地址段,以访问所述第一地址段在第二进程中占用的虚拟地址空间,本申请对此不作限定。
第二进程访问所述第一地址段中的虚拟地址时,由于所述第二进程预先并未将与所述第一地址段具备映射关系的内存块与实际的物理页面建立映射,操作系统会产生访问异常。
步骤S14、基于所述操作系统产生访问异常的检测结果,指示所述虚拟i/o设备执行异常处理例程,所述异常处理例程包括:获取触发所述操作系统产生访问异常时,所述第二进程访问的所述第一地址段的虚拟地址,并根据所述第一地址段的虚拟地址和所述页表管理模块中存储的所述内存块的信息以及所述映射关系,获取所述内存块的信息,根据所述内存块的信息,将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据。
第二进程访问所述第一地址段中的虚拟地址时,操作系统会产生访问异常,并且产生访问异常的虚拟地址为所述第一地址段在所述第二进程的虚拟地址空间中占用的虚拟地址。由于在本申请中,第一目标地址空间和第二目标地址空间相同,并且,所述第一地址段在所述第一进程中占用的虚拟地址属于所述第一目标地址空间,则所述第一地址段在所述第二进程中占用的虚拟地址属于所述第二目标地址空间,而所述第二目标地址空间为所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间,因此,操作系统会调用虚拟i/o设备的异常处理接口,指示所述虚拟i/o设备执行异常处理例程。
在操作系统的指示下,所述虚拟i/o设备会执行异常处理例程。通过所述虚拟i/o设备执行的异常处理例程,能够将所述内存块映射至所述第二进程。在映射完成后,所述第二进程能够访问所述内存块,该内存块即成为共享内存,所述第二进程通过访问该共享内存,能够获取第一进程在所述内存块中存储的数据。
所述虚拟i/o设备执行异常处理例程,将内存块映射至第二进程的过程,可称为缺页中断,所述虚拟i/o设备执行的操作对所述第二进程的执行流程来说是透明的。在内存块映射至第二进程之后,所述第一进程的虚拟地址空间和第二进程的虚拟地址空间的示意图如图4所示。
上述步骤S11至步骤S14公开一种进程间共享数据的方法,该方法中,预先由操作系统创建虚拟i/o设备,并且将虚拟i/o设备分别映射至第一进程的虚拟地址空间和第二进程的虚拟地址空间中,其中所述虚拟i/o设备占用的第一目标地址空间和第二目标地址空间相同。当第一进程需要共享数据时,所述第一进程向所述操作系统传输内存分配请求,所述操作系统根据所述内存分配请求分配内存块,将所述内存块映射到所述第一目标地址空间中,建立所述内存块与所述第一目标地址空间中的第一地址段的映射关系,并将所述内存块的信息以及所述映射关系存储至操作系统预先创建的页表管理模块中。若第二进程需要获取所述内存块中存储的数据,所述第二进程会访问所述第一地址段中的虚拟地址,触发所述操作系统产生访问异常。若所述操作系统产生访问异常,会指示所述虚拟i/o设备执行异常处理例程,从而将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据,该内存块即成为共享内存。
本申请公开的进程间共享数据的方法,不需要预先分配共享内存,而是在需要共享数据时,才由第一进程触发操作系统分配内存块,实现动态分配共享内存,该分配共享内存的方法用时短,便于根据共享数据的需求,实时迅速的调整共享内存的大小,提高内存的利用效率。
进一步的,本申请公开的进程间共享数据的方法还包括:
在所述第二进程获取所述内存块中存储的数据后,将所述内存块从所述第一目标地址空间中去映射;
将虚拟i/o设备映射至所述第一地址段指示的虚拟地址空间中。
若第一进程不再需要访问所述内存块,可将所述内存块从所述第一目标地址空间中去映射。在去映射之前,所述第一目标地址空间中的第一地址段与所述内存块存在映射关系,而在去映射之后,所述第一地址段与所述内存块不再存在映射关系,并且,所述第一地址段也未与虚拟i/o设备建立映射,这种情况下,需要将所述虚拟i/o设备映射至所述第一地址段指示的虚拟地址空间中。
或者,在所述第二进程获取所述内存块中存储的数据后,将所述内存块从所述第二进程的虚拟地址空间中去映射;
确定将所述内存块映射至所述第二进程后,所述第二进程的虚拟地址空间中的第二地址段与所述内存块存在映射关系,将虚拟i/o设备映射至所述第二地址段指示的虚拟地址空间中。
若第二进程不再需要访问所述内存块,可将所述内存块从所述第二目标地址空间中去映射。在去映射之前,所述第二目标地址空间中的第二地址段与所述内存块存在映射关系,而在去映射之后,所述第二地址段与所述内存块不再存在映射关系,并且,所述第二地址段也未与虚拟i/o设备建立映射,这种情况下,需要将所述虚拟i/o设备映射至所述第二地址段指示的虚拟地址空间中。
在第一进程和第二进程不再需要访问内存块时,可将所述内存块从占用的虚拟地址空间中去映射,并将所述虚拟i/o设备映射至去映射前与所述内存块存在映射关系的地址段所指示的虚拟空间中。在将所述虚拟i/o设备映射至所述第一地址段指示的虚拟地址空间,并且,在将所述虚拟i/o设备映射至所述第二地址段指示的虚拟地址空间后,所述第一进程的虚拟地址空间和第二进程的虚拟地址空间如图5所示,从而便于下次在进程间共享数据时,由操作系统重新为第一进程分配内存块,并将重新分配的内存块映射至第一目标地址空间中。
另外,在去映射后,该内存块不再作为共享内存,该内存块被归还所述操作系统,所述操作系统可通过该内存块执行其他操作。
进一步的,为了提高操作系统的稳定性,操作系统可预先为各个进程分配相应的访问权限。这种情况下,在指示所述虚拟i/o设备执行异常处理例程之前,本申请公开的进程间共享数据的方法还包括:
判断所述第二进程是否具备所述内存块的访问权限;
基于所述第二进程具备所述内存块的访问权限的判断结果,再执行指示所述虚拟i/o设备执行异常处理例程的操作。
操作系统在分配内存块后,会存储所述内存块的相关信息,所述相关信息中包含有各个进程针对所述内存块的访问权限。其中,所述相关信息通常被存储至所述操作系统预先创建的页表管理模块中。在产生访问异常后,可通过查询所述相关信息,判断所述第二进程是否具备所述内存块的访问权限。
若通过判断结果,确定所述第二进程不具备所述内存块的访问权限,则不再指示所述虚拟i/o设备执行异常处理例程。只有在确定所述第二进程具备所述内存块的访问权限的情况下,才指示所述虚拟i/o设备执行异常处理例程的操作,从而提高了操作系统的稳定性。
相应的,本申请还公开了一种进程间共享数据的方法,该方法应用于由操作系统创建的虚拟i/o设备,所述虚拟i/o设备被分别映射至所述操作系统中第一进程的虚拟地址空间和第二进程的虚拟地址空间中,所述虚拟i/o设备在所述第一进程中占用的虚拟地址空间为第一目标地址空间,所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间为第二目标地址空间,并且所述第一目标空间地址和第二目标空间地址相同。其中,创建所述虚拟i/o设备的操作系统中的CPU通过读取多个应用程序的程序代码,生成多个进程,所述程序代码存储在存储器中,并且,至少有两个进程之间有共享数据的需求。本申请中,为简明起见,仅以两个进程(即第一进程和第二进程)为例进行说明。
所述操作系统除了创建虚拟i/o设备以外,还创建了页表管理模块。其中,所述虚拟i/o设备为一个虚拟的设备驱动模块,所述页表管理模块用于存储系统分配的各个内存块的信息。
参见图6所示的工作流程示意图,所述进程间共享数据的方法包括:
步骤S21、接收执行异常处理例程的指示,其中,所述指示是将操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间中后,若所述第二进程访问第一地址段中的虚拟地址时,触发操作系统指示虚拟i/o设备向所述虚拟i/o设备发送的;所述内存块的信息,以及所述内存块与所述第一目标地址空间中的第一地址段之间的映射关系被存储至操作系统预先创建的页表管理模块中,所述内存块是所述操作系统根据所述第一进程触发的内存分配请求分配的,所述内存块用于存储所述第一进程需要共享的数据。
步骤S22、获取触发所述操作系统产生访问异常时,所述第二进程访问的所述第一地址段的虚拟地址,并根据所述第一地址段的虚拟地址和所述页表管理模块中存储的所述内存块的信息以及所述映射关系,获取所述内存块的信息。
步骤S23、根据所述内存块的信息,将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据。
本申请公开的进程间共享数据的方法中,在第一进程和第二进程初始化的过程中,会将操作系统创建的虚拟i/o设备分别映射到所述第一进程的虚拟地址空间和所述第二进程的虚拟地址空间中,其中,所述第一进程和第二进程均运行于所述操作系统中。设定所述虚拟i/o设备在所述第一进程中占用的虚拟地址空间为第一目标地址空间,所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间为第二目标地址空间,所述第一目标地址空间和所述第二目标地址空间相同。当第一进程需要向第二进程共享数据时,第一进程会触发操作系统,操作系统根据所述第一进程的触发,为所述第一进程分配内存块。然后,将所述操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间中,建立所述内存块与所述第一目标地址空间中的第一地址段的映射关系,并将所述内存块的信息以及所述映射关系存储至操作系统预先创建的页表管理模块中,其中,所述内存块用于存储被所述第一进程写入的数据。第二进程在需要获取所述内存块中存储的数据时,会访问所述第一地址段中的虚拟地址,由于所述第二进程预先并未将与所述第一地址段具备映射关系的内存块与实际的物理页面建立映射,操作系统会产生访问异常。
所述操作系统在产生访问异常时,产生访问异常的虚拟地址为所述第一地址段在所述第二进程的虚拟地址空间中占用的虚拟地址。由于在本申请中,第一目标地址空间和第二目标地址空间相同,并且,所述第一地址段在所述第一进程中占用的虚拟地址属于所述第一目标地址空间,则所述第一地址段在所述第二进程中占用的虚拟地址属于所述第二目标地址空间,而所述第二目标地址空间为所述虚拟i/o设备再所述第二进程中占用的虚拟地址空间,因此,操作系统会调用虚拟i/o设备的异常处理接口,指示所述虚拟i/o设备执行异常处理例程。
在操作系统的指示下,所述虚拟i/o设备会执行异常处理例程。所述虚拟i/o设备执行的异常处理例程包括:所述虚拟i/o设备获取触发所述操作系统产生访问异常时,所述第二进程访问的所述第一地址段的虚拟地址,并根据所述第一地址段的虚拟地址和所述页表管理模块中存储的所述内存块的信息和所述映射关系,获取所述内存块的信息;然后,根据所述内存块的信息,将所述内存块映射至所述第二进程。
通过所述虚拟i/o设备执行的异常处理例程,能够将所述内存块映射至所述第二进程。在映射完成后,所述第二进程能够访问所述内存块,该内存块即成为共享内存,所述第二进程通过访问该共享内存,能够获取第一进程在所述内存块中存储的数据。
本申请公开的进程间共享数据的方法,不需要预先分配共享内存,而是在需要共享数据时,才由第一进程触发操作系统分配内存块,实现动态分配共享内存,该分配共享内存的方法用时短,便于根据共享数据的需求,实时迅速的调整共享内存的大小,提高内存的利用效率。
相应的,本申请还公开一种进程间共享数据的装置。参见图7所示的结构示意图,所述进程间共享数据的装置包括:虚拟i/o设备映射模块101、内存块映射模块102、访问异常检测模块103和指示模块104。
其中,所述虚拟i/o设备映射模块101,用于在第一进程和第二进程初始化的过程中,将操作系统创建的虚拟i/o设备分别映射到所述第一进程的虚拟地址空间和所述第二进程的虚拟地址空间中,其中,所述第一进程和第二进程均运行于所述操作系统中,设定所述虚拟i/o设备在所述第一进程中占用的虚拟地址空间为第一目标地址空间,所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间为第二目标地址空间,所述第一目标地址空间和所述第二目标地址空间相同;
所述内存块映射模块102,用于将所述操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间中,建立所述内存块与所述第一目标地址空间中的第一地址段的映射关系,并将所述内存块的信息以及所述映射关系存储至操作系统预先创建的页表管理模块中,其中,所述内存块是所述操作系统根据所述第一进程触发的内存分配请求分配的,所述内存块用于存储所述第一进程需要共享的数据;
所述访问异常检测模块103,用于检测所述操作系统是否产生访问异常,其中,所述第二进程访问所述第一地址段中的虚拟地址时,触发所述操作系统产生访问异常;
所述指示模块104,用于基于所述操作系统产生访问异常的检测结果,指示所述虚拟i/o设备执行异常处理例程,所述异常处理例程包括:获取触发所述操作系统产生访问异常时,所述第二进程访问的所述第一地址段的虚拟地址,并根据所述第一地址段的虚拟地址和所述页表管理模块中存储的所述内存块的信息以及所述映射关系,获取所述内存块的信息,根据所述内存块的信息,将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据。
进一步的,所述进程间共享数据的装置还包括:
第一去映射模块,用于将所述内存块从所述第一目标地址空间中去映射;
第一映射模块,用于将虚拟i/o设备映射至所述第一地址段指示的虚拟地址空间中;
或者,
第二去映射模块,用于将所述内存块从所述第二进程的虚拟地址空间中去映射;
第二映射模块,用于确定将所述内存块映射至所述第二进程后,所述第二进程的虚拟地址空间中的第二地址段与所述内存块存在映射关系,将虚拟i/o设备映射至所述第二地址段指示的虚拟地址空间中。
进一步的,所述进程间共享数据的装置还包括:
判断模块,用于指示所述虚拟i/o设备执行异常处理例程之前,判断所述第二进程是否具备所述内存块的访问权限;
所述指示模块还用于,基于所述第二进程具备所述内存块的访问权限的判断结果,再执行指示所述虚拟i/o设备执行异常处理例程的操作。
本申请公开的装置,不需要预先分配共享内存,而是在需要共享数据时,才由第一进程触发系统分配内存块,实现动态分配共享内存,该分配共享内存的方法用时短,便于根据共享数据的需求,实时迅速的调整共享内存的大小,提高内存的利用效率。
相应的,本申请还公开一种进程间共享数据的装置,应用于由操作系统创建的虚拟i/o设备,所述虚拟i/o设备被分别映射至所述操作系统中第一进程的虚拟地址空间和第二进程的虚拟地址空间中,所述虚拟i/o设备在所述第一进程中占用的虚拟地址空间为第一目标地址空间,所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间为第二目标地址空间,并且所述第一目标空间地址和第二目标空间地址相同,参见图8所示的结构示意图,所述进程间共享数据的装置包括:指示接收模块201、内存块信息获取模块202和第二进程映射模块203。
其中,所述指示接收模块201,用于接收执行异常处理例程的指示,其中,所述指示是将操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间中后,若所述第二进程访问第一地址段中的虚拟地址时,触发操作系统指示虚拟i/o设备向所述虚拟i/o设备发送的;所述内存块的信息,以及所述内存块与所述第一目标地址空间中的第一地址段之间的映射关系被存储至操作系统预先创建的页表管理模块中,所述内存块是所述操作系统根据所述第一进程触发的内存分配请求分配的,所述内存块用于存储所述第一进程需要共享的数据;其中,操作系统在将为所述第一进程分配的内存块映射到第一目标地址空间中时,会建立所述内存块与所述第一目标地址空间中的第一地址段的映射关系。
所述内存块信息获取模块202,用于获取触发所述操作系统产生访问异常时,所述第二进程访问的所述第一地址段的虚拟地址,并根据所述第一地址段的虚拟地址和所述页表管理模块中存储的所述内存块的信息以及所述映射关系,获取所述内存块的信息;
所述第二进程映射模块203,用于根据所述内存块的信息,将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据。
本申请公开的装置,不需要预先分配共享内存,而是在需要共享数据时,才由第一进程触发系统分配内存块,实现动态分配共享内存,该分配共享内存的方法用时短,便于根据共享数据的需求,实时迅速的调整共享内存的大小,提高内存的利用效率。
本申请还公开一种终端,参见图9所示的结构示意图,所述终端包括:处理器11、存储器12和总线13,其中,
所述处理器11通过总线13,与所述存储器12相连接;
所述存储器12,用于存储进程间共享数据的方法的程序代码;
所述处理器11,用于获取所述存储器12中存储的程序代码,并根据所述程序代码执行以下操作:
在第一进程和第二进程初始化的过程中,将操作系统创建的虚拟i/o设备分别映射到所述第一进程的虚拟地址空间和所述第二进程的虚拟地址空间中,其中,所述第一进程和第二进程均运行于所述操作系统中,设定所述虚拟i/o设备在所述第一进程中占用的虚拟地址空间为第一目标地址空间,所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间为第二目标地址空间,所述第一目标地址空间和所述第二目标地址空间相同;
将所述操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间中,建立所述内存块与所述第一目标地址空间中的第一地址段的映射关系,并将所述内存块的信息以及所述映射关系存储至操作系统预先创建的页表管理模块中,其中,所述内存块是所述操作系统根据所述第一进程触发的内存分配请求分配的,所述内存块用于存储所述第一进程需要共享的数据;
检测所述操作系统是否产生访问异常,其中,所述第二进程访问所述第一地址段中的虚拟地址时,触发所述操作系统产生访问异常;
基于所述操作系统产生访问异常的检测结果,指示所述虚拟i/o设备执行异常处理例程,所述异常处理例程包括:获取触发所述操作系统产生访问异常时,所述第二进程访问的所述第一地址段的虚拟地址,并根据所述第一地址段的虚拟地址和所述页表管理模块中存储的所述内存块的信息以及所述映射关系,获取所述内存块的信息,根据所述内存块的信息,将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据。
本申请公开的上述终端中,存在的操作系统中的CPU读取多个应用程序的程序代码,生成多个进程,其中,所述程序代码存储在存储器中,并且,至少有两个进程之间有共享数据的需求。本申请中,为简明起见,仅以两个进程(即第一进程和第二进程)为例进行说明。
操作系统除了能够生成多个进程,还创建了虚拟i/o设备和页表管理模块。其中,所述虚拟i/o设备为一个虚拟的设备驱动模块,所述页表管理模块用于存储系统分配的各个内存块的信息。
本申请公开的终端在进程间共享数据时,不需要预先分配共享内存,而是在需要共享数据时,才由第一进程触发操作系统分配内存块,实现动态分配共享内存,该分配共享内存的方法用时短,便于根据共享数据的需求,实时迅速的调整共享内存的大小,提高内存的利用效率。
相应的,本申请还公开一种终端,参见图10所示的结构示意图,所述终端包括:处理器21、存储器22和总线23,其中,
所述处理器21通过总线23,与所述存储器22相连接;
所述存储器22,用于存储进程间共享数据的方法的程序代码;
所述处理器23,用于获取所述存储器22中存储的程序代码,并根据所述程序代码执行以下操作:
生成由操作系统创建的虚拟i/o设备,所述虚拟i/o设备被分别映射至所述操作系统中第一进程的虚拟地址空间和第二进程的虚拟地址空间中,所述虚拟i/o设备在所述第一进程中占用的虚拟地址空间为第一目标地址空间,所述虚拟i/o设备在所述第二进程中占用的虚拟地址空间为第二目标地址空间,并且所述第一目标空间地址和第二目标空间地址相同,
所述虚拟i/o设备接收执行异常处理例程的指示,其中,所述指示是将操作系统为所述第一进程分配的内存块映射到所述第一目标地址空间中后,若所述第二进程访问第一地址段中的虚拟地址时,触发操作系统指示虚拟i/o设备向所述虚拟i/o设备发送的;所述内存块的信息,以及所述内存块与所述第一目标地址空间中的第一地址段之间的映射关系被存储至操作系统预先创建的页表管理模块中,所述内存块是所述操作系统根据所述第一进程触发的内存分配请求分配的,所述内存块用于存储所述第一进程需要共享的数据;
所述虚拟i/o设备获取触发所述操作系统产生访问异常时,所述第二进程访问的所述第一地址段的虚拟地址,并根据所述第一地址段的虚拟地址和所述页表管理模块中存储的所述内存块的信息以及所述映射关系,获取所述内存块的信息;
所述虚拟i/o设备根据所述内存块的信息,将所述内存块映射至所述第二进程,以便所述第二进程能够访问所述内存块,获取所述第一进程在所述内存块中存储的数据。
本申请公开的上述终端中,存在的操作系统中的CPU读取多个应用程序的程序代码,生成多个进程,其中,所述程序代码存储在存储器中,并且,至少有两个进程之间有共享数据的需求。本申请中,为简明起见,仅以两个进程(即第一进程和第二进程)为例进行说明。
操作系统除了能够生成多个进程,还创建了虚拟i/o设备和页表管理模块。其中,所述虚拟i/o设备为一个虚拟的设备驱动模块,所述页表管理模块用于存储系统分配的各个内存块的信息。
本申请公开的终端在进程间共享数据时,不需要预先分配共享内存,而是在需要共享数据时,才由第一进程触发操作系统分配内存块,实现动态分配共享内存,该分配共享内存的方法用时短,便于根据共享数据的需求,实时迅速的调整共享内存的大小,提高内存的利用效率。
本领域的技术人员可以清楚地了解到本发明实施例中的技术可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明实施例中的技术方案可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如只读存储器(英文:read-only memory,缩写:ROM)、随机存取存储器(英文:random access memory,缩写:RAM)、磁碟、光盘等,包括若干指令用以使得处理器执行本发明实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其它实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
应当理解的是,本发明并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本发明的范围仅由所附的权利要求来限制。