一种多进程共享数据的方法和装置的制造方法

文档序号:8905140阅读:223来源:国知局
一种多进程共享数据的方法和装置的制造方法
【技术领域】
[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为本发明实施例中多进程数据共享的自定义段的结构
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1