轻量级操作系统FreeRTOS的内存管理机制(二)

  本文由嵌入式企鹅圈原创团队成员朱衡德(Hunter_Zhu)供稿.

  上一篇文章中介绍了FreeRTOS多种内存管理机制中最简单的一种:全局声明一个静态数组ucHeap,然后通过指针偏移记录空间的分配情况,在这种内存机制下无法对内存进行释放。同时也介绍了内存操作过程中字节对齐的细节,本篇文章将会对FreeRTOS源码中第二种内存管理机制heap2.c进行讲解,在heap2.c中同样使用一个全局静态数组ucHeap来表示内存,heap2.c内存管理机制较heap1.c而言增加了内存释放的功能,通过使用链表对内存进行有效管理。

一、BlockLink_t结构体和链表

  在hesp2.c中引入了一个重要结构体:

  BlockLink_t结构体用来描述一块空闲空间的信息,它放在空闲块中的前面部分,xBlockSize表示空闲块空间的大小,空间中供程序用的大小为:xBlockSize-sizeof(BlockLink_t)。

  描述空闲块信息的所有BlockLink_t结构体根据xBlockSize按小到大连接成链表。在heap2.c中,这个链表的开头和结尾节点分别是xStart和xEnd,初始化时heap2.c中的链表结构如下:

  初始状态下,链表中只有3个节点,xStart是链表的头节点;第二个节点位于内存实际有效分配空间的前面部分,这个BlockLink_t结构体描述了实际有效分配空间的信息,如这里xBlockSize的值为configADJUSTED_HEAP_SIZE,即初始时整块可用空间的大小;最后一个节点为xEnd,它的下一个节点指向NULL,xBlockSize值设置为configADJUSTED_HEAP_SIZE是因为链表是按xBlockSize大小进行排序的。

二、内存分配策略

  heap2.c内存分配的整体思路是:空闲块通过链表结构进行管理,当需要分配一块内存时,遍历链表(链表中的节点已经按空闲块大小进行排序),找到第一块够大的空闲块进行分配,从链表中移除出来,同时检查这块空间是否过大,如果过大就将空闲块进行切割,然后将剩下部分重新用BlockLink_t描述并插入到链表中。

  下图是应用程序请求分配8个字节空间后的链表和内存空间结构示意图:

  pvPortMalloc()核心代码:

三、内存回收机制

  heap2.c内存回收的整理思路:根据应用程序提供的空间地址,基于这个地址加上sizeof(BlockLink_t)字节偏移可以得到原来空闲块的首地址,然后再将空闲块的BlockLink_t结构体按小到大的顺序插入到空闲块链表中。

  下面两图表示了程序释放8字节空间后的链表和内存空间结构示意图:

   下图展示了经过多次内存分配和回收后的链表和内存空间结构示意图:

  vPortFree()核心代码:

  可以看出,heap2.c虽然支持内存回收,但是回收内存时不进行相邻空闲块的合并,因此这种策略会导致内存碎片,系统运行久了会出现无法分配过大的连续空间的情况,heap4.c中内存管理机制就是为了弥补这种缺陷而诞生的,它在heap2.c的基础上增加了连续空闲块合并的功能,下一篇会继续进行分析。

时间: 2025-01-15 23:24:10

轻量级操作系统FreeRTOS的内存管理机制(二)的相关文章

轻量级操作系统FreeRTOS的内存管理机制(三)

本文由嵌入式企鹅圈原创团队成员朱衡德(Hunter_Zhu)供稿. 轻量级操作系统FreeRTOS的内存管理机制(二)中讲到,heap2.c的内存管理机制会导致内存碎片的问题,系统运行久后会出现无法分配大块内存的情况,heap4.c中的管理机制提供了解决方法,它是在heap2.c的基础上添加了地址相邻空闲块间合并的功能,而heap5.c是对heap4.c的进一步扩展,它能够支持多块不连续分布的RAM空间作为堆使用,本篇将对heap4.c.heap5.c中的管理机制进行分析. 一.heap4.c

轻量级操作系统FreeRTOS的内存管理机制(一)

本文由嵌入式企鹅圈原创团队成员朱衡德(Hunter_Zhu) 近几年来,FreeRTOS在嵌入式操作系统排行榜中一直位居前列,作为开源的嵌入式操作系统之一,它支持许多不同架构的处理器以及多种编译工具链,具有轻量级.容易移植和使用的特点.本篇文章将会对FreeRTOS提供的几种内存分配策略进行介绍,FreeRTOS允许开发者根据自己的项目实际需要选择不同的内存分配策略或者自定义分配内存策略. 一.FreeRTOS内存分配源码 FreeRTOS在创建任务.队列.互斥量.信号量.软件定时以及事件组的时

操作系统 内存管理机制

参考和查阅了一下他人的资料,整理下 虚拟内存.物理内存.Swap分区.页面置换机制等基础知识 虚拟地址空间 与 物理地址空间的关系 虚拟地址由操作系统维护,由MMU可以进行转换,扩大了内存空间分页管理. 大多数使用虚拟存储器的系统都使用一种称为分页(paging)机制. 虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页帧(frame),一个在磁盘,一个在内存,页和页桢的大小必须相同.在32位地址的机器,它的虚拟地址范围从0~0xFFFFFFFF(4G),而这

c+内存管理机制

内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的 检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过 的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能.本期专题 将从内存管理.内存泄漏.内存回收这三个方面来探讨C++内存管理问题.

Linux内存管理机制

一.首先大概了解一下计算机CPU.Cache.内存.硬盘之间的关系及区别. 1.  CPU也称为中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路, 是一台计算机的运算核心(Core)和控制核心( Control Unit).它的功能主要是解释计算机指令以及处理计算机软件中的数据.中央处理器主要由三核心部件组成,运算器.控制器和总线(BUS),运算器又主要由算术逻辑单元(ALU)和寄存器(RS)组成. 2.Cache即高速缓冲存储器,是位于CPU与主内存

[转载] python的内存管理机制

本文为转载,原作为http://www.cnblogs.com/CBDoctor/p/3781078.html,请大家支持原作者 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值.对Python语言来讲,对象的类型和内存都是在运行时确定的.这也是为什么我们称Python语言为动态类型的原因(这里我们把动态类型可以简单的归结

【Java深入研究】3、JVM内存管理机制

转自:http://blog.csdn.net/lengyuhong/article/details/5953544 近期看了看Java内存泄露的一些案例,跟原来的几个哥们讨论了一下,深入研究发现JVM里面还是有不少以前不知道的细节,这里稍微剖析一下.先看一看JVM的内部结构-- 如图所示,JVM主要包括两个子系统和两个组件.两个子系统分别是Class loader子系统和Execution engine(执行引擎) 子系统:两个组件分别是Runtime data area (运行时数据区域)组

memcached内存管理机制详解

    我们知道,memcached是一个内存缓存系统,因此对于内存的管理是需要使用者了解的.本文将对memcached的内存模型及管理机制做一个详细的描述. 基本概念 在开始之前,有必要先了解几个基本概念: 1.slab class:在memcached中,对元素的管理是以slab为单元进行管理的.每个slab class对应一个或多个空间大小相同的chunk.参考下图一. 2.chunk:存放元素的最小单元.用户数据item(key.value等)最终会保存在chunk中.memcach

python的内存管理机制

先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值.对Python语言来讲,对象的类型和内存都是在运行时确定的.这也是为什么我们称Python语言为动态类型的原因(这里我们把动态类型可以简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值). 二.引用计数: Python采用了类似Windows内核对象