一种减少linux下多进程间数据拷贝的方法

文档序号:6540926阅读:479来源:国知局
一种减少linux下多进程间数据拷贝的方法
【专利摘要】本发明涉及一种计算机应用【技术领域】,具体地说是一种减少linux下多进程间数据拷贝的方法。包括步骤1:申请共享内存组织;步骤2:将该共享内存组织划分成不同大小的内存池,内存池划分成多个内存块;步骤3:进程A申请某一内存块,使用标识为占用标识,该内存块a的头部域中的用户计数计为1,步骤4:每多一个进程使用该内存块a中的数据,用户计数根据累加1,步骤5:每少一个进程使用该内存块a中的数据,用户计数根据累减1,直至该用户计数为零,使用标识置为空闲标识,则该内存块a归还内存池中;本发明的方法能够实现进程间零拷贝的数据通讯;并且实现了一次数据的组织,不需要进行数据的多次拷贝,就能直接被多个进程使用。
【专利说明】—种减少Iinux下多进程间数据拷贝的方法
【技术领域】
[0001]本发明涉及一种计算机应用【技术领域】,具体地说是一种减少Iinux下多进程间数据拷贝的方法。
【背景技术】
[0002]Linux系统是基于虚拟内存的系统,其进程空间是独立的,互相不可见的,每个进程独立管理自己的内存空间。进程间数据交互需要通过消息队列、共享内存、管道、文件等方式,这些方法要么需要进行数据的拷贝如消息队列、管道等,甚至要多次进行数据拷贝才能使得在一个进程中组织的数据在另外一个进程中可见,而且每多一个进程使用数据就需要多一次数据的拷贝,效率较低;要么只能两个进程间共享数据,如普通的共享内存,其通常的用方法是,为每两个进程开辟一个内存段作为共享内存空间,来完成这两个进程间的通讯,这块共享内存不能被多个进程复用,资源浪费严重。这就需要一种方法既能够实现进程间数据的高效交互,又能够使得这块内存能够被各个进程共享。

【发明内容】

[0003]解决上述技术问题,本发明提供了一种组织和管理共享内存的方式,针对LINUX操作系统,能够实现进程间零拷贝的数据通讯;并且实现了一次数据的组织,不需要进行数据的多次拷贝,就能直接被多个进程使用。该方法不仅能用于进程间通讯,进程内部各线程的通讯一样可以支持,非常灵活高效。
[0004]为了达到上述目的,本发明所采用的技术方案是,一种减少Iinux下多进程间数据拷贝的方法,包括以下步骤:
步骤1:根据系统对数据的实际使用情况确定使用系统共享内存的大小,并调用系统接口申请足够大的共享内存,定义为共享内存组织;
步骤2:将该共享内存组织划分成不同大小的内存池,每一内存池由一个内存头和N个大小相同的内存块构成,N为正整数,该内存头用于存放每一内存块的使用标识,N个内存块以数组的形式线性排列在内存头后,每一内存块包括头部域、数据域和尾域,头部域用于存放用户计数、内存类型、内存块索引和界定标识;用户数据域用于保存需要交互的数据;尾域用于存放内存的界定标识,内存块的尾域用来对内存进行界定;
步骤3:应用程序的进程A申请某一内存块时,从小到大依次查询各内存池中的各内存块,找到大小符合需求的内存块a,设置内存头中对应该内存块a的使用标识为占用标识,将该内存块a的头部域中的用户计数计清零,并向内存a块写入待交互的数据;
步骤4:进程A将该内存块a中头部域的内存类型和内存块索引传递给目标进程D[i], (i=l,2,3……n,n为正整数),每多发送一个目标进程,进程A将该内存块a的头部域中的用户计数累加I;
步骤5:目标进程D[i]通过该内存类型和内存块索引访问到该内存块a,
步骤6:目标进程D [i]中,每减少一个目标进程使用该内存块a中数据域中的数据时,则将该内存块a的头部域中的用户计数累减1,直至该用户计数为零,当用户计数减为零时,设置内存头对应于该内存块a的使用标识为空闲标识,把内存块释放到内存池中,以供
重复使用。
[0005]进一步的,所述用户数据域的大小为给内存池大小的累加和。
[0006]进一步的,步骤2中,所述内存池中各内存块的内存头、头域、用户数据域、尾域均为4n字节,当任意字段字节数不足4n字节时,则补充填充字段,使得满足4n字节的大小空间,最大程度上提闻内存读与的效率。更进一步的,每一内存块的内存头的头部域大小为4字节,用户数据域的字节数由内存池的类型决定,尾域中的界定标识为I个字节,填充字段为3个字节。
[0007]进一步的,步骤2中,内存池中的内存头存放有N个内存块的使用标识,当内存头占用的字节数不足4的倍数,则内存头补充填充字段。
[0008]进一步的,所述用户数据域的大小为给内存池大小的累加和。
[0009]进一步的,步骤3中,应用程序的进程A申请到内存块a时,将内存块a的数据域的首地址返回给申请者。
[0010]进一步的,步骤6中,当进程不再使用该内存块a时,则通过把待释放的指针减去一个固定的头域大小,即可得到所使用内存的信息——内存所属的内存池、内存的使用计数,把内存的使用计数减一,如果为零,则说明说有使用该内存的用户都已经释放了,则把该内存块归还的内存池中;否则,直接返回。
[0011]进一步的,所述头域和尾域中的界定标识为特定的字符,在申请和释放内存时进行内存越界的检查,以识别内存操作问题。
[0012]本发明通过采用上述技术方案,与现有技术相比,具有如下优点:
1、本发明充分考虑了数据操作的效率,设定该内存头、头部域、数据域和尾域的大小满足4n字节,η为正整数,保证申请内存的4字节对齐,保证了操作系统对数据访问的时候,实现地址的4字节对齐的,进而实现对整型数据的快速访问;
2、本发明使用数组的方式进行内存池的管理,每一内存池由一个内存头和N个大小相同的内存块构成,N为正整数,内存块索引存放了该内存块在内存池中数组中所排列的位置,即内存块索引为N,则表示该内存块为内存池中的第N块内存,无需内存块链表式的插入和取出,快速便捷;
3、本发明对头尾界定符使用固定的字符标识越界情况,在申请和释放时进行判断,防止内存的越界;在申请的时候,把头尾界定符设置为指定的字符,在释放的时候对此进行检查,如果界定符不是该字符,说明内存越界了,能够快速跟踪分析到该系统异常问题;
4、本发明通过使用标识,指示内存的使用情况,实现单用户申请,多用户使用,特别适合于分发类数据传递情况;
5、本发明建立在共享内存的基础上,共享内存本身是多进程都可见的,采用内存池划分为同样大小N个内存块的集合,在整个系统的运行过程中形成了系统化,组织化和通用化,使得目标进程能够灵活易用,满足了多进程频繁大批量数据交互,无需各进程之间进行拷贝,极大地提高了系统的效率。
【专利附图】

【附图说明】[0013]图1是本发明的实施例的共享内存组织结构图;
图2是本发明的实施例的应用场景示意图;
图3是本发明的实施例的内存申请示意图;
图4是本发明的实施例的内存释放示意图;
图5是本发明的实施例的内存检索示意图。
【具体实施方式】
[0014]现结合附图和【具体实施方式】对本发明进一步说明。
[0015]作为一个具体的实施例,本发明的一种减少Iinux下多进程间数据拷贝的方法,包括以下步骤:
步骤1:划分共享内存,定义为共享内存组织;
步骤2:参考图1所示,将该共享内存组织划分成不同大小的η个内存池,每一内存池由一个内存头和N个大小相同的内存块构成,N为正整数,不同内存池间的内存块大小不同,该内存头用于存放每一内存块的使用标识,N个内存块以数组的形式线性排列在内存头后,每一内存块包括头部域、数据域和尾域,头部域用于存放用户计数、内存类型、内存块索引和界定标识;用户数据域用于保存需要交互的数据;尾域用于存放内存的界定标识,内存块的尾域用来对对内存进行界定,在申请和释放时进行检查,防止内存使用的越界,利于检查内存的泄露。所述内存头、头部域、数据域和尾域的大小满足4η字节,η为正整数。所述用户数据域的大小依据该内存池的划分的空间以及内存池的类型来划分,同一内存池中的N个内存块的用户数据域的大小相同。所述尾域中的界定标识为I个字节,填充字段为3个字节。每一内存池中的内存头存放有N个内存块的使用标识,当内存头占用的字节数不足4η字节,则在内存头中补充填充字段,使得满足4η字节的大小空间。
[0016]步骤3:应用程序的进程A申请某一内存块时,根据申请内存的大小,从小到大查询依次查询各内存池中的各内存块,找到大小符合需求的内存块a,该查询方式包括:从小到大查询依次查询各内存池,首先找到数据域大于该申请内存大小的的内存池,然后在该内存池中找空闲的内存块,如果找不到则继续轮询下一个内存池,直到找到大小符合需求的内存块a,该内存块a即为查找到的第一个满足需求的最小的内存块,若找不到满足需求的内存块,则返回失败。
[0017]找到大小符合需求的内存块a后,设置内存头中对应该内存块a的使用标识为占用标识,将该内存块a的头部域中的用户计数计清零,并向内存块a的用户数据域写入数据;
步骤4:进程A将该内存块a头部域内存类型和内存块索引传递给目标进程D[i], (i=l,2,3……n,n为正整数),每多发送一个目标进程,进程A将该内存块a的头部域中的用户计数累加I ;
步骤5:目标进程D[i]通过该内存类型和内存块索引访问到该内存块a,再根据内存块a的构成找到用户数据的地址,通过该地址操作数据域,即可获得进程A存入内存a的数据,无需进行进程A与目标进程D[i]之间的数据拷贝,
步骤6:目标进程D[i]中,每减少一个目标进程使用该内存块a中数据域中的数据时,则将该内存块a的头部域中的用户计数累减1,直至该用户计数为零,设置内存头对应于该内存块a的使用标识为空闲标识,此时该内存块a成为了内存池中空闲的内存块,可以供其它进程使用。
[0018]本方案中使用数组的方式进行内存池的管理,无需内存块链表式的插入和取出;由于每一内存池由一个内存头和N个大小相同的内存块构成,N为正整数,内存块索引存放了该内存块在内存池中数组中所排列的位置,即内存块索引为N,则表示该内存块为内存池中的第N块内存。
[0019]本实施例将头尾界定符使用固定的字符标识越界情况,在申请和释放时进行判断,防止内存的越界;头尾界定符用来在申请内存和释放内存的时候对内存的头部和尾部进行界定,在申请的时候,把头尾界定符设置为指定的字符‘M’,在释放的时候对此进行检查,如果界定符不是‘M’字符,说明内存越界了,系统抛出异常,用户可以据此分析出问题的点。由于内存越界不是容易察觉的情况,一般内存越界不会立即出现异常,等出现异常的时候,已经很难知道什么时候出现的问题了,因此使用界定符,在释放的时候对此进行检查,使得用户能够及时的发现出问题的点,可以据此来进行跟踪分析找到问题。
[0020]本实施例通过使用标识,指示内存的使用情况,实现单用户申请,多用户使用,特别适合于分发类数据传递情况;
本发明建立在共享内存的基础上,共享内存本身是多进程都可见的,采用内存池划分为同样大小N个内存块的集合,在整个系统的运行过程中形成了系统化,组织化和通用化,使得目标进程能够灵活易用,满足了多进程频繁大批量数据交互,无需各进程之间进行拷贝,极大地提高了系统的效率。
[0021]参考图2和图3所示,在一个【具体实施方式】中,预先建立4个内存池共,各内存池包含的内存块的大小和内存块的个数定义如下:第一内存池,包含50个内存块,每个内存块的大小为100字节;第二内存池,包含50个内存块,每个内存块的大小为512字节;第三内存池,包含100个内存块,每个内存块的大小为1024字节;第四内存组,包含100个内存块,每个内存块的大小为10240字节。各内存池按从小到大的顺序排列在共享内存中,那么需要申请的共享内存大小为52 (内存头)+50* (100 (用户数据字段)+ 4 (头域)+ 4 (尾域))+52+50* (512+4+4)) +100+100* (1024+4+4) +100+100* (10240+4+4) =1159704 (字节)。
[0022]数值和内存池中用户数据大小的映射关系如下
【权利要求】
1.一种减少Iinux下多进程间数据拷贝的方法,其特征在于:包括以下步骤: 步骤1:划分共享内存,定义为共享内存组织; 步骤2:将该共享内存组织划分成不同大小的内存池,每一内存池由一个内存头和N个大小相同的内存块构成,N为正整数,该内存头用于存放每一内存块的使用标识,N个内存块以数组的形式线性排列在内存头后,每一内存块包括头部域、用户数据域和尾域,头部域用于存放用户计数、内存类型、内存块索引和界定标识;用户数据域用于保存需要交互的数据;尾域用于存放内存的界定标识,内存块的尾域用来对内存进行界定; 步骤3:应用程序的进程A申请某一内存块时,从小到大依次查询各内存池中的各内存块,找到大小符合需求的内存块a,设置内存头中对应该内存块a的使用标识为占用标识,将该内存块a的头部域中的用户计数计清零,并向内存a块写入待交互的数据; 步骤4:进程A将该内存块a中头部域的内存类型和内存块索引传递给目标进程D[i], (i=l,2,3……n,n为正整数),每多发送一个目标进程,进程A将该内存块a的头部域中的用户计数累加I1; 步骤5:目标进程D[i]通过该内存类型和内存块索引访问到该内存块a, 步骤6:目标进程D [i]中,每减少一个目标进程使用该内存块a中数据域中的数据时,则将该内存块a的头部域中的用户计数累减1,直至该用户计数为零,当用户计数减为零时,设置内存头对应于该内存块a的使用标识为空闲标识,把内存块释放到内存池中,以供重复使用。
2.根据权利要求1所述的一种减少Iinux下多进程间数据拷贝的方法,其特征在于:步骤2中,N为正整数。
3.根据权利要求1所述的一种减少Iinux下多进程间数据拷贝的方法,其特征在于:步骤2中,所述内存池中各内存块的内存头、头域、用户数据域、尾域均为4n字节,当任意字段字节数不足4n字节时,则补充填充字段,使其满足4n字节的大小空间。
4.根据权利要求3所述的一种减少Iinux下多进程间数据拷贝的方法,其特征在于:每一内存块的内存头的头部域大小为4字节,用户数据字段的字节数由内存池的类型决定,尾域中的界定标识为I个字节,填充字段为3个字节。
5.根据权利要求1所述的一种减少Iinux下多进程间数据拷贝的方法,其特征在于:步骤2中,内存池中的内存头存放有N个内存块的使用标识,当内存头占用的字节数不足4的倍数,则内存头补充填充字段。
6.根据权利要求1所述的一种减少Iinux下多进程间数据拷贝的方法,其特征在于:步骤3中,应用程序的进程A申请到内存块a时,将内存块a的数据域的首地址返回给申请者。
7.根据权利要求1所述的一种减少Iinux下多进程间数据拷贝的方法,其特征在于:步骤6中,当进程不再使用该内存块a时,则通过把待释放的指针减去一个固定的头域大小,得到所使用内存的信息,该信息包括:内存所属的内存池和内存的使用计数,再将内存的使用计数减一,如果该内存的使用技术为零,则把该内存块归还的内存池中;否则,直接返回。
【文档编号】G06F3/06GK103838859SQ201410100323
【公开日】2014年6月4日 申请日期:2014年3月19日 优先权日:2014年3月19日
【发明者】任赋, 陈从华, 郑福弟, 李培明, 黄杭星, 范少卓 申请人:厦门雅迅网络股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1