动态内存管理——tlsf

定义

TLSF(全称Two-Level Segregated Fit)

源码

https://github.com/mattconte/tlsf

代码

结构体

typedef struct block_header_t {
    /* 指向上一个物理块。*/
    struct block_header_t * prev_phys_block;

   /* 此块的大小,不包括块头。*/
    size_t size;

    /* 下一个和上一个空闲块。*/
    struct block_header_t * next_free;
    struct block_header_t * prev_free;
} block_header_t;

/*
**由于块大小始终至少是 4 的倍数,因此两个最小
** 大小字段的重要位用于存储块状态:
** - 位 0:块是忙还是空闲
** - 位 1:前一个块是忙碌还是空闲
*/

static const size_t block_header_free_bit = 1 << 0;
static const size_t block_header_prev_free_bit = 1 << 1;

/*已经使用的块已经使用的内存大小*/
static const size_t block_header_overhead = sizeof(size_t);

/* 用户数据直接在已使用块中的大小字段之后开始。*/
static const size_t block_start_offset =
    offsetof(block_header_t, size) + sizeof(size_t);

/*
*一个自由块的最小大小是整个存储空间减去头部说明
*更大的空间索引是FL_INDEX
*/
static const size_t block_size_min =
    sizeof(block_header_t) - sizeof(block_header_t *);
static const size_t block_size_max = tlsf_cast(size_t, 1) << FL_INDEX_MAX;

/* TLSF 控制结构。*/
typedef struct control_t {
 /* 空列表指向此块以指示它们是空闲的。*/
    block_header_t block_null;

  /* 位图空闲列表。*/
    unsigned int fl_bitmap;
    unsigned int sl_bitmap[FL_INDEX_COUNT];

    /* 空闲列表的控制链表。*/
    block_header_t * blocks[FL_INDEX_COUNT][SL_INDEX_COUNT];
} control_t;


/* 在执行指针算术时用于强制转换的类型。*/
typedef ptrdiff_t tlsfptr_t;

堆的创建

lv_tlsf_t lv_tlsf_create_with_pool(void * mem, size_t bytes)
{
	/*从mem开始初始化control_t*/
    lv_tlsf_t tlsf = lv_tlsf_create(mem);
/*堆开始空闲块开始的首地址要添加control_t的偏移,大小也是要减去control_t的大小*/
    lv_tlsf_add_pool(tlsf, (char *)mem + lv_tlsf_size(), bytes - lv_tlsf_size());
    return tlsf;
}
  • lv_tlsf_t tlsf = lv_tlsf_create(mem)作用:
    • 将bitmap清0,所有链表置空(指向block_null)
  • *lv_tlsf_add_pool(tlsf, (char )mem + lv_tlsf_size(), bytes - lv_tlsf_size())
    • 作用:初始化两个block,一个位于开头,作为最初也是最大的block,另一个位于结尾,是哨兵block
    • 将开头的那个block插入(头插)空闲链表

在这里插入图片描述

实例

  printf("Main Start!\n");
  // tlsf_destroy(tlsf);
  tlsf = tlsf_create_with_pool(0x13000000, 128 * 1024);
  char *name = tlsf_malloc(tlsf, 100);
  printf("name= %p\n ", name);
  for (int i = 0; i < 100; i++) {

    name[i] = i;
    printf("%d = 0x%x, ", i, name[i]);
  }
  printf("\n over \n");
  tlsf_free(tlsf, name);
  lv_tlsf_destroy(tlsf);

参考:
1、https://blog.csdn.net/gzxb1995/article/details/124504705
2、https://www.jianshu.com/p/01743e834432

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
TLSF(Two-Level Segregated Fit)内存分配算法是一种通用的动态内存分配算法,专门设计用于满足实时要求。它具有以下特点: 1. 算法复杂度为O(1):TLSF算法通过使用两级位图和分级空闲块链表数据结构来管理动态内存池和其中的空闲块。这种设计使得malloc、free、realloc和memalign等操作的时间复杂度都为O(1),即常数时间。 2. 低碎片化:TLSF算法采用Good-Fit的策略进行内存分配,即选择最合适大小的空闲块进行分配。这样可以减少内存碎片化,提高内存利用率。 3. 支持动态添加和删除内存池区域:TLSF算法支持在运行时动态地增加或删除多块不连续的内存,将它们作为一个内存堆使用。这种灵活性使得TLSF算法适用于各种内存管理场景。 下面是一个使用TLSF内存分配算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include "tlsf.h" int main() { // 创建一个TLSF内存池 void* pool = malloc(1024 * 1024); // 分配1MB的内存作为内存池 tlsf_pool tlsf = tlsf_create_with_pool(pool, 1024 * 1024); // 分配内存 void* ptr1 = tlsf_malloc(tlsf, 100); // 分配100字节的内存 void* ptr2 = tlsf_malloc(tlsf, 200); // 分配200字节的内存 // 使用分配的内存 sprintf(ptr1, "Hello"); sprintf(ptr2, "World"); // 打印分配的内存 printf("ptr1: %s\n", (char*)ptr1); printf("ptr2: %s\n", (char*)ptr2); // 释放内存 tlsf_free(tlsf, ptr1); tlsf_free(tlsf, ptr2); // 销毁TLSF内存池 tlsf_destroy(tlsf); // 释放内存池 free(pool); return 0; } ``` 这段代码演示了如何使用TLSF内存分配算法进行内存分配和释放。首先,我们创建一个TLSF内存池,并使用tlsf_malloc函数分配内存。然后,我们使用分配的内存进行操作,并最后使用tlsf_free函数释放内存。最后,我们销毁TLSF内存池并释放内存池
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

li星野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值