一种传递共享内存的方法和装置制造方法

文档序号:6513343阅读:143来源:国知局
一种传递共享内存的方法和装置制造方法
【专利摘要】本发明实施例公开了一种传递共享内存的方法和装置。其中,所述传递共享内存的方法包括:调用函数以调用者进程的本地内存地址作为关键词创建共享内存并以所述的共享内存关键词为参数构建函数调用语句;将所述的函数调用语句发送给被调用者进程,以供被调用者进程解析函数调用语句获取共享内存,实现数据交换。应用本发明实施例提供的方法和装置,可以实现进程间的共享内存和进程内的本地内存这两种数据交换方式的统一,提高数据交换的同步性。
【专利说明】一种传递共享内存的方法和装置
[0001]本案是申请号为201110164503.9 (—种传递共享内存的方法和装置),申请日为2011.6.17的中国专利申请的分案申请。
【技术领域】
[0002]本发明涉及数据交换技术,尤其涉及一种传递共享内存的方法和装置。
【背景技术】
[0003]传统意义上的本地内存传递方式通常仅局限于一个进程的内部,是因为操作系统为每个运行于其中的进程所提供的虚拟内存空间都是相同的,而虚拟内存与物理内存之间的映射完全由操作系统控制,应用程序进程只能通过虚拟内存地址访问实际存储于物理内存中的数据。由此可见,即使是完全相同的虚拟内存地址,在不同进程中所对应的物理内存也可以完全不同,故不同进程之间是无法通过本地内存传递数据的。
[0004]为了提高进程间数据交换的效率,简化进程间通信的流程,大多数操作系统都会提供共享内存的进程间通信机制。所述的共享内存不是从某一进程的内存中划分出来的,而是在系统的物理内存中开辟一块可以为多个进程共享的内存区域,因为每个进程的内存总是私有的,建立共享内存的目的是希望每一个访问它的进程连接它,这个连接过程称为映射。系统在建立共享内存时给共享内存分配每个进程的本地内存地址,每个进程的本地内存地址都可以连接到相应的共享内存。即将共享内存分别映射到每一个进程各自的本地内存空间,从而实现多个进程之间基于共享内存的数据交换。
[0005]图1为现有技术中传递共孚内存的不意图,如图1所不:在同一系统中有两个进程(进程A和进程B)正在运行,其中进程A期望通过访问共享内存来实现对进程B信息的调用,在这种情况下,进程A可称之为调用者进程,进程B可称之为被调用者进程。具体来说,进程A调用进程B的方法如下:
[0006]步骤1:进程A申请一个共享内存;
[0007]步骤2:系统根据进程A的申请指定一个共享内存关键词(0X00)建立共享内存(0X00),并通过一定的方式告知进程A和进程B ;
[0008]在本步骤中,系统可以通过如下方式将共享内存关键词告知进程A和进程B:
[0009]A、系统采用特殊文件以匿名方式创建共享内存时,操作系统通过特殊文件将共享内存关键词(0X00)告知进程A和进程B,但是,这种方式一般只适用于具有亲缘关系的进程之间。例如,在父进程中先调用mmap函数,再调用fork函数,那么在父进程调用fork函数后,子进程继承父进程匿名映射后的本地内存地址;
[0010]B、系统也可以在编译程序的命令行参数中指定同一个公共头文件,该公共头文件包含共享内存关键词(0X00),并同时告知进程A和进程B,但是,在关键字已经与一个共享内存相结合的情况下,任何试图创建同名共享内存的操作都会失败,此时,系统必须处理这种失败,删除已有的共享内存,然后再次尝试创建,使得流程更加复杂,并且可能需要多次尝试;[0011]为了解决同名共享内存问题,进程A和进程B约定一个路径名和项目ID (—个介于O到255之间的字符值),进程A调用fork函数,将这两个值变换为一个关键字,系统根据此关键字创建共享内存;但是,这种方式通常只能应用于类UNIX操作系统,而且仅限于系统的路径和项目ID为公知的;
[0012]步骤3:进程A把共享内存(0X00)连接(即映射)到自己的本地内存地址(即进程A的本地内存地址0X003D2C8);进程B把共享内存(0X00)映射(即连接)到自己的本地内存地址(即进程B的本地内存地址0X0024C28),从而实现进程A和进程B之间基于共享内存(0X00)的数据交换。
[0013]从上述现有技术公开的技术方案中,可以看出,系统在创建共享内存时,不仅需要依赖特殊的文件系统,有可能存在共享内存创建失败的情形,同时,进程A和进程B都必须通过共享内存关键词与共享内存会合,再将共享内存映射到各自的本地内存地址,流程比较复杂,容易导致进程间共享内存数据交换的不同步性。而这种进程间数据交换的不同步性是因为进程间共享内存数据交换和进程内本地内存数据交换方式的不统一造成的。

【发明内容】

[0014]有鉴于此,本发明实施例提供了一种传递共享内存的方法和装置,能够实现进程间共享内存和进程内本地内存这两种数据交换方式的统一,提高进程间共享内存数据交换的同步性。
[0015]为实现上述目的,本发明实施例采用如下技术方案。
[0016]一种传递共享内存的方法,包括:
[0017]调用函数以调用者进程的本地内存地址作为关键词创建共享内存并以所述的共享内存关键词为参数构建函数调用语句;
[0018]将所述的函数调用语句发送给被调用者进程,以供被调用者进程解析函数调用语句获取共享内存。
[0019]本发明实施例还提供了一种实现传递共享内存方法的装置,应用于调用者进程侧,包括:
[0020]第一模块,用于调用函数以调用者进程的本地内存地址作为关键词创建共享内存并以所述的共享内存关键词为参数构建函数调用语句;
[0021]第二模块,用于将所述的函数调用语句发送给被调用者进程,以供被调用者进程解析函数调用语句获取共享内存。
[0022]本发明实施例还提供了 一种实现传递共享内存方法的装置,应用于被调用者进程侧,包括:
[0023]第一模块,用于接收来自调用者进程的函数调用语句,其中所述函数调用语句的构建方式为:调用函数以调用者进程的本地内存地址作为关键词创建共享内存并以所述的共享内存关键词为参数构建;
[0024]第二模块,用于解析函数调用语句获取共享内存。
[0025]本发明实施例通过调用函数直接以本地内存地址为共享内存关键词创建共享内存,通过这种方式保持共享内存关键字与本地内存地址的一致性,使所创建的共享内存可以直接与调用者进程的本地内存连接,调用者进程不需要根据共享内存关键词与共享内存会合并将共享内存映射到本地内存,从而使调用者进程本地内存与共享内存之间透明,本地内存数据内容可以直接复制到共享内存;
[0026]同时,本发明实施例又通过调用函数将共享内存关键词作为参数构建函数调用语句,并将函数调用语句发送给被调用者进程供其获取共享内存,使得被调用者进程本地内存访问与共享内存访问在函数接口层面加以统一;
[0027]因此,本发明实施例提供的技术方案可以保证进程间共享内存的传递数据方式和进程内本地内存的传递数据方式的统一,简化了数据交换的流程,提高了数据交换的同步性。
【专利附图】

【附图说明】
[0028]图1为现有技术中传递共孚内存的不意图;
[0029]图2为本发明实施例中传递共享内存的方法流程图;
[0030]图3为本发明实施例中传递共享内存的示意图;
[0031]图4为本发明实施例中传递共享内存的方法流程图。
【具体实施方式】
[0032]为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明做进一步的详细描述。
[0033]为了实现进程间共享内存和进程内本地内存的数据方式的统一,本发明实施例提供的一种传递共享内存的方法,具体包括:调用函数以调用者进程的本地内存地址作为关键词创建共享内存并以所述的共享内存关键词为参数构建函数调用语句;将所述的函数调用语句发送给被调用者进程,以供被调用者进程解析函数调用语句获取共享内存,从而实现进程间的数据交换。
[0034]图2为本发明实施例提供的一种传递共享内存的方法流程图;如图2所示,该方法包括:
[0035]步骤201:调用者进程调用函数以本地内存地址作为关键词创建共享内存;
[0036]所述的函数包括shmat, shmdt, shmget, shmctl等可以创建共享内存的函数;所述的本地内存地址可以是调用者进程的文本化形式的本地内存地址;所述的共享内存是在系统物理内存中建立一个可以为多个进程共享的内存段;
[0037]在该步骤中,调用者进程利用函数以本地内存地址为关键词创建共享内存,所创建的共享内存可以直接与调用者进程的本地内存连接,调用者进程不需要根据共享内存关键词与共享内存会合并将共享内存映射到本地内存,从而使调用者进程本地内存与共享内存之间透明。
[0038]步骤202:调用者进程调用函数以所述的共享内存关键词为参数构建函数调用语句,并通过进程间通信机制发送给被调用者进程;
[0039]这里,需要指出的是:正是由于本发明的发明目的是要保证共享内存和本地内存地址的一致性,从而实现通过函数直接调用共享内存中的数据,而进程内本地内存数据交换是直接通过函数调用本地内存的数据来实现的,那么只有通过调用函数以调用者进程的本地内存地址作为关键词来创建共享内存,才能保证进程内本地内存数据交换和进程间共享内存数据交换方式的统一。如果调用者进程采用非函数方式建立共享内存,虽然可以实现共享内存的创建,但是由于后续的共享内存关键词不能通过函数形式直接发送给被调用者进程,而是调用者进程必须通过其他管道告知被调用者进程,这样导致调用者进程在创建共享内存和传递共享内存关键词不同步,进而导致被调用者进程与共享内存会合的滞后。
[0040]步骤203:被调用者进程根据函数调用语句参数提供的共享内存关键词与共享内存会合,得到共享内存的信息(所述信息包括共享内存名字和/或地址),通过共享内存信息获取共享内存。
[0041]步骤204:被调用者进程将共享内存映射到被调用者进程的本地内存地址。
[0042]步骤205:被调用者进程根据函数调用语句,执行被调用者进程本地被调用的函数,并将执行结果写入共享内存和函数返回语句,通过进程间通信机制将函数返回语句返回到调用者进程。
[0043]步骤206:调用者进程将共享内存中被被调用者进程更新的数据内容直接拷贝回本地内存。
[0044]上述步骤构成一次完整的进程间共享内存数据交换过程,下面举例进一步说明本发明的【具体实施方式】,图3为本发明实施例中传递共享内存的示意图,如图3所示,调用者进程为了使用被调用者进程所提供的一部分功能,先调用一个本地函数,该函数以本地内存地址01AA0314为关键词建立共享内存01AA0314,并将本地内存数据内容复制到共享内存,同时,该函数又以共享内存关键词01AA0314为参数构建函数调用语句,通过进程间通信机制传递给被调用者进程,被调用者进程解析函数调用语句,从中得到共享内存名字,并将共享内存映射到被调用者进程本地内存地址,此后将如同访问本地内存一样访问与调用者进程共享的内存空间。
[0045]具体来说,该方法的实现流程如图4所示:
[0046]步骤401:调用者进程调用本地的shmat函数;
[0047]步骤402:所述的shmat函数以调用者进程本地内存地址的字符串01AA0314作为关键字创建共享内存01AA0314,调用者进程可以直接将本地内存中的数据内容复制到共享内存中;
[0048]步骤403:所述的shmat函数以所述的共享内存关键词01AA0314为参数构建函数调用语句,通过进程间通信机制将所述的函数调用语句传送给被调用者进程;
[0049]步骤404:被调用者进程接收来自调用者进程的函数调用语句,根据所述的函数调用语句参数01AA0314解析出共享内存的关键字01AA0314 ;
[0050]步骤405:被调用者进程通过所述的共享内存关键字01AA0314与共享内存会合,得到共享内存名字01AA0314 ;
[0051]步骤406:被调用者进程将共享内存01AA0314映射到被调用者进程的本地内存地址 0001E98 ;
[0052]步骤407:执行被调用者进程的本地被调用的函数,所述被调用的函数与调用者进程调用的函数相对应,可以包括shmat函数或者其他相对应的函数;
[0053]步骤408:所述被调用的函数将执行结果写入共享内存01AA0314,并构建函数返回语句,通过进程间通信机制传递给调用者进程;[0054]步骤409:调用者进程将共享内存中被被调用者进程更新的数据内容直接拷贝回本地内存。
[0055]本发明提供的技术方案相较于其它通过共享内存实现进程间传递数据的方法具有显著优势:
[0056]调用者进程使用函数直接以本地内存地址为共享内存关键词创建共享内存,可以保持共享内存关键字与本地内存地址的一致性,使所创建的共享内存可以直接与调用者进程的本地内存连接,调用者进程不需要根据共享内存关键词与共享内存会合并将共享内存映射到本地内存,从而使调用者进程本地内存与共享内存之间透明,本地内存数据内容可以直接复制到共享内存;
[0057]同时,调用者进程又使用函数将共享内存关键词作为参数构建函数调用语句并发送给被调用者进程,通过函数调用语句传输共享内存的关键词,使得本地内存访问与共享内存访问在函数接口层面加以统一。
[0058]由此可见,本发明提供的技术方案可以保证进程间共享内存的传递数据方式和进程内本地内存的传递数据方式的统一,简化了数据交换的流程,提高了数据交换的同步性。
[0059]本发明实施例还提供了 一种传递共享内存的装置,应用于调用者进程侧,包括:
[0060]第一模块,用于调用函数以调用者进程的本地内存地址作为关键词创建共享内存并以所述的共享内存关键词为参数构建函数调用语句;
[0061]第二模块,用于将所述的函数调用语句发送给被调用者进程,以供被调用者进程解析函数调用语句获取共享内存。
[0062]该装置进一步包括:
[0063]第三模块,用于将共享内存中被被调用者进程更新的数据内容直接拷贝回调用者进程的本地内存地址。
[0064]本发明实施例还提供了一种传递共享内存的装置,应用于被调用者进程侧,包括:
[0065]第一模块,用于接收来自调用者进程的函数调用语句,其中所述函数调用语句的构建方式为:调用函数以调用者进程的本地内存地址作为关键词创建共享内存并以所述的共享内存关键词为参数构建;
[0066]第二模块,用于解析函数调用语句获取共享内存。
[0067]所述第二模块包括:
[0068]第一单元:用于解析函数调用语句的参数从中获取共享内存关键词;
[0069]第二单元:用于将共享内存关键词与共享内存会合,并将共享内存映射到被调用者进程的本地内存地址。
[0070]该装置进一步包括:
[0071]第三模块:用于将函数执行结果写入共享内存,并通过函数返回语句返回到调用者进程。
[0072]以上仅为本发明的较佳实施例,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种传递共享内存的方法,其特征在于: 调用函数以调用者进程的本地内存地址作为关键词创建共享内存并以所述的共享内存关键词为参数构建函数调用语句; 将所述的函数调用语句发送给被调用者进程,以供被调用者进程解析函数调用语句获取共享内存。
2.根据权利要求1所述的方法,其特征在于,所述被调用者进程解析函数调用语句获取共享内存包括: 被调用者进程解析函数调用语句的参数从中获取共享内存关键词; 将共享内存关键词与共享内存会合,并将共享内存映射到被调用者进程的本地内存地址。
3.根据权利要求1或2所述的方法,其特征在于,进一步包括: 被调用者进程根据函数调用语句,执行被调用者进程本地被调用的函数,并将执行结果写入共享内存,通过函数返回语句返回给调用者进程。
4.根据权利要求3所述的方法,其特征在于,进一步包括: 调用者进程将共享内存中被被调用者进程更新的数据内容直接拷贝回调用者进程的本地内存地址。
5.根据权利要求1或2所述的方法,其特征在于,所述调用者进程的本地内存地址为文本化形式的内存地址。
6.一种传递共享内存的装置,其特征在于,应用于调用者进程侧,包括: 第一模块,用于调用函数以调用者进程的本地内存地址作为关键词创建共享内存并以所述的共享内存关键词为参数构建函数调用语句; 第二模块,用于将所述的函数调用语句发送给被调用者进程,以供被调用者进程解析函数调用语句获取共享内存。
7.根据权利要求6所述的装置,其特征在于,进一步包括: 第三模块,用于将共享内存中被被调用者进程更新的数据内容直接拷贝回调用者进程的本地内存地址。
8.一种传递共享内存的装置,其特征在于,应用于被调用者进程侧,包括: 第一模块,用于接收来自调用者进程的函数调用语句,其中所述函数调用语句的构建方式为:调用函数以调用者进程的本地内存地址作为关键词创建共享内存并以所述的共享内存关键词为参数构建; 第二模块,用于解析函数调用语句获取共享内存。
9.根据权利要求8所述的装置,其特征在于,所述第二模块包括: 第一单元:用于解析函数调用语句的参数从中获取共享内存关键词; 第二单元:用于将共享内存关键词与共享内存会合,并将共享内存映射到被调用者进程的本地内存地址。
10.根据权利要求8或9所述的装置,其特征在于,进一步包括: 第三模块:用于将函数执行结果写入共享内存,并通过函数返回语句返回到调用者进程。
【文档编号】G06F9/46GK103995736SQ201310446221
【公开日】2014年8月20日 申请日期:2011年6月17日 优先权日:2011年6月17日
【发明者】王东临 申请人:天津书生软件技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1