2021SC@SDUSC TencentOS Tiny源码分析(十三)动态内存管理机制模块二

2021SC@SDUSC


上周我们学习了TencentOS Tiny中的第一种 动态内存的管理机制–TLSF算法,并且看了其在TencentOS Tiny中的两个简单API的实现,本周我们就分析 第二种动态内存的管理机制–静态内存池管理算法

一. 静态内存池管理算法

静态内存池就是将一块内存划分为n个大小相等的块,用户可以动态的申请、释放一个块,表面上的体现就是在使用动态内存

内存池(Memory Pool)是一种用于分配大量大小相同的小对象的技术。它可以极大加快内存分配/释放的速度。

内存池在创建时先向系统申请一大块内存,然后分成同样大小的多个小内存块,小内存块直接通过链表连接起来(此链表也称为空闲链表,和TLSF中的空闲块链表类似)。每次分配的时候,从空闲链表中取出链头上第一个内存块,提供给申请者。物理内存中允许存在多个大小不同的内存池,每一个内存池又由多个空闲内存块组成,内核用它们来进行内存管理。

内核是如何管理内存池的呢?当一个内存池对象被创建时,内存池对象就被分配给了一个内存池控制块,内存控制块的参数包括内存池名,内存缓冲区,内存块大小,块数以及一个等待线程队列。

内核负责给内存池分配内存池对象控制块,它同时也接收用户线程的分配内存块申请,当获得这些信息后,内核就可以从内存池中为内存池分配内存。内存池一旦初始化完成,内部的内存块大小将不能再做调整。

这个算法的基本思想还是比起TLSF更显简单,但是其仍然具有广泛的应用和重要性,下面我们直接来看TencentOS Tiny中是如何实现静态内存池管理算法的:

二. TencentOS Tiny中静态内存池管理算法的实现

在TencentOS Tiny中关于静态内存池管理,一共有四个基本的API,分别是内存池的创建、销毁,从内存池中申请、放回一个空闲块;以及两个更高级的API,分别是内存池的动态创建和销毁,这里我们只分析四个基础API的实现

(一)创建内存池

TencentOS-tiny中静态内存池管理算法的实现在tos_mmblk.htos_mmblk.c中。我们首先来看内存池的创建

__API__ k_err_t tos_mmblk_pool_create(k_mmblk_pool_t *mbp, void *pool_start, size_t blk_num, size_t blk_size)
{
   
    uint32_t    i;
    void       *blk_curr, *blk_next;

    TOS_IN_IRQ_CHECK();
    TOS_PTR_SANITY_CHECK(pool_start);

    if (((cpu_addr_t)pool_start & K_MMBLK_ALIGN_MASK) != 0u) {
   
        return K_ERR_MMBLK_INVALID_POOL_ADDR;
    }

    if ((blk_size & K_MMBLK_ALIGN_MASK) != 0u) {
   
        return K_ERR_MMBLK_INVALID_BLK_SIZE;
    }

  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值