外部碎片(External)
空闲空间被切割为不连续小块。虽然总空闲量足够,但由于不连续,无法满足大块连续内存的分配请求。
在 HRTOS 中,动态内存分配与释放在不规则模式下会破坏连续内存结构, 导致"可用总量足够,但无法分配"的现象。内存碎片化是影响嵌入式系统长期运行稳定性的关键问题。
通过简化版内存分配器演示碎片产生过程:不同大小任务申请内存、释放顺序与申请顺序不一致, 导致内存被切割为多个不连续块,最终出现大块连续内存无法满足请求的情况。
内存碎片化的本质与分类
内存碎片化(Memory Fragmentation)是指动态内存分配与释放在不规则模式下会破坏连续内存结构, 导致"可用总量足够,但无法分配"的现象。碎片化是影响嵌入式系统长期运行稳定性的关键问题。
空闲空间被切割为不连续小块。虽然总空闲量足够,但由于不连续,无法满足大块连续内存的分配请求。
分配块大于实际需求造成浪费。通常由于内存分配器为了管理方便,按固定大小块分配导致。
从内存分配到碎片形成的完整过程
在 HRTOS 动态内存管理中,碎片产生主要源于不规则的分配与释放模式。 当不同大小的任务频繁申请和释放内存时,内存空间会被逐渐切割为不连续的小块。
简化版内存分配器与碎片生成任务
alloc 和 free_block 函数,演示基本的内存分配与释放逻辑
#include "hrtos.h"
#define HEAP_SIZE 32
static u8 heap[HEAP_SIZE];
/* 简化版分配标记 */
u8 alloc(u8 size)
{
u8 i, start;
for(i = 0; i < HEAP_SIZE - size; i++)
{
u8 j, ok = 1;
for(j = 0; j < size; j++)
{
if(heap[i + j])
{
ok = 0;
break;
}
}
if(ok)
{
for(j = 0; j < size; j++)
heap[i + j] = 1;
return i;
}
}
return 0xFF;
}
void free_block(u8 start, u8 size)
{
u8 i;
for(i = 0; i < size; i++)
heap[start + i] = 0;
}
task_fragment_demo 任务,演示典型的碎片产生场景
/* 碎片生成任务 */
void task_fragment_demo(void)
{
u8 a, b, c;
while(1)
{
a = alloc(8);
b = alloc(6);
c = alloc(10);
free_block(a, 8);
free_block(c, 10);
/* 此时中间产生碎片 */
alloc(12); // 可能失败(典型碎片问题)
os_delay(10);
}
}
void hrtos_main(void)
{
u8 i;
for(i = 0; i < HEAP_SIZE; i++)
heap[i] = 0;
os_task_create((unsigned int)task_fragment_demo, 1, 4, 5);
}
外部碎片与内部碎片的详细说明
空闲空间被切割为不连续小块。这是动态内存分配中最常见的问题, 即使总空闲内存足够,也无法满足需要大块连续内存的分配请求。
分配块大于实际需求造成浪费。通常由于内存分配器为了管理方便, 按固定大小块分配,导致实际使用空间小于分配空间。
碎片化对 HRTOS 系统的重要性
碎片问题直接影响 RTOS 长期运行稳定性,在资源受限的嵌入式系统中尤为关键。 HRTOS 针对小资源 MCU 的优化思路中,内存管理是核心关注点。
深入学习的相关资源