TLSF算法1:二级索引的计算

一、什么是TLSF算法

在嵌入式系统中,内存需要在分配和释放时有一个确定的相应时间,才能进一步分析其实时任务的可调度性。因此TLSF算法是一个十分适用嵌入式领域的动态内存分配算法。在关于TLSf算法的经典文章中《TLSF: a New Dynamic Memory Allocator for Real-Time Systems》详细介绍了TLSF算法相关知识。

TLSF算法使用隔离匹配机制来实现良好匹配策略。基本的隔离匹配机制使用一组空闲列表,每个数组都包含一定大小范围内的空闲块。为了加快访问空闲块以及访问管理大量的隔离列表(以减少碎片),列表数组已组织为两个级别数组。一级数组将空闲块划分为类是2的幂(16、32、64、128等);和第二级将每个第一级类别线性划分,划分的数量(简称第二级别索引数,2SLI)是用户可配置的参数。每个数组列表具有关联的位图,用于标记哪些列表是为空,哪些包含空闲块。每个块有关的信息都存储在块本身中。
TLSF空闲块的结构图
在TLSf的结构中,最主要的算法是位的操作,本文重点分析有关位的操作的原理与代码。当系统需要分配一个指定大小为r的内存时,需要计算出相应的两级位图的值,其公式如下所示:
计算公式
为了有一个直观的结果,我们假设SLI=4,即第二级索引将一级的内存块大小范围划分为2∧SLI=16块,则一级索引f=8,二级索引s=12。
示例

二,f的确定

很显然,f的值就是所需内存大小的二进制位的最高非0位的数。首先最简单可以考虑到的就是从低位遍历即可,不断的对r进行”>>”操作,只要r不为0,就不断执行,同时定义一个变量统计移位的次数。但是因为是嵌入式系统,当然不能采用遍历的方法,会导致内存分配的不确定性。

方法一首先考虑折半查找的方式,32位的数字,折半对比5次既可求出f的值。代码参考如下:

int getF1(int r){
   
	int f = 0;
	if(!r){
   
		return 0;
	}
	if(r & 0xffff0000){
   
		r >>= 16;
		f += 16;
	}
	if(r & 0xff00){
   
		r >>= 8;
		f += 8;
	}
	if(r & 0xf0){
   
		r >>= 4; 
		f += 4;
	}
	if(r & 12){
   
		r >>= 2; 
		f += 2;
	}
	if(r & 2){
   
		r >>
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值