《一种进程间数据传输的方法及装置.pdf》由会员分享,可在线阅读,更多相关《一种进程间数据传输的方法及装置.pdf(12页珍藏版)》请在专利查询网上搜索。
1、(10)申请公布号 CN 103425518 A(43)申请公布日 2013.12.04CN103425518A*CN103425518A*(21)申请号 201210151358.5(22)申请日 2012.05.16G06F 9/46(2006.01)(71)申请人深圳市腾讯计算机系统有限公司地址 518000 广东省深圳市南山区高新区高新南一路飞亚达大厦5-10楼(72)发明人钟超宇 张礼方 冯晓冰(74)专利代理机构深圳中一专利商标事务所 44237代理人张全文(54) 发明名称一种进程间数据传输的方法及装置(57) 摘要本发明适用于数据通信领域,提供一种进程间数据传输方法及装置,所述。
2、方法包括:第一进程将数据拷贝到内存管道中;第二进程获取指向所述数据在内存管道中起始位置的管道指针;根据所述指针,解码所述数据到所述第二进程的结构体中。在本方法中,第一进程将数据拷贝到内存管道中后,第二进程获取了表示所述数据在内存管道中起始位置的管道指针,在处理数据时通过该管道指针就可以定位到该数据进行数据解码。本发明实施例相比现有管道通信减少了两次数据拷贝,从而可以进一步提高进程通信程序的处理性能。(51)Int.Cl.权利要求书1页 说明书5页 附图5页(19)中华人民共和国国家知识产权局(12)发明专利申请权利要求书1页 说明书5页 附图5页(10)申请公布号 CN 103425518 A。
3、CN 103425518 A1/1页21.一种进程间数据传输方法,其特征在于,所述方法包括下述步骤:第一进程将数据拷贝到内存管道中;第二进程获取指向所述数据在内存管道中起始位置的管道指针;根据所述指针,解码所述数据到所述第二进程的结构体中。2.如权利要求1所述的一种进程间数据传输方法,其特征在于,在第一进程将数据拷贝到内存管道中步骤之后还包括下述步骤:判断所述数据在内存管道中是否为连续存储,若不成立,则将所述数据拷贝到第二进程内存中。3.如权利要求1或2所述的一种进程间数据传输方法,其特征在于,在第一进程将数据拷贝到内存管道中之前还包括下述步骤:将原始数据经过序列化后得到所述数据,序列化后的数。
4、据以字符流的形式存在。4.如权利要求1或2所述的一种进程间数据传输方法,其特征在于,所述根据所述指针,解码所述数据到所述第二进程的结构体中步骤包括:第二进程查找所述数据中包含的各个结构体数据的起始位置,并保存指向这些位置的指针。5.如权利要求4所述的一种进程间数据传输方法,其特征在于,若所述数据已经拷贝到第二进程的内存中,则第二进程直接查找所述数据中包含的各个结构体数据的起始位置;若所述数据位于所述内存管道中,则通过所述管道指针定位到该数据,第二进程再查找该数据中包含的各个结构体数据的起始位置。6.一种进程间数据传输装置,其特征在于,所述装置包括:数据拷贝模块,用于第一进程将数据拷贝到内存管道。
5、中;指针获取模块,用于第二进程获取指向所述数据在内存管道中起始位置的管道指针;数据解码模块,根据所述指针,解码所述数据到所述第二进程的结构体中。7.如权利要求6所述的一种进程间数据传输装置,其特征在于,所述装置还包括:数据判断模块,用于判断所述数据在内存管道中是否为连续存储;直接拷贝模块,用于当数据不为连续存储,则将所述数据拷贝到第二进程内存中。8.如权利要求6或7所述的一种进程间数据传输装置,其特征在于,所述装置还包括:序列化模块,用于将原始数据经过序列化后得到所述数据,序列化后的数据以字符流的形式存在。9.如权利要求6或7所述的一种进程间数据传输装置,其特征在于:所述数据解码模块,通过第二。
6、进程查找所述数据中包含的各个结构体数据的起始位置,并保存指向这些位置的指针来进行数据解码。10.如权利要求9所述的一种进程间数据传输装置,其特征在于,若所述数据已经拷贝到第二进程的内存中,则第二进程直接查找所述数据中包含的各个结构体数据的起始位置;若所述数据位于所述内存管道中,则通过所述管道指针定位到该数据,第二进程再查找该数据中包含的各个结构体数据的起始位置。权 利 要 求 书CN 103425518 A1/5页3一种进程间数据传输的方法及装置技术领域0001 本发明属于数据通信领域,尤其涉及一种进程间数据传输的方法及装置。背景技术0002 数据拷贝一直是程序模块中一个比较耗时和消耗性能的操。
7、作,在各种场景下如何减少数据拷贝可以提高代码执行效率,一直是代码开发者所追求的目标。对于进程间的数据通信,由于不同的进程运行在各自不同的内存空间中,一方对于变量的修改另一方是无法感知的。因此,进程之间的信息传递不可能通过变量或其它数据结构直接进行,只能通过进程间通信来完成。0003 管道通信是进程通信的一种具体的实现方式,管道(内存管道)是连接读写进程的一个特殊文件,允许进程按先进先出方式传送数据,也能使进程同步执行操作。发送进程以字符流形式把大量数据送入管道,接收进程从管道中接收数据,这里发送进程和接收进程分为称为第一进程和第二进程。0004 当第二进程需要使用第一进程发送的数据前,第一进程。
8、需要将数据拷贝到内存管道中,第二进程再将数据拷贝出来,另外,第二进程将数据解码到结构体中供下一步逻辑运算又要经过一次拷贝,整个过程需要进行三次数据拷贝,必然需要额外的性能消耗。发明内容0005 鉴于上述问题,本发明提供一种进程间数据传输方法,旨在解决现有进程间数据传输过程中需要多次数据拷贝的技术问题,从而提高了程序处理性能。0006 本发明是这样实现的,一种进程间数据传输方法,所述方法包括下述步骤:0007 第一进程将数据拷贝到内存管道中;0008 第二进程获取指向所述数据在内存管道中起始位置的管道指针;0009 根据所述指针,解码所述数据到所述第二进程的结构体中。0010 进一步,在第一进程。
9、将数据拷贝到内存管道中步骤之后还包括下述步骤:0011 判断所述数据在内存管道中是否为连续存储,若不成立,则将所述数据拷贝到第二进程内存中。0012 进一步,第一进程将数据拷贝到内存管道中之前还包括下述步骤:0013 将原始数据经过序列化后得到所述数据,序列化后的数据以字符流的形式存在。0014 进一步,所述根据所述指针,解码所述数据到所述第二进程的结构体中步骤包括:0015 第二进程查找所述数据中包含的各个结构体数据的起始位置,并保存指向这些位置的指针。0016 本发明的另一目的在于提供一种进程间数据传输装置,该装置减少了数据拷贝得到过程,所述装置包括:0017 数据拷贝模块,用于第一进程将。
10、数据拷贝到内存管道中;说 明 书CN 103425518 A2/5页40018 指针获取模块,第二进程获取指向所述数据在内存管道中起始位置的管道指针;0019 数据解码模块,根据所述指针,解码所述数据到所述第二进程的结构体中。0020 进一步,所述装置还包括:0021 数据判断模块,用于判断所述数据在内存管道中是否为连续存储。0022 直接拷贝模块,用于当所述数据不为连续存储时将所述数据拷贝到第二进程内存中。0023 进一步,所述装置还包括:0024 序列化模块,用于将原始数据经过序列化后得到所述数据,序列化后的数据以字符流的形式存在。0025 所述数据解码模块通过第二进程查找所述数据中包含的。
11、各个结构体数据的起始位置,并保存指向这些位置的指针来进行数据解码。0026 本发明实施例的有益效果是:本发明提供了一种进程间数据传输方法及装置,在所述方法中,第一进程将数据拷贝到内存管道中后,第二进程获取了表示所述数据在内存管道中起始位置的管道指针,在处理数据时通过该管道指针就可以定位到该数据,本发明实施例相比现有管道通信减少了两次数据拷贝,从而可以进一步提高进程通信程序的处理性能。附图说明0027 图1是本发明第一实施例提供的一种进程间数据传输方法的流程图;0028 图2是本发明第二实施例提供的一种进程间数据传输方法的流程图;0029 图3是现有技术中数据解码示意图;0030 图4是本发明第。
12、二实施例提供的数据解码示意图;0031 图5是本发明第三实施例提供的一种进程间数据传输装置的结构方框图;0032 图6是本发明第四实施例提供的一种进程间数据传输装置的结构方框图。具体实施方式0033 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。0034 本发明实施例主要是针对进程间数据传输过程的优化,减少了管道通信过程中数据拷贝的次数。0035 为了说明本发明所述的技术方案,下面通过具体实施例来进行说明。0036 实施例一:0037 图1示出了本发明第一实施例提供的一种。
13、进程间数据传输方法的流程,为了便于说明仅示出了与本发明实施例相关的部分。0038 在步骤S101中,第一进程将数据拷贝到内存管道中。0039 本步骤首先将需要传输的数据拷贝到内存管道中,所述内存管道实质是一个共享文件,可借助于文件系统机制实现,包括管道文件的创建、打开、关闭和读写。第一进程与第二进程在进行数据通信前都必须能够感知到对方的存在,如果对方不存在,就没有必要向说 明 书CN 103425518 A3/5页5内存管道拷贝数据。0040 通常所述的数据是经过序列化后的数据,序列化是将对象的状态信息转换为可以存储或传输的形式的过程。第一进程在拷贝数据之前需要数据序列化保存到本地内存中,序列。
14、化后的数据以字符流的形式保存在内存中,通信双发都能够识别字符流的数据格式,因此即使双方进程的开发平台不一样亦可进行数据传输,同时,因为数据是以字符流形式保存的,因此也可提高通信安全性。0041 在步骤S102中,第二进程获取指向所述数据在内存管道中起始位置的管道指针。0042 本步骤是本发明的核心所在,本步骤中第二进程无需将保存在内存管道内的对应数据拷贝到本地内存中,增加了一个指向所述数据在内存管道中起始位置的管道指针,因为所述内存管道本质是一段内存空间,第一进程在拷贝数据时就可以得到拷贝数据的起始地址,第二进程通过指向该地址的管道指针就可以定位到所述数据,所述的数据长度为两个相邻的管道指针间。
15、的距离,从而可以进一步对该数据进行操作。因此,本步骤通过保存一个指向所述数据的管道指针代替了现有拷贝内存管道内中的数据。0043 在步骤S103中,根据所述指针,解码所述数据到所述第二进程的结构体中。0044 通过所述管道指针定位到该数据,第二进程再查找该数据中包含的各个结构体数据的起始位置,再保存指向这些位置的结构体指针可以实现数据解码。本实施例中,将所述结构体指针作为解码结果保存在消息结果中,本实施例的数据解码只会涉及到指针的拷贝,可以大幅提高程序执行性能。0045 实施例二:0046 图2示出了本发明第二实施例提供的一种进程间数据传输方法的流程,为了便于说明仅示出了与本发明实施例相关的部。
16、分。0047 在步骤S201中,原始数据经过序列化后得到所述数据,序列化后的数据以字符流的形式存在。0048 通常原始数据需要有经过序列化后得到所述数据,序列化是将对象的状态信息转换为可以存储或传输的形式的过程。第一进程在拷贝数据之前需要数据序列化保存到本地内存中,序列化后的数据以字符流的形式保存在内存中,通信双发都能够识别字符流的数据格式,因此即使双方进程的开发平台不一样亦可进行数据传输,同时,因为数据是以字符流形式保存的,因此也可提高通信安全性。0049 在步骤S202中,第一进程将数据拷贝到内存管道中。该步骤与实施例一的步骤S101相同,不再赘述。0050 在步骤S203中,判断所述数据。
17、在内存管道中是否为连续存储。0051 在步骤S204中,若所述数据不为连续存储,则将所述数据拷贝到第二进程内存中。0052 在本发明实施例中,由于内存管道是一个循环队列,数据可能不是位于一个连续的存储空间中,此时需要采用现有的数据拷贝方法将数据拷贝到第二进程的内存中,因为此时所述数据可能位于队列的两端,通过所述指向数据起始位置的管道指针无法找到完整的数据,但这种情况出现概率比较小,所述是数据大都会存储在连续的空间中,只有在内存管道轮转一圈后才会出现一次这种情况,因此总体来说不会影响进程通信程序的执行效率。说 明 书CN 103425518 A4/5页60053 在步骤S205中,若所述数据为连。
18、续存储,第二进程获取指向所述数据在内存管道中起始位置的管道指针。0054 在本发明实施例中,考虑到了数据可能不是连续存储,直接获取指向数据起始位置的管道指针可能无法定位到所有的数据,因此在确定数据连续存储后再执行本步骤。获取到管道指针后,第二进程可以执行后续的逻辑运算,结束后跳出当前已经处理完毕后的数据。0055 在步骤S206中,第二进程查找所述数据中包含的各个结构体数据的起始位置,并保存指向这些位置的指针。本步骤实现了根据管道指针进行数据解码的过程,由于第一进程和第二进程之间传输的数据是经过序列化后的数据,该数据以字符流的形式存在,第二进程在使用该数据前需要对字符流进行反序列化解码。在现有。
19、技术中,数据解码的过程是将序列化后的数据拷贝到一个结构体当中转换成相应的数据,比如结构体中的段值、属性值等等。如图3示出了现有技术中数据解码的过程,对图中缓存中的一段数据进行解码,需要将此段数据中包含的各个原始结构体数据拷贝到对应的结构体当中进行数据转换,图中有三个结构体,这个结构体可以是个结构化消息。显然,现有数据解码技术中还需要进行一次数据拷贝,同样会消耗性能。0056 作为具体的实现方式,如图4示出了本发明实施提供的一种数据解码过程,图中设置了三个结构体指针,分别用于指向相应结构体数据的起始位置,将所述的结构体指针作为解码结果保存在消息结果中,本实施例的数据解码只会涉及到指针的拷贝,可以。
20、大幅提高程序执行性能。0057 在本发明实施例中,待解码的数据可能保存在第二进程的内存中或保存在内存管道中,若所述数据已经拷贝到第二进程的内存中,则第二进程直接查找所述数据中包含的各个结构体数据的起始位置,保存这些指针来实现数据解码;若所述数据位于所述内存管道中,则通过所述管道指针定位到该数据,第二进程再查找该数据中包含的各个结构体数据的起始位置,再保存这些指针可以实现数据解码。0058 实施例三:0059 图5示出了本发明第三实施例提供的一种进程间数据传输装置的结构方框图,为了便于说明仅示出了与本发明实施例相关的部分。0060 一种进程间数据传输装置,所述装置包括:0061 数据拷贝模块50。
21、1,用于第一进程将数据拷贝到内存管道中;0062 指针获取模块502,用于第二进程获取指向所述数据在内存管道中起始位置的管道指针;0063 数据解码模块503,根据所述指针,解码所述数据到所述第二进程的结构体中。0064 在本发明实施例中,数据拷贝模块控制第一进程将数据拷贝到内存管道中,指针获取模块控制第二进程获取指向所述数据在内存管道中起始位置的管道指针,第二进程无需将保存在内存管道内的对应数据拷贝到本地内存中,增加了一个指向所述数据在内存管道中起始位置的管道指针,因为所述内存管道本质是一段内存空间,第一进程在拷贝数据时就可以得到拷贝数据的起始地址,第二进程通过指向该地址的管道指针就可以定位。
22、到所述数据,所述的数据长度为两个相邻的管道指针间的距离,从而可以进一步对该数据进行操作。数据解码模块通过所述管道指针定位到该数据,第二进程再查找该数据中包含的各说 明 书CN 103425518 A5/5页7个结构体数据的起始位置,再保存指向这些位置的结构体指针可以实现数据解码。本实施例中,将所述结构体指针作为解码结果保存在消息结果中,本实施例的数据解码只会涉及到指针的拷贝,可以大幅提高程序执行性能。0065 实施例四:0066 图6示出了本发明第四实施例提供的一种进程间数据传输装置的结构方框图,为了便于说明仅示出了与本发明实施例相关的部分。0067 序列化模块601,用于将原始数据经过序列化。
23、后得到所述数据,序列化后的数据以字符流的形式存在;0068 数据拷贝模块602,用于第一进程将数据拷贝到内存管道中;0069 数据判断模块603,用于判断所述数据在内存管道中是否为连续存储;0070 直接拷贝模块604,用于当数据不为连续存储,则将所述数据拷贝到第二进程内存中。0071 指针获取模块605,用于若所述数据为连续存储,则第二进程获取指向所述数据在内存管道中起始位置的管道指针。0072 数据解码模块606,根据所述指针,解码所述数据到所述第二进程的结构体中。0073 在本发明实施例中,由于内存管道是循环队列,因此存于内存管道内的数据可能不是连续存储的,指向数据首地址的管道指针无法定。
24、位到完整的数据,因此在获取管道指针之前,数据判断模块需要判断所述数据是否为连续存储,若成立,指针获取模块才去获取指向数据起始位置的管道指针,否则按照直接拷贝模块将数据拷贝到第二进程中,由于数据不是连续存储的概率较小,整体上不会影响程序的执行效率。0074 在本发明实施例中,第二进程获取到所述的管道地址或者第二进程所述数据拷贝到本地内存后,在进行使用数据之前需要进行数据解码,因为所述数据通常是经过序列化后得到的字符流。现有数据解码技术是将相关数据拷贝到对应的结构体当中,还是需要一次数据拷贝,必须消耗额外性能。在本发明中,作为具体的实现方式,数据解码模块通过第二进程查找所述数据中包含的各个结构体数据的起始位置,并保存指向这些位置的指针来实现数据解码,将这样将指针拷贝代替了数据拷贝,进一步提高了程序处理性能。0075 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。说 明 书CN 103425518 A1/5页8图1说 明 书 附 图CN 103425518 A2/5页9图2说 明 书 附 图CN 103425518 A3/5页10图3图4说 明 书 附 图CN 103425518 A10。