[发明专利]进程间的通信方法和通信系统有效
申请号: | 201110403299.1 | 申请日: | 2011-12-07 |
公开(公告)号: | CN103150220A | 公开(公告)日: | 2013-06-12 |
发明(设计)人: | 游晶 | 申请(专利权)人: | 腾讯科技(深圳)有限公司 |
主分类号: | G06F9/54 | 分类号: | G06F9/54;G06F12/02 |
代理公司: | 北京德琦知识产权代理有限公司 11018 | 代理人: | 张晓峰;宋志强 |
地址: | 518044 广东省深圳*** | 国省代码: | 广东;44 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 进程 通信 方法 系统 | ||
技术领域
本发明涉及计算机的数据处理技术,尤其涉及进程间的通信方法和通信系统。
背景技术
进程间通信(IPC,Interprocess Communications)就是在不同进程之间传播或交换信息,这就需要不同进程之间存在一个双方都可以访问的介质,共享内存就是用于进程之间进行通信的介质。所谓共享内存,是指同一块物理内存被映射到进程A、B各自的进程地址空间,可以被A、B进程同时访问,达到交换数据的目的。
图1为现有技术中的基于共享内存的IPC方法的示意图。参见图1,现有的基于共享内存的IPC方案会在进程内部使用缓存,在这种机制中,发送进程A的应用线程在发送数据时会先将数据包拷贝到内部缓冲区中,然后由发送线程从内部缓冲区拷贝到共享内存上;接收进程则先由接收线程将数据从共享内存拷贝到内部缓冲区,再返回给上层的应用线程。由此可见,数据在传输过程中需要在共享内存和内部缓冲区之间进行两次数据分配、拷贝、释放操作,这些操作所带来的计算资源开销(如CPU以及内存开销)是非常大的,进程间的通信吞吐量也较低。
发明内容
有鉴于此,本发明的主要目的在于提供一种进程间的通信方法和通信系统,以降低计算资源开销,提升进程间通信的吞吐量。
本发明的技术方案是这样实现的:
一种进程间的通信方法,该方法在进程间使用共享内存队列收发数据,包括:
在所述共享内存中标记读写地址,包括预读头地址PrepareHead、已读头地址ActualHead、预写尾地址PrepareTail和已写尾地址ActualTail;
发送进程在发送数据时,根据当前的读写地址和欲发数据包长度判断所述共享内存是否有可写入该数据包的空间,当判定有可写入该数据包的空间时在共享内存中以所述PrepareTail为开头写入数据包,并根据所发送数据包的长度更新所述PrepareTail,当写入完毕后将该数据包的写入地址放入发送进程的句柄池;发送线程依次读取该句柄池中的写入地址,每读一个写入地址则根据该写入地址对应的数据包长度更新所述ActualTail,并通知接收进程接收数据;
接收进程收到接收数据的通知后,根据所述PrepareHead和ActualTail判断所述共享内存是否有数据包可读,当判定有数据包可读时将所述PrepareHead放入接收进程的句柄池中,并根据该PrepareHead开始的数据包长度更新该PrepareHead;接收进程依次读取该句柄池中的PrepareHead,并从共享内存的该PrepareHead处开始读取数据包,每读取完毕一个数据包则根据该已读数据包长度更新所述ActualHead。
一种进程间的通信系统,包括:
共享内存,用于以队列形式存储进程间的通信数据,其中设置有共享内存读写地址的标记,包括预读头地址PrepareHead、已读头地址ActualHead、预写尾地址PrepareTail和已写尾地址ActualTail;
设置在发送进程中的预发送模块、发送应用线程、已发送模块、发送句柄池以及发送线程,其中:所述预发送模块用于当发送应用线程在发送数据时,根据所述PrepareTail和ActualHead判断所述共享内存是否有可写入欲发送数据包的空间,当判定有可写入欲发送数据包的空间时通知所述发送应用线程在共享内存中以所述PrepareTail为开头写入数据包,并根据该数据包的长度更新所述PrepareTail;所述发送应用线程在每写入完毕一个数据包后触发所述已发送模块,所述已发送模块用于将所发送数据包的写入地址放入所述发送句柄池;所述发送线程用于依次读取该发送句柄池中的写入地址,每读一个写入地址则根据该写入地址对应的数据包长度更新所述ActualTail,并通知接收进程接收数据;
设置在接收进程中的预接收模块、接收线程、接收句柄池、接收应用线程以及已接收模块;其中:所述接收进程在收到接收数据的通知后唤醒接收线程,接收线程利用所述预接收模块根据所述PrepareHead和ActualTail判断所述共享内存是否有数据包可读,当判定有数据包可读时将所述PrepareHead放入所述接收句柄池中,并由所述预接收模块根据该PrepareHead开始的数据包长度更新该PrepareHead;所述接收应用线程依次读取该接收句柄池中的PrepareHead,并从共享内存的该PrepareHead处开始读取数据包,每读取完毕一个数据包则触发已接收模块根据该数据包长度更新所述ActualHead。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于腾讯科技(深圳)有限公司,未经腾讯科技(深圳)有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201110403299.1/2.html,转载请声明来源钻瓜专利网。
- 上一篇:一种发动机加机油口盖安装工装
- 下一篇:一种活塞环梯面磨床工件盘快速安装夹具