嵌入式技术论坛
直播中

王伟

7年用户 1493经验值
私信 关注
[经验]

动态内存管理是什么?动态内存管理算法有哪几种

详细描述

动态内存堆接口

动态内存管理是一个真实的堆内存管理模块,可以在当前资源满足的情况下,根据用户 的需求分配任意大小的内存块。而当用户不需要再使用这些内存块时,又可以释放回堆中 供其他应用分配使用。RT-Thread 系统为了满足不同的需求,提供了两套不同的动态内存 管理算法,分别是小堆内存管理算法和 SLAB 内存管理算法。

小堆内存管理模块主要针对系统资源比较少,一般用于小于2MB内存空间的系统;而SLAB 内存管理模块则主要是在系统资源比较丰富时,提供了一种近似多内存池管理算法的快速 算法。两种内存管理模块在系统运行时只能选择其中之一或者完全不使用动态堆内存管理 器。这两种管理模块提供的API接口完全相同。

除上述之外,RT-Thread还有一种针对多内存堆的管理机制,即memheap内存管理。memheap方法 适用于系统存在多个内存堆的情况,它可以将多个内存“粘贴”在一起,形成一个大的内存堆, 用户使用起来会感到格外便捷。

函数说明
void* rt_malloc  (  rt_size_t   size  )
分配内存块

该函数将从内存堆上分配用户指定大小的内存块。

参数
size  需要分配的内存块的大小,单位为字节。
返回
成功则返回分配的内存块地址;失败则返回 失败
示例:
dynmem_sample.c, sd_sample.c, tcpclient_sample.c, tcpclient_select_sample.c, tcpserver_sample.c , 以及 udpserver_sample.c.
void* rt_realloc  (  void *   rmem,
rt_size_t   newsize
)
重新分配内存块

此函数将在已分配内存块的基础上重新分配内存块的大小(增加或缩小),在进行重新分配内存块时, 原来的内存块数据保持不变(缩小的情况下,后面的数据被自动截断)。

参数
rmem  指向已分配的内存块
newsize  重新分配的内存大小
返回
重新分配的内存块地址
void* rt_calloc  (  rt_size_t   count,
rt_size_t   size
)
分配多内存块

此函数将从内存堆中分配连续内存地址的多个内存块,每个空间对象的内存大小为字节,并返回指向已分配内存的指针。

参数
count  分配的空间对象的计数
size  分配的空间对象的大小
返回
成功则指向指向第一个内存块地址的指针,并且所有分配的内存块都被初始化成零;如果失败则返回 NULL。
示例:
httpclient_sample.c.
void rt_free  (  void *   rmem  )
释放内存块

用户线程使用完从内存分配器中申请的内存后,必须及时调用该函数释放,否则会造成内存泄漏, 系统会把待释放的内存还回给堆管理器中。

参数
rmem  待释放的内存块指针
示例:
dynmem_sample.c, httpclient_sample.c, sd_sample.c, tcpclient_sample.c, tcpclient_select_sample.c, tcpserver_sample.c , 以及 udpserver_sample.c.
rt_err_t rt_memheap_init  (  struct rt_memheap *   memheap,
const char *   name,
void *   start_addr,
rt_uint32_t   size
)
初始化内存堆

在使用memheap堆内存时,必须要在系统初始化的时候进行堆内存的初始化, 可以通过调用该函数完成内存堆的初始化。

参数
memheap  内存堆句柄
name  内存堆的名称
start_addr  堆内存区域起始地址
size  堆内存大小
返回
RT_EOK
注解
如果有多个不连续的memheap可以多次调用该函数将其初始化并加入memheap_item链表。

原作者:文江博客

更多回帖

发帖
×
20
完善资料,
赚取积分