内存碎片化(Memory Fragmentation)

在 HRTOS 中,动态内存分配与释放在不规则模式下会破坏连续内存结构, 导致“可用总量足够,但无法分配”的现象。

机制定义

Fragmentation = Free Blocks Discontinuity + Allocation Pattern Disorder
分为:外部碎片(External)与内部碎片(Internal)

碎片产生机制

1. 不同大小任务申请内存
2. 释放顺序与申请顺序不一致
3. 内存被切割为多个不连续块
4. 大块连续内存无法满足请求

演示代码


#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;
}

/* 碎片生成任务 */
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);
}

碎片类型

外部碎片

空闲空间被切割为不连续小块。

内部碎片

分配块大于实际需求造成浪费。

系统意义

碎片问题直接影响 RTOS 长期运行稳定性, 在嵌入式系统中通常通过 slab / pool / static allocation 规避。

相关 API(v2)