H HRTOS 示例
System Resource Management

内存碎片化

在 HRTOS 中,动态内存分配与释放在不规则模式下会破坏连续内存结构, 导致"可用总量足够,但无法分配"的现象。内存碎片化是影响嵌入式系统长期运行稳定性的关键问题。

示例目标

通过简化版内存分配器演示碎片产生过程:不同大小任务申请内存、释放顺序与申请顺序不一致, 导致内存被切割为多个不连续块,最终出现大块连续内存无法满足请求的情况。

核心问题 外部碎片 + 内部碎片
典型表现 总量足够,无法分配
影响范围 长期运行稳定性
解决方案 slab / pool / static

核心机制

  • 动态内存分配与释放
  • 空闲块不连续性
  • 分配模式无序性
  • 内存切割与合并
Definition

机制定义

内存碎片化的本质与分类

内存碎片化(Memory Fragmentation)是指动态内存分配与释放在不规则模式下会破坏连续内存结构, 导致"可用总量足够,但无法分配"的现象。碎片化是影响嵌入式系统长期运行稳定性的关键问题。

核心公式: Fragmentation = Free Blocks Discontinuity + Allocation Pattern Disorder

外部碎片(External)

空闲空间被切割为不连续小块。虽然总空闲量足够,但由于不连续,无法满足大块连续内存的分配请求。

内部碎片(Internal)

分配块大于实际需求造成浪费。通常由于内存分配器为了管理方便,按固定大小块分配导致。

Generation Mechanism

碎片产生机制

从内存分配到碎片形成的完整过程

在 HRTOS 动态内存管理中,碎片产生主要源于不规则的分配与释放模式。 当不同大小的任务频繁申请和释放内存时,内存空间会被逐渐切割为不连续的小块。

1不同大小任务申请内存:任务按不同大小需求申请内存块
2释放顺序与申请顺序不一致:内存释放顺序与申请顺序不匹配
3内存被切割为多个不连续块:空闲空间被分割为分散的小块
4大块连续内存无法满足请求:虽然有足够总量,但无法分配连续大块
任务申请 → 内存分配 → 不规则释放 → 空间切割 → 碎片形成 → 分配失败
Demo Code

演示代码

简化版内存分配器与碎片生成任务

简化版内存分配器

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);
}
Fragmentation Types

碎片类型

外部碎片与内部碎片的详细说明

外部碎片

空闲空间被切割为不连续小块。这是动态内存分配中最常见的问题, 即使总空闲内存足够,也无法满足需要大块连续内存的分配请求。

内部碎片

分配块大于实际需求造成浪费。通常由于内存分配器为了管理方便, 按固定大小块分配,导致实际使用空间小于分配空间。

System Significance

系统意义

碎片化对 HRTOS 系统的重要性

碎片问题直接影响 RTOS 长期运行稳定性,在资源受限的嵌入式系统中尤为关键。 HRTOS 针对小资源 MCU 的优化思路中,内存管理是核心关注点。

核心判断: 碎片问题直接影响 RTOS 长期运行稳定性,在嵌入式系统中通常通过 slab / pool / static allocation 规避。
长期运行影响 系统运行时间越长,碎片积累越严重,最终导致内存分配失败
嵌入式系统特点 资源有限,无法承受碎片化带来的内存浪费
HRTOS 优化思路 采用 slab 分配器、内存池、静态分配等方式规避碎片问题