本发明涉及共享内存,具体地说是一种基于共享内存的内存管理方法及系统。
背景技术:
1、目前的进程间通讯方式有很多种,包括tcp、uds、管道、共享内存等等,相比于其他几种来说,共享内存在进程间通讯有着非常显著优势:
2、零拷贝,最高效的进程间通讯方式,无需内存拷贝,直接访问共享内存,数据量越大越有优势;。
3、无冗余,多进程共用一份地址空间,无需多进程存储相同的数据,降低内存资源的使用量。
4、使用共享内存,需要做好内存管理,避免内存问题的发生。共享内存因为其高效的进程间通讯而备受瞩目,但是也带来了很多的问题,比如内存泄露,内存越界,内存重复释放等等,需要进行内存管理,避免因为无法及时发现并且修正内存问题导致生产开发过程中出现问题。
技术实现思路
1、本发明的技术任务是针对以上不足之处,提供一种基于共享内存的内存管理方法及系统,通过对共享内存进行内存管理,来达到能够及时发现并解决内存问题,能够更好的使用共享内存,降低其负面效果。
2、本发明解决其技术问题所采用的技术方案是:
3、一种基于共享内存的内存管理方法,通过对共享内存申请到的内存块进行处理,来实现内存的管理,在所述内存块的头尾处添加额外的内存块,所述内存块里面记录本次申请内存的相关信息,包括:
4、bufferheader,存在于内存块的最前面,其数据结构包括两个二维数组、存储基本信息的基础数据结构,二维数组用于存储本次内存申请的调用堆栈,用户通过访问该二维数组可以获取到本次内存申请的全部调用链;
5、marksymbol,存在于bufferheader之后、用户实际使用的内存地址之前,用于判断此块内存是正在使用还是已经释放状态;
6、buffertailpattern,存在于内存块的最尾部,固定填充位,用户申请内存成功之后会在内存尾部进行填充,通过检查这块填充位置的内容可以判断有没有发生过内存越界的情况;
7、通过对所述bufferheader,marksymbol及buffertailpattern进行分析,获取到本次内存申请的信息,进行内存管理。
8、本方法通过对共享内存进行内存管理,来达到能够及时发现并解决内存问题,包括内存泄漏,内存越界,内存重复释放等的效果。
9、优选的,所述bufferheader,还存储了本次内存申请的大小,申请的线程id信息。
10、优选的,所述bufferheader,两个二维数组记录流的走向,包括经历过的文件名和方法名。
11、优选的,所述bufferheader,大小为3304字节。
12、优选的,所述marksymbol大小为8个字节,其数据结构包括两种,
13、一种是markersymbolmalloc,是申请的标志,在用户申请内存的最后会进行赋值;
14、一种是markersymbolfree,是释放的标志,在用户释放内存的最后会进行赋值。
15、当用户的这块内存完成申请之后,就会给用户地址的前端填充一个申请的标识符,用于表示这块内存目前正在被使用;当用户这块内存完成释放之后,会将这块标识符重新改为释放的标识符,用于表示这块内存现在已经被释放,处于空闲状态。marksymbol可以实时判断当前的内存块的状态,可以用于检测重复释放的错误。
16、优选的,所述buffertailpattern,大小为8个字节。
17、进一步的,内存泄漏的分析方式如下:
18、统计申请内存和释放内存的次数,在最终关闭共享内存的时候,判断申请内存和释放内存的次数是否相同,如果不同,则说明有显示申请过内存,但是没有主动释放的情况,此时通过以下策略来进行分析:
19、遍历整个共享内存,按照内存分配的大小从共享内存的起始位置逐个往下定位,检测每一块小内存的marksymbol,如果这块是申请的标识markersymbolmalloc,那么就代表着这块内存还没有被释放过,否则就是已经释放过的内存;
20、通过整个策略可找到一共有哪些内存块未被释放,这时候就可以通过引入的bufferheader来获取这块内存的相关信息,包括它的申请链路以及申请大小,申请的进程/线程id等等,以此帮助用户找到内存泄漏的地方,从而可以定点修复,避免发生后续严重的错误。
21、进一步的,内存越界的分析方式如下:
22、通过buffertailpattern,在用户申请的内存尾部填充特定的十六进制数,在需要时检测用户申请到的内存的尾部,如果存的数据不是当时填充的buffertailpattern,那么就认为用户对该内存的操作发生了写越界,此时可使用log或者error来示警,同时中断进程的继续运行,避免后续因为越界导致出现更严重的问题。
23、进一步的,内存重复释放的分析方式如下:
24、所述marksymbol,分为申请的标识markersymbolmalloc和释放的标识markersymbolmalloc,在用户申请内存完成的时候,将用户使用的头地址前面填充申请的标识markersymbolmalloc,用于表示该内存目前的状态是正在使用的;当用户释放这块内存之后,将这块的标识符置为释放的标识markersymbolmalloc,用于表示该内存目前的状态是已经释放完成,可以被其他的地方复用;
25、在释放内存的时候,需要提前检测一下标识位,如果是申请的标识,那么就可以正常释放,如果已经是释放的标识,那么就代表着此时发生了内存重复释放,这种情况下就应该示警,同时中断进程的运行,来避免因为重复释放导致出现验证的问题。
26、本发明还要求保护一种基于共享内存的内存管理系统,该系统通过对共享内存申请到的内存块进行处理,来实现内存的管理,在所述内存块的头尾处添加额外的内存块,所述内存块里面记录本次申请内存的相关信息;
27、该系统具体通过上述的基于共享内存的内存管理方法实现共享内存管理。
28、本发明的一种一种基于共享内存的内存管理方法及系统与现有技术相比,具有以下有益效果:
29、通过本方法及系统能够完成对共享内存申请出来的内存进行一定的内存管理操作,及时规避可能出现的内存问题,从而减少因此造成的损失。
1.一种基于共享内存的内存管理方法,其特征在于,通过对共享内存申请到的内存块进行处理,来实现内存的管理,在所述内存块的头尾处添加额外的内存块,所述内存块里面记录本次申请内存的相关信息,包括:
2.根据权利要求1所述的一种基于共享内存的内存管理方法,其特征在于,所述bufferheader,还存储了本次内存申请的大小,申请的线程id信息。
3.根据权利要求1或2所述的一种基于共享内存的内存管理方法,其特征在于,所述bufferheader,两个二维数组记录流的走向,包括经历过的文件名和方法名。
4.根据权利要求1或2所述的一种基于共享内存的内存管理方法,其特征在于,所述bufferheader,大小为3304字节。
5.根据权利要求1所述的一种基于共享内存的内存管理方法,其特征在于,所述marksymbol大小为8个字节,其数据结构包括两种,
6.根据权利要求1所述的一种基于共享内存的内存管理方法,其特征在于,所述buffertailpattern,大小为8个字节。
7.根据权利要求1所述的一种基于共享内存的内存管理方法,其特征在于,内存泄漏的分析方式如下:
8.根据权利要求7所述的一种基于共享内存的内存管理方法,其特征在于,内存越界的分析方式如下:
9.根据权利要求7或8所述的一种基于共享内存的内存管理方法,其特征在于,内存重复释放的分析方式如下:
10.一种基于共享内存的内存管理系统,其特征在于,该系统通过对共享内存申请到的内存块进行处理,来实现内存的管理,在所述内存块的头尾处添加额外的内存块,所述内存块里面记录本次申请内存的相关信息;