一种基于共享内存的内存池实现方法技术

技术编号:37819933 阅读:12 留言:0更新日期:2023-06-09 09:53
本发明专利技术公开了一种基于共享内存的内存池实现方法,属于共享内存管理技术领域,本发明专利技术要解决的技术问题为如何满足多进程动态内存分配、释放的同时,实现行多进程间的通信,采用的技术方案为:该方法是利用共享内存技术将共享内存进行池化,形成共享内存池,用户通过共享内存池进行多进程间的通信;具体如下:多进程访问同一共享内存:主线程和子线程进行初始化后,访问同一共享内存;多线程进行内存申请、释放:子线程和主线程分别通过对应的重载系统函数进行内存申请和释放;内存池管理内存。内存池管理内存。内存池管理内存。

【技术实现步骤摘要】
一种基于共享内存的内存池实现方法


[0001]本专利技术涉及共享内存管理
,具体地说是一种一种基于共享内存的内存池实现方法。

技术介绍

[0002]共享内存指(shared memory)在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存是Unix下的多进程之间的通信方法,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。
[0003]静态内存分配(Static Memory Allocation)就是指在程序编译期间就确定的内存分配或回收存储空间的分配内存的方法,不占用程序运行时CPU资源,是栈上分配的内存,静态分配内存的运行效率要比动态分配内存的效率要高。
[0004]动态内存分配(Dynamic Memory Allocation)就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。是堆上分配的内存,动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
[0005]当前内存池的实现(PTMalloc、TCMalloc、JEMalloc等)均都是管理进程内的普通堆内存,而非可多进程通信的共享内存。故如何满足多进程动态内存分配、释放的同时,实现行多进程间的通信是目前亟待解决的技术问题。

技术实现思路

[0006]本专利技术的技术任务是提供一种一种基于共享内存的内存池实现方法,来解决如何满足多进程动态内存分配、释放的同时,实现行多进程间的通信的问题。
[0007]本专利技术的技术任务是按以下方式实现的,一种基于共享内存的内存池实现方法,该方法是利用共享内存技术将共享内存进行池化,形成共享内存池,用户通过共享内存池进行多进程间的通信;具体如下:
[0008]多进程访问同一共享内存:主线程和子线程进行初始化后,访问同一共享内存;
[0009]多线程进行内存申请、释放:子线程和主线程分别通过对应的重载系统函数进行内存申请和释放;
[0010]内存池管理内存。
[0011]作为优选,主线程和子线程进行初始化具体如下:
[0012](1)、通过shmget()方法创建共享内存:主进程启动后,通过shmget()方法一次向操作系统申请配置大小的共享内存,下一步执行步骤(2);
[0013](2)、将shmget()方法返回的共享内存标识符shmid写入到环境变量中,下一步执
行步骤(3);
[0014](3)、通过shmat()方法将申请的共享内存附加到当前主进程上,使主进程获得访问共享内存的能力,下一步执行步骤(4);
[0015](4)、通过fork()方法创建并启动子进程,下一步执行步骤(5)和(7);
[0016](5)、子进程通过环境变量获取到共享内存标识符shmid,下一步执行步骤(6);
[0017](6)、子进程通过shmat()方法将共享内存附加到当前子进程上,使子进程获得访问共享内存的能力,下一步执行步骤(7);
[0018](7)、子进程和主进程访问同一共享内存池,进行内存申请与释放。
[0019]作为优选,子进程的内存申请与释放由原先的普通堆内存替换为多进程通信的共享内存池,共享内存池通过编程语言的函数重载技术系统函数malloc()、free()、realloc()、calloc()、valloc()、pvalloc()、memalign()、aligned_alloc()、posix_memalign()、cfree()、operatornew()、operator delete()、operator new[]()及operator delete[]()来接管内存的申请与释放,并达到使用共享内存的目的。
[0020]作为优选,主进程通过共享内存池提供z_malloc(s)、z_free(p)、z_new(size)及z_delete(p)带有z_前缀的函数进行内存的申请与释放。
[0021]更优地,共享内存池分为Free Heap(管理空闲内存)、Header Heap(管理头信息内存)、Common Heap(管理通用的内存)、Data Heap(管理固定大小的内存)及System Heap(管理系统数据)五个不同的内存堆区域;
[0022]其中,Free Heap(管理所有空闲内存)相较于其他内存池多次向操作系统申请、释放内存的管理方式,基于共享内存的内存池是一次申请配置大小的共享内存,将所有内存置于内存池的Free Heap中进行管理,当Header Heap(管理头信息内存)、Common Heap(管理通用的内存)、Data Heap(管理固定大小的内存)及System Heap(管理系统数据)内存低于设定阈值时,从Free Heap中获取一块内存进入到Header Heap(管理头信息内存)、Common Heap(管理通用的内存)、Data Heap(管理固定大小的内存)或System Heap(管理系统数据)中,当Header Heap(管理头信息内存)、Common Heap(管理通用的内存)、Data Heap(管理固定大小的内存)及System Heap(管理系统数据)空闲内存高于设定阈值时,释放部分内存回到FreeHeap中;
[0023]Header Heap(管理头信息内存)是在内存池创建时确定的内存大小,内存池运行过程中不会与Free Heap进行内存交互;存储确定大小及初始化时已确定的信息,比如内存池大小等等。
[0024]Common Heap(管理通用的内存)满足各种大小内存的随机申请释放,是一个通用的内存管理结构;
[0025]Data Heap(管理固定大小的内存)为固定的大小,是在内存池创建时已经确定的大小,该类内存分配使用common heap来满足内存分配,但使用Data heap会有效的降低内存碎片;
[0026]System Heap(管理系统数据),此类型数据修改频率低,在内存的管理结构异于Common heap,考虑到修改频率低的特定,此Heap内存申请释放的效率较低。
[0027]更优地,Free Heap(管理所有空闲内存)基于共享内存的内存池是一次申请配置大小的共享内存,将所有内存置于内存池的Free Heap中进行管理,当线程申请内存时,从
Free Heap中获取一块内存满足内存申请;当线程释放内存池,将释放的空闲内存重新放入到Free Heap中。
[0028]一种电子设备,包括:存储器和至少一个处理器;
[0029]其中,所述存储器上存储有计算机程序;
[0030]所述至少一个处理本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于共享内存的内存池实现方法,其特征在于,该方法是利用共享内存技术将共享内存进行池化,形成共享内存池,用户通过共享内存池进行多进程间的通信;具体如下:多进程访问同一共享内存:主线程和子线程进行初始化后,访问同一共享内存;多线程进行内存申请、释放:子线程和主线程分别通过对应的重载系统函数进行内存申请和释放;内存池管理内存。2.根据权利要求1所述的基于共享内存的内存池实现方法,其特征在于,主线程和子线程进行初始化具体如下:(1)、通过shmget()方法创建共享内存:主进程启动后,通过shmget()方法一次向操作系统申请配置大小的共享内存,下一步执行步骤(2);(2)、将shmget()方法返回的共享内存标识符shmid写入到环境变量中,下一步执行步骤(3);(3)、通过shmat()方法将申请的共享内存附加到当前主进程上,使主进程获得访问共享内存的能力,下一步执行步骤(4);(4)、通过fork()方法创建并启动子进程,下一步执行步骤(5)和(7);(5)、子进程通过环境变量获取到共享内存标识符shmid,下一步执行步骤(6);(6)、子进程通过shmat()方法将共享内存附加到当前子进程上,使子进程获得访问共享内存的能力,下一步执行步骤(7);(7)、子进程和主进程访问同一共享内存池,进行内存申请与释放。3.根据权利要求1所述的基于共享内存的内存池实现方法,其特征在于,子进程的内存申请与释放由原先的普通堆内存替换为多进程通信的共享内存池,共享内存池通过编程语言的函数重载技术系统函数malloc()、free()、reallo c()、calloc()、valloc()、pvalloc()、memalign()、aligned_alloc()、pos ix_memalign()、cfree()、operatornew()、operator delete()、operator new[]()及operator delete[]()来接管内存的申请与释放,并达到使用共享内存的目的。4.根据权利要求1所述的基于共享内存的内存池实现方法,其特征在于,主进程通过共享内存池提供z_malloc(s)、z_free(p)、z_new(size)及z_dele te(p)带有z_前缀的函数进行内...

【专利技术属性】
技术研发人员:管延信
申请(专利权)人:上海沄熹科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1