一种多进程共享数据的方法和装置的制造方法
【技术领域】
[0001]本发明涉及通信领域,尤其涉及一种多进程共享数据的方法和装置。
【背景技术】
[0002]在多核对称多处理机(Symmetrical Mult1-Processing,SMP)系统,尤其是需要有较高隔离度和可靠性的系统中,多进程是典型的软件模型,多进程之间地址空间隔离,进程拥有自己私有的数据区域,这样,进程相互之间互不干扰,而且异常后能有效隔离故障,并恢复系统正常运行。
[0003]在大容量并行处理的系统上,多进程实例是典型的并发设计模型,多进程实例是指多个进程运行完全相同的程序代码,并且将不同实例亲和到不同的中央处理器(CentralProcessing Unit,CPU)核上以充分发挥并发的性能优势。多进程实例可以实现在多实例之间完全隔离,互不干扰。但是,多进程实例往往不可避免需要共享数据,例如共享全局控制变量、共享内存池等。在共享数据时通常的实现方式有两种:
[0004]第一种方法:第一个进程实例(以下称为主进程)通过操作系统接口获取一段共享内存;主进程将共享内存映射到自己的地址空间;其余进程调用操作系统接口将共享内存分别映射到本进程的地址空间;各进程通过将数据拷贝到共享内存进行交互数据,参阅图1所示。
[0005]然而,这种方法如果需要进程间共享变量和缓冲区,第一个进程实例需要将数据拷贝到共享内存区域,其他进程实例需要从共享内存提取数据,由于此过程涉及数据拷贝,在大数据共享时效率很低。
[0006]例如,假设用户代码中有一个全局变量g_ControlCb表示全局控制结构,当运行多进程实例时,由于用户代码的复用性,每个进程中都存在一个全局变量g_ControlCb,每次当一个进程修改了全局变量8_(:011廿0103后,将这个全局变量整体拷贝到共享内存区域(假设地址为PShareDataAddr),然后采用某种机制通知其它进程这个全局数据已经发生修改,当其它进程检测到全局变量修改后,再从PShareDataAddr将全局数据拷贝回g_ControlCb,这样两边的进程仍然能直接使用g_ControlCb这个全局变量,但是修改、通知、同步机制较为复杂。
[0007]第二种方法:第一个进程实例(以下称为主进程)通过操作系统接口获取一段共享内存;主进程将共享内存映射到自己的地址空间;其余进程调用操作系统接口将共享内存分别映射到本进程的地址空间;各进程通过指针访问的方式来共享内存进行交互数据,参阅图2所示。
[0008]然而,通过指针方式来存取共享内存的方式需要对原始代码进行改造,将需要共享的全局变量全部替换为指针,代码兼容性较差。
[0009]例如,假设用户代码中有一个全局变量g_ControlCb表示全局控制结构,当运行多进程实例时,由于用户代码的复用性,每个进程中都存在一个全局变量g_ControlCb,修改所有的代码,放弃直接使用g_ControlCb,当需要访问共享控制数据g_ControlCb时,改为直接使用共享内存pShareDataAddr,这种修改对代码结构影响较大,并且需要人为维护全局变量在共享内存中的地址关系。
【发明内容】
[0010]本发明实施例提供了一种多进程共享数据的方法和装置,用以解决在数据共享的过程中,由于采用数据拷贝导致效率偏低的问题,以及采用指针方式时需要修改原始代码导致的灵活性差以及可维护性差的问题,
[0011]本发明实施例提供的具体技术方案如下:
[0012]一种多进程共享数据的方法,包括:
[0013]将各个进程中的共享数据存入自定义段中,并将所述自定义段加载到虚拟地址空间中;
[0014]获取所述自定义段的大小,并为所述共享数据在物理内存中分配一个与所述自定义段相等大小的共享物理内存,以及在所述自定义段与所述共享物理内存之间建立映射关系;
[0015]基于所述映射关系,在所述自定义段和所述共享物理内存之间,实现各个进程之间的共享数据的交互。
[0016]这样,通过将共享数据汇聚存放在自定义段中来实现对自定义段的直接共享,避免了采用数据拷贝实现数据共享时导致效率偏低的问题,也避免了采用指针方式实现数据共享时需要修改原始代码导致的灵活性差以及可维护性差的问题。
[0017]较佳的,获取所述自定义段的大小,包括:
[0018]编译第一文件,形成可执行连接格式ELF文件,通过所述ELF文件获取所述自定义段的初始大小;其中,所述第一文件为所述至少一个进程的源文件;
[0019]临时生成第二文件,在所述第二文件中调整所述自定义段的初始大小为页大小的整数倍,然后设置一个变量,并赋予所述变量的值为调整后的自定义段的初始大小,通过读取所述变量获取自定义段的大小。
[0020]较佳的,在所述自定义段与所述共享物理内存之间建立映射关系,包括:
[0021]针对所述自定义段的地址和所述物理共享内存的地址分别执行页对齐操作;
[0022]基于页对齐操作结果,确定所述自定义段与所述共享物理内存之间的地址映射。
[0023]较佳的,基于所述映射关系,在所述自定义段和所述共享物理内存之间,实现各个进程之间的共享数据的交互,包括:
[0024]当检测到所述至少一个进程访问所述自定义段时,基于所述映射关系,在所述共享物理内存中存取所述共享数据。
[0025]较佳的,进一步包括:
[0026]当检测到所述共享物理内存已被释放时,则解除所述自定义段与所述共享物理内存之间的映射关系。
[0027]一种多进程共享数据的装置,包括:
[0028]加载单元,用于将各个进程中的共享数据存入自定义段中,并将所述自定义段加载到虚拟地址空间中;
[0029]处理单元,用于获取所述自定义段的大小,并为所述共享数据在物理内存中分配一个与所述自定义段相等大小的共享物理内存,以及在所述自定义段与所述共享物理内存之间建立映射关系;
[0030]共享单元,用于基于所述映射关系,在所述自定义段和所述共享物理内存之间,实现各个进程之间的共享数据的交互。
[0031]这样,通过将共享数据汇聚存放在自定义段中来实现对自定义段的直接共享,避免了采用数据拷贝实现数据共享时导致效率偏低的问题,也避免了采用指针方式实现数据共享时需要修改原始代码导致的灵活性差以及可维护性差的问题。
[0032]较佳的,获取所述自定义段的大小时,所述处理单元用于:
[0033]编译第一文件,形成可执行连接格式ELF文件,通过所述ELF文件获取所述自定义段的初始大小;其中,所述第一文件为所述至少一个进程的源文件;
[0034]临时生成第二文件,在所述第二文件中调整所述自定义段的初始大小为页大小的整数倍,然后设置一个变量,并赋予所述变量的值为调整后的自定义段的初始大小,通过读取所述变量获取自定义段的大小。
[0035]较佳的,在所述自定义段与所述共享物理内存之间建立映射关系时,所述处理单元用于:
[0036]针对所述自定义段的地址和所述物理共享内存的地址分别执行页对齐操作;
[0037]基于页对齐操作结果,确定所述自定义段与所述共享物理内存之间的地址映射。
[0038]较佳的,基于所述映射关系,在所述自定义段和所述共享物理内存之间,实现各个进程之间的共享数据的交互时,所述共享单元用于:
[0039]当检测到所述至少一个进程访问所述自定义段时,基于所述映射关系,在所述共享物理内存中存取所述共享数据。
[0040]较佳的,所述共享单元进一步用于:
[0041]当检测到所述共享物理内存已被释放时,则解除所述自定义段与所述共享物理内存之间的映射关系。
【附图说明】
[0042]图1为现有技术下采用数据拷贝方式进行多进程数据共享的结构示意图;
[0043]图2为现有技术下采用数据拷贝方式进行多进程数据共享的结构示意图;
[0044]图3为本发明实施例中多进程数据共享的具体流程示意图;
[0045]图4为本发明实施例中多进程数据共享的自定义段的结构
示意图;
[0046]图5为本发明实施例中三进程数据共享的具体流程示意图;
[0047]图6为本发明实施例中多进程数据共享的装置的结构示意图。
【具体实施方式】
[0048]为了避免在数据共享的过程中,由于采用数据拷贝导致效率偏低的问题,以及采用指针方式时需要修改原始代码导致的灵活性差以及可维护性差的问题,本发明实施例中,通过在虚拟地址空间中设置的自定义段与共享物理内存之间建立的映射关系,基于该映射关系,在自定义段和共享物理内存之间,实现各个进程之间的共享数据的交互。
[0049]下面结合附图对本发明优选的实施方式进行详细说明。
[0050]参阅图3所示,本发明实施例中,多进程共享数据的具体流程如下:
[0051]步骤300:将各个进程中的共享数据存入自定义段中,并将该自定义段加载到虚拟地址空间中。
[0052]本发明实施例中,在执行步骤300时,将共享数据在编译阶段全部放置在用户自定义段中,参阅图4所示。
[0053]例如:共享数据为全局变量g_ControlCb,将该全局变量放置在自定义user_share_sect1n中,可以进行如下定义:
[0054]TYPE g_ControlCb—attribute—(sect1n ( “user_share_sect1n” ));
[0055]其中,TYPE为g_ControlCb的具体类型定义。
[0056]用户将所有需要共享的全局变量按照这种方式定义,编译器编译完成后将全局变量放入指定的自定义段中,然后将该自定义段加载到虚拟地址空间中,这里的虚拟地址空间一般是指用户空间。
[0057]步骤310:获取自定义段的大小,并为共享数据在物理内存中分配一个与自定义段相等大小的共享物理内存,以及在自定义段与共享物理内存之间建立映射关系。
[0058]本发明实施例中,在执行步骤110时,获取自定义段的步骤如下:首先,编译第一文件,形成可执行连接格式(Executable and linking Format, ELF)文件,通过ELF文件获取自定义段的初始大小;其中,第一文件为至少一个进程的源文件;
[0059]例如:获取ELF文件中user_share_sect1n的sect1n的大小,并记为user_share_sect1n_size。
[0060]然后,临时生成第二文件,在该第二文件中调整自定义段的初始大小为页大小的整数倍,然后设置一个变量,并赋予该变量的值为调整后的自定义段的初始大小,通过读取该变量获取自定义段的大小。
[0061]例如:第二文件中定义一个全局变量g_user_share_sect1n_size,将全局变量赋值为自定义sect1n的大小:g_ _user_share_sect1n_size = user_share_sect1n_size。从而获得自定义段的大小。
[0062]基于自定义段的大小,在分配共享物理内存时,可以如下定义:
[0063]shmid = shmget (shm_key,shm_size,shm_flag),其中,shm_size 是共享物理内存大小,也就是 g_user_share_sect1n_size 的大小。
[0064]进一步地,对自定义段的地址和物理共享内存的地址分别执行页对齐操作;基于页对齐操作结果,确定自定义段与共享物理内存之间的地址映射
[0065]例如:在系统框架代码中定义:
[0066]Int g_user_share_sect1n_first_var—attribute— ((sect1n (“user_share_sect1n”),aligned(PAGE_SIZE)));
[0067]为了保证这个全局变量出现在自定义段user_share_sect1n的第一个位置上,需要在makefile中让框架代码第一个被编译和链接。
[0068]因此,Shmat(shmid,shm_addr, shm_f lag)中的 shm_addr 就是 g_user_share_sect1n_first_var在共享物理内存中的地址,并且是页对其的。
[0069]步骤320:基于映射关系,在自定义段和共享物理内存之间,实现各个进程之间的共享数据的交互。
[0070]本发明实施例中,在执行步骤320时,当检测到至少一个进程访问自定义段时,基于映射关系,在共享物理内存中存取共享数据。
[0071]例如:A、B和C三个进程之间实现数据共享,假如共享数据为A进程中的部分数据,基于已经建立好的映射关系,B进程和C进程可以通过访问自定义段的地址读取到共享数据,此时如共享数据为B进程的共享数据,可以通过访问自定义段的地址写入共享物理内存中。
[0072]此外,当检测到共享物理内存已被释放时,则解除自定义段与共享物理内存之间的映射关系。
[0073]基于上述实施例,下面结合一个具体的应用场景对上述实施例作出进一步详细的说明。
[0074]假设一共有三个进程,分别为A、B和C,第一个启动的进程为A,随后分别启动进程B和C,参阅图5所示。
[0075]步骤500:将各个进程中的共享数据放入自定义段中,并将该自定义段加载到虚拟地址空间中。
[0076]具体的,应用程序开发阶段,通过编译手段将需要共享的变量或数据放置到自定义段 user_share_sect1n 中。
[0077]步骤501:A进程启动,获取当前进程自定义段首地址a_sect1n_addr和自定义段大小 g_user_share_sizeD
[0078]具体的,在获取自定义段的大小时,通过在编译的user—share—sect1n中,将user—share—sect1n调整到页大小的整数倍,然后通过变量g—user—share—size指示自定义段大小。
[0079]步骤502:A进程创建共享物理内存phy—share—menu
[0080]步骤503:A进程完成a—sect1n—addr和phy—share—mem之间的映射关系。
[0081]步骤504:B进程启动,获取当前进程自定义段首地址b—sect1n—addr和自定义段大小 g_user_share_sizeD
[0082]步骤505:B进程获取A进程创建的共享物理内存phy—share—mem。
[0083]步骤506:B进程完成b—sect1n—addr和phy—share—mem之间的映射关系。
[0084]步骤507:C进程启动,获取当前进程自定义段首地址c—sect1n—addr和自定义段大小 g_user_share_size0
[0085]步骤508:C进程获取A进程创建的共享物理内存phy_share_mem。
[0086]步骤509:C进程完成c_sect1n_addr和phy_share_mem之间的映射关系。
[0087]步骤510:A、B 和 C 进程可以分别通过访问 a_sect1n_addr、b_sect1n_addr、c_sect1n_addr中的共享变量或数据直接进行通信。
[0088]基于上述实施例,参阅图6所示,本发明实施例中,一种多进程共享数据的装置包括:加载单元60、处理单元61和共享单元62,其中,
[0089]加载单元60,用于将各个进程中的共享数据存入自定义段中,并将自定义段加载到虚拟地址空间中;
[0090]处理单元61,用于获取自定义段的大小,并为共享数据在物理内存中分配一个与自定义段相等大小的共享物理内存,以及在自定义段与共享物理内存之间建立映射关系;
[0091]共享单元62,用于基于映射关系,在自定义段和共享物理内存之间,实现各个进程之间的共享数据的交互。
[0092]较佳的,获取自定义段的大小时,处理单元61用于:
[0093]编译第一文件,形成可执行连接格式ELF文件,通过ELF文件获取自定义段的初始大小;其中,第一文件为至少一个进程的源文件;
[0094]临时生成第二文件,在
第二文件中调整自定义段的初始大小为页大小的整数倍,然后设置一个变量,并赋予该变量的值为调整后的自定义段的初始大小,通过读取该变量获取自定义段的大小。
[0095]较佳的,在自定义段与共享物理内存之间建立映射关系时,处理单元61用于:
[0096]对自定义段的地址和物理共享内存的地址分别执行页对齐操作;
[0097]基于页对齐操作结果,确定自定义段与共享物理内存之间的地址映射。
[0098]较佳的,基于映射关系,在自定义段和共享物理内存之间,实现各个进程之间的共享数据的交互时,共享单元62用于:
[0099]当检测到至少一个进程访问自定义段时,基于映射关系,在共享物理内存中存取共享数据。
[0100]较佳的,共享单元62进一步用于:
[0101]当检测到共享物理内存已被释放时,则解除自定义段与共享物理内存之间的映射关系O
[0102]综上所述,本发明实施例中,将各个进程中的共享数据存入自定义段中,并将该自定义段加载到虚拟地址空间中;获取自定义段的大小,并为共享数据在物理内存中分配一个与自定义段相等大小的共享物理内存,以及在自定义段与共享物理内存之间建立映射关系;基于映射关系,在自定义段和共享物理内存之间,实现各个进程之间的共享数据的交互。这样,通过将共享数据汇聚存放在自定义段中来实现对自定义段的直接共享,避免了采用数据拷贝实现数据共享时导致效率偏低的问题,也避免了采用指针方式实现数据共享时需要修改原始代码导致的灵活性差以及可维护性差的问题。
[0103]本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0104]本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0105]这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0106]这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0107]尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
[0108]显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明实施例的精神和范围。这样,倘若本发明实施例的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
【主权项】
1.一种多进程共享数据的方法,其特征在于,所述方法包括: 将各个进程中的共享数据存入自定义段中,并将所述自定义段加载到虚拟地址空间中; 获取所述自定义段的大小,并为所述共享数据在物理内存中分配与所述自定义段相等大小的共享物理内存,以及在所述自定义段与所述共享物理内存之间建立映射关系; 基于所述映射关系,在所述自定义段和所述共享物理内存之间,实现各个进程之间的共享数据的交互。2.如权利要求1所述的方法,其特征在于,获取所述自定义段的大小,包括: 编译第一文件,形成可执行连接格式ELF文件,通过所述ELF文件获取所述自定义段的初始大小;其中,所述第一文件为所述至少一个进程的源文件; 临时生成第二文件,在所述第二文件中调整所述自定义段的初始大小为页大小的整数倍,然后设置一个变量,并赋予所述变量的值为调整后的自定义段的初始大小,通过读取所述变量获取自定义段的大小。3.如权利要求1或2所述的方法,其特征在于,在所述自定义段与所述共享物理内存之间建立映射关系,包括: 针对所述自定义段的地址和所述物理共享内存的地址分别执行页对齐操作; 基于页对齐操作结果,确定所述自定义段与所述共享物理内存之间的地址映射。4.如权利要求1、2或3所述的方法,其特征在于,基于所述映射关系,在所述自定义段和所述共享物理内存之间,实现各个进程之间的共享数据的交互,包括: 当检测到所述至少一个进程访问所述自定义段时,基于所述映射关系,在所述共享物理内存中存取所述共享数据。5.如权利要求1-4任一项所述的方法,其特征在于,进一步包括: 当检测到所述共享物理内存已被释放时,则解除所述自定义段与所述共享物理内存之间的映射关系。6.一种多进程共享数据的装置,其特征在于,所述装置包括: 加载单元,用于将各个进程中的共享数据存入自定义段中,并将所述自定义段加载到虚拟地址空间中; 处理单元,用于获取所述自定义段的大小,并为所述共享数据在物理内存中分配一个与所述自定义段相等大小的共享物理内存,以及在所述自定义段与所述共享物理内存之间建立映射关系; 共享单元,用于基于所述映射关系,在所述自定义段和所述共享物理内存之间,实现各个进程之间的共享数据的交互。7.如权利要求6所述的装置,其特征在于,获取所述自定义段的大小时,所述处理单元用于: 编译第一文件,形成可执行连接格式ELF文件,通过所述ELF文件获取所述自定义段的初始大小;其中,所述第一文件为所述至少一个进程的源文件; 临时生成第二文件,在所述第二文件中调整所述自定义段的初始大小为页大小的整数倍,然后设置一个变量,并赋予所述变量的值为调整后的自定义段的初始大小,通过读取所述变量获取自定义段的大小。8.如权利要求6或7所述的装置,其特征在于,在所述自定义段与所述共享物理内存之间建立映射关系时,所述处理单元用于: 对所述自定义段的地址和所述物理共享内存的地址分别执行页对齐操作; 基于页对齐操作结果,确定所述自定义段与所述共享物理内存之间的地址映射。9.如权利要求6、7或8所述的装置,其特征在于,基于所述映射关系,在所述自定义段和所述共享物理内存之间,实现各个进程之间的共享数据的交互时,所述共享单元用于: 当检测到所述至少一个进程访问所述自定义段时,基于所述映射关系,在所述共享物理内存中存取所述共享数据。10.如权利要求6-9任一项所述的装置,其特征在于,所述共享单元进一步用于: 当检测到所述共享物理内存已被释放时,则解除所述自定义段与所述共享物理内存之间的映射关系。
【专利摘要】本发明涉及通信领域,公开了一种多进程共享数据的方法和装置,该方案为:将各个进程中的共享数据存入自定义段中,并将该自定义段加载到虚拟地址空间中;获取自定义段的大小,并为共享数据在物理内存中分配一个与自定义段相等大小的共享物理内存,以及在自定义段与共享物理内存之间建立映射关系;基于映射关系,在自定义段和共享物理内存之间,实现各个进程之间的共享数据的交互。这样,通过将共享数据汇聚存放在自定义段中来实现对自定义段的直接共享,避免了采用数据拷贝实现数据共享时导致效率偏低的问题,也避免了采用指针方式实现数据共享时需要修改原始代码导致的灵活性差以及可维护性差的问题。
【IPC分类】G06F9/54
【公开号】CN104881330
【申请号】CN201510266570
【发明人】笪禹
【申请人】大唐移动通信设备有限公司
【公开日】2015年9月2日
【申请日】2015年5月22日
转载请注明原文地址:https://www.famiwei.com/read-8138745.html