[发明专利]一种基于共享内存的进程间通讯方法有效
申请号: | 201310432622.7 | 申请日: | 2013-09-22 |
公开(公告)号: | CN103514053B | 公开(公告)日: | 2017-01-25 |
发明(设计)人: | 刘庆云;李世明;刘洋;秦鹏;郑超;孙永;周舟;杨威 | 申请(专利权)人: | 中国科学院信息工程研究所 |
主分类号: | G06F9/54 | 分类号: | G06F9/54;G06F9/44 |
代理公司: | 北京轻创知识产权代理有限公司11212 | 代理人: | 杨立 |
地址: | 100093 *** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 共享 内存 进程 通讯 方法 | ||
技术领域
本发明涉及计算机领域,尤其涉及一种基于共享内存的进程间通讯方法。
背景技术
传统的Unix编程模型,在同一个操作系统上运行多个进程,每个进程都有各自的地址空间,Unix进程间的信息共享可以有多种形式,通常包括:管道,FIFO,消息队列,以及域间套接字和共享内存。除共享内存外的几种通信方式的问题在于,两个进程交换信息时,这些信息必须经由内核传递,从而造成了更高的开销,这在效率要求极高的系统中就成为了影响系统性能的瓶颈。
而利用共享内存进程间的通讯则不再涉及内核,如何利用共享内存,实现进程间的高效通讯,成为亟待解决的一个问题。
发明内容
本发明所要解决的技术问题是提供一种基于共享内存的进程间通讯方法,合理利用共享内存,减少系统开销,达到更高的性能要求。
本发明解决上述技术问题的技术方案如下:一种基于共享内存的多进程间通讯方法,包括如下步骤:
步骤1:写进程创建包括管理单元、循环队列和内存池的共享内存,并在管理单元中存储关于整个共享内存的管理信息;
步骤2:写进程从管理单元中获取关于当前写进程的操作位置,,根据每次待写入数据的大小,顺序开辟与待存入数据大小等大的第N(N=1,2,3…)存储块,将待写入的数据存入相应存储块中;
步骤3:开辟第N存储块时,记录所述第N存储块的大小、起始位置、 结束位置以及存储的是否为完整数据,上述记录的信息形成第N结构体,并存入循环队列的队尾指针处;同时更新管理单元中关于当前写进程的操作位置的记录;
步骤4:在执行步骤2至3的同时,一个或若干个读进程可对共享内存进行读操作;
步骤5:每个读进程自循环队列的队头开始,依次读取第N(N=1,2,3…)结构体;
步骤6:判断第N结构体是否处于循环队列的队尾,如果是队尾,说明该结构体对应的存储块正在进行写操作,则等待,等到队尾指针不指向该结构体时,执行步骤7;如果不是队尾,则直接执行步骤7;
步骤7:根据该结构体中关于第N存储块的位置信息,读取内存池中相应第N存储块中的数据;
步骤8:判断所述写进程是否还要向内存池写入数据,如果是,返回步骤2;否则判断内存池中数据是否都已读完,如果未读完则返回步骤5;否则结束。
本发明的有益效果是:本发明以循环队列形式对共享内存进行管理,共享内存供多个进程以队列形式顺序读写,读或写以块为单位,块大小由用户控制;共享内存被多进程共享,进程分为只读进程和只写进程;支持多个进程同时对该共享内存进行读操作,只能有一个进程对该共享内存进行写操作,读写不冲突,能同时进行;本发明所述方法大大减少了进程间交换信息时经由内核的拷贝次数,提高了后台系统的吞吐量,降低了系统的开销,有效地提高了系统的性能。
在上述技术方案的基础上,本发明还可以做如下改进。
进一步,所述步骤1中所述的管理信息包括:
该共享内存创建者ID、队列规模、内存池大小、内存池起始位置、内存 池结尾位置、当前写进程的操作位置、当前读该共享内存的所有读进程标记、当前使用该共享内存的进程数目、读写锁和互斥锁。
进一步,步骤2中开辟第N存储块时,还要进行如下操作,
步骤2.1:根据第N-1存储块的结束位置、待存入数据的大小以及内存池的结尾位置判断内存池是否还有足够空间开辟第N存储块来存储数据,如果有足够空间,则执行步骤2.2;如果没有足够空间,则执行2.3;
步骤2.2:开辟与待存入数据等大的第N存储块,将待存入数据存入所述第N存储块,生成关于第N存储块的结构体,并在结构体中标记所存储的数据为完整数据;
步骤2.3:开辟自第N-1存储块的结束位置至内存池的结束位置大小的第N存储块,将待存入数据的一部分存入所述第N存储块,形成第N存储块的结构体,在结构体中标记所存储的数据为不完整数据;将剩余的待存入数据存入内存池头部。
采用上述进一步方案的有益效果是:可以有效解决当内存不足时,数据写入的问题。
进一步,步骤2.3中在将剩余的待存入数据存入内存池头部前要执行如下步骤:
步骤2.3.1:写进程根据循环队列的第N(N=1,2,3,4…)结构体中关于读进程读取第N存储块的记录,判断第N存储块中是否被所有读进程读完,如果未读完则等待,等到读完后,执行步骤2.3.2;如果读完则直接执行步骤2.3.2;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国科学院信息工程研究所,未经中国科学院信息工程研究所许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201310432622.7/2.html,转载请声明来源钻瓜专利网。
- 上一篇:旋转压缩机和具有其的冷冻循环装置
- 下一篇:耐磨环组件和泵送设备