freertos入门---堆的概念

freertos入门—堆的概念

  堆就是一块空闲的内存。下面举个例子更好的理解堆的概念:
  堆是一块空闲的内存,我们可以定义一个数组char heap_buf[1024],可以看到该数组就是一个空闲的内存,我们只需要在它上面实现内存的分配和释放那么它就一个堆。

char heap_buf[1024];

  接下来我们实现一个简单的函数:

int pos = 0;
void *my_malloc(int size)
{int old_pos = pos;pos += size;return &heap_buf[old_pos];
}

  我们定义的malloc函数比较简单,它做的就是在一个 buf 中分配一个小块的内存,它的下标是从0到1023,一开始pos = 0,我们想来分配size大小的空间,malloc函数首先将 old_pos 的地址返回,然后 pos 等于原来的位置加上 size。
在这里插入图片描述
  当我们在空闲的内存上实现 malloc函数时,这块空闲的内存就被称为堆,我们使用一个整数表示空闲内存的位置,使用这种最简单的方式我们没有办法实现 free 函数。
  我们可以在主函数中测试 malloc 函数,测试代码如下:

int main(void)
{int i;char *buf = my_malloc(100);for(i = 0; i < 26; i++)buf[i] = 'A' + i;
}

  对代码进行调试,可以看到已经成功分配了 buf 以及在 buf 中填充数据。
在这里插入图片描述
  那么上述的 malloc 函数不能有对应得 free 函数呢?一开始我们在堆中分配了100字节。
在这里插入图片描述
  接下来我们想再次分配100字节。
在这里插入图片描述
  若是我们调用 my_free(buf) ,my_free 函数根据 buf 的地址并不知道释放多大的内存。所以对于我们上述所写的简单的 malloc 函数,并没有办法实现对应的 free 函数,那么一般的堆管理函数又是如何实现堆的释放的呢?
  比如说,我们要执行 char *buf = my_malloc(100); 它并不是分配100字节的空间,而是分配一个头部加上100字节的空间给我们,但是它返回的时候是返回头部之后实际能存储数据的位置。在这个头部中就有保留有分配大小,若是我们以后想要调用 free(buf),free 函数会根据 buf 的地址找到头部,在头部中读取分配的数值,就知道了需要释放的内存有多大。一般的堆管理都是这样的,它并不是简单的分配100字节的内存,它还会分配一个头部。
在这里插入图片描述

  接下来对堆管理函数进行扩展讲解一下,假设在一块内存上我们分配了若干次:
在这里插入图片描述
  若是我们想要释放 buf2 ,那么这一块区域则变为空闲的内存,之前遗留下来的内存也是空闲的,那么我们怎样才能管理这些隔离开的空闲区域呢,这必定会引入链表。
在这里插入图片描述
  这个链表我们如何表示呢?我们可以定义一个struct head :

struct head
{int size;struct head *next_free;
}

  有了这个链表头后,我们就可以管理这些空闲的 buf 了,比如说我们定义一个全局变量 struct head g_heap,初始情况下我们如下1024字节的内存,那么链表头 g_heap 则为:
在这里插入图片描述
  一开始我们的全局变量的 size 为0,但是它会指向下一个头部。下一个头部的 size 等于1024,表示从这个头部开始,空闲的大小是1024;它的 next_free = NULL,表示没有下一个块了。
在这里插入图片描述

  若是我们想分配100字节的内存,分配内存时会从 g_heap.next_free 中找到下一个空闲的内存,下一个空闲内存的大小为1024,我们需要从这一块空间中挖出100字节以及头部,发现1024大于108则进行拆分,拆分之后就得到两个部分:分配部分和空闲部分。在空闲部分的头部还会构造一个信息,size = 1024-108以及next_heap = null。此外,全局变量的 size = 0,next_free也发生变换,如下所示:
在这里插入图片描述

  假设我们再来分配50字节内存,我们先从全局链表中找到 next_free ,发现它的大小是超过58的,那我们继续分配,分配结果如下所示:
在这里插入图片描述
  分配完成后,我们若是想释放 buf ,释放时根据 buf 找到头部,头部里面表示这块空间是100字节,那么加上头部就是108字节,我们若是想要释放这块空间就需要将这块空闲的空间加入到这个链表中,如下图所示,空闲空间的 next_free 指向释放的空间。
在这里插入图片描述
  以后我们想要申请内存的时候,从 g_heap 中找到第一个块,若是第一个块内存不够的话,我们就可以从这个链表这里找到第二个块,第二个块够的话进行分配,不够的话失败。
  堆的管理还有很多种实现,我们只是演示了一种最常见的做法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/64618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统(17)文件和文件系统

一、文件 定义&#xff1a;文件是数据的有序集合&#xff0c;是用户存储信息于辅存的基本逻辑单位。文件可以是字符流构成的无结构文件&#xff0c;也可以是包含相似记录的结构化文件。 类型&#xff1a; 按性质和用途&#xff1a;系统文件&#xff08;由系统软件构成的文件&a…

ASP.NET|日常开发中读写TXT文本详解

ASP.NET&#xff5c;日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用StreamReader类 二、写入 TXT 文本2.1 使用StreamWriter类 三、文件编码问题3.1 常见编码格式 四、错误处理和性能考虑4.1 错误处理4.2 性能考虑 结束语优质源码分享 ASP.NET&#xff5c;日常开发中…

notepad++快捷键-多行编辑中如何使所有行的光标都向后移动一个单词的长度(每行单词长度不一定一致)

问题&#xff1a;在使用notepad进行多行编辑&#xff08;多行光标移动一个单词长度&#xff09;时&#xff08;将下图由左边变为右边&#xff09;&#xff0c;在使用Ctrl左键拖拽选中多行后&#xff0c;想要将每行的光标向后移动一个单词的长度&#xff08;每行的单词长度不一样…

【IC】Hybrid Bonding技术

从纳米到埃米&#xff0c;芯片制造商正在竭尽全力缩小电路的尺寸。但面对算力需求的激增&#xff0c;一项涉及更大尺寸&#xff08;数百或数千纳米&#xff09;的技术——混合键合&#xff08;Hybrid Bonding&#xff09;——将在未来五年内扮演重要角色。近日&#xff0c;IEEE…

洛谷 B3643 图的存储 C语言

题目&#xff1a;https://www.luogu.com.cn/problem/B3643 题目描述 给定一个 n 个顶点 m 条边的无向图。请以邻接矩阵和邻接表的形式输出这一张图。 输入格式 第一行输入两个正整数 n 和 m&#xff0c;表示图的顶点数和边数。 第二行开始&#xff0c;往后 m 行&#xff0…

MATLAB里面,try-catch-end系列语言的含义与用法(含例程)

在 MATLAB 中&#xff0c;try-catch-end 语句用于处理可能会引发错误的代码。它允许你在“尝试”部分执行代码&#xff0c;如果代码执行过程中发生错误&#xff0c;将转到“捕获”部分执行相应的处理。这种错误处理机制可以提高程序的健壮性&#xff0c;避免因小错误导致整个程…

Python练习之列表的使用

&#xff08;搭配主页知识点&#xff09; 【练习要求】 针对知识点列表定义、追加、列表元素读取、查找安排的本实例。要求实现&#xff1a;有一个列表&#xff0c;内容是:[21,25,21,23,22,20]&#xff0c;记录的是一批学生的年龄请通过列表的功能(方法)&#xff0c;对其进行…

安装虚拟机(VMware)教程+win7

VMware 一.下载VMware Wworkstation Pro二、安装VMware三、安装虚拟机 一.下载VMware Wworkstation Pro 1.去vmware官网下载 官网 2.网盘下载 通过网盘分享的文件&#xff1a;vmware 链接: https://pan.baidu.com/s/1bOff79NFAmDlISQo6LK6PQ?pwdhunr 提取码: hunr --来自百…

C语言总共n位数,将后面的K个数与前面的数对调位置,前后二部分的数字顺序不变

例如&#xff1a;n5&#xff0c;k2&#xff0c;要处理的数字是12345&#xff0c;则处理后变成45123 这个问题可以通过以下步骤解决&#xff1a; 确定前后两部分的分界点。 对前后两部分分别进行反转。 以下是一个简单的C语言示例代码&#xff1a; #include<stdio.h>…

C# Winform双色纸牌接龙小游戏源码

文章目录 一、设计来源双色纸牌接龙小游戏讲解1.1 主界面1.2 游戏界面1.3 游戏界面快成功了 二、效果和源码2.1 动态效果2.2 源代码 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/144419994 …

无人机航测系统技术特点!

一、无人机航测系统的设计逻辑 无人机航测系统的设计逻辑主要围绕实现高效、准确、安全的航空摄影测量展开。其设计目标是通过无人机搭载相机和传感器&#xff0c;利用先进的飞行控制系统和数据处理技术&#xff0c;实现对地表信息的全方位、高精度获取。 需求分析&#xff1…

分割双声道音频-Audacity和ffmpeg

双声道音频资源&#xff1a; https://download.csdn.net/download/yudelian/90135217 1、ffmpeg分割双声道音频 ffmpeg -i input.wav -map_channel 0.0.0 left.wav -map_channel 0.0.1 right.wav 2、audacity分割双生音频并且播放 选择分离立体声轨 可以看出分离出了两个音频…

以太网帧、IP数据报图解

注&#xff1a;本文为 “以太网帧、IP数据报”图解相关文章合辑。 未整理去重。 以太网帧、IP数据报的图解格式&#xff08;包含相关例题讲解&#xff09; Rebecca.Yan已于 2023-05-27 14:13:19 修改 一、基础知识 UDP 段、IP 数据包&#xff0c;以太网帧图示 通信过程中&…

docker简单命令

docker images 查看镜像文件 docker ps -a 查看容器文件 docker rm 0b2 删除容器文件&#xff0c;id取前三位即可 docker rmi e64 删除镜像文件&#xff08;先删容器才能删镜像&#xff09;&#xff0c;id取前三位即可 在包含Dockerfile文件的目录…

自然语言处理:我的学习心得与笔记

Pytorch 1.Pytorch基本语法 1.1 认识Pytorch 1.2 Pytorch中的autograd 2.Pytorch初步应用 2.1 使用Pytorch构建一个神经网络 2.2 使用Pytorch构建一个分类器 小节总结 学习了什么是Pytorch. 。Pytorch是一个基于Numpy的科学计算包,作为Numpy的替代者,向用户提供使用GPU强大…

‌HBase是什么,‌HBase介绍

‌官方网站&#xff1a;Apache HBase – Apache HBase Home HBase是一个分布式的、面向列的NoSQL数据库&#xff0c;主要用于存储和处理海量数据。‌它起源于Google的​​​​​​​BigTable论文&#xff0c;是Apache Hadoop项目的子项目。HBase设计用于高可靠性、高性能和可伸…

Pytorch | 从零构建AlexNet对CIFAR10进行分类

Pytorch | 从零构建AlexNet对CIFAR10进行分类 CIFAR10数据集AlexNet网络结构技术创新点性能表现影响和意义 AlexNet结构代码详解结构代码代码详解特征提取层 self.features分类部分self.classifier前向传播forward 训练过程和测试结果代码汇总alexnet.pytrain.pytest.py CIFAR1…

c语言-----数组

基本概念 数组是C语言中一种用于存储多个相同类型数据的数据结构。这些数据在内存中是连续存储的&#xff0c;可以通过索引&#xff08;下标&#xff09;来访问数组中的各个元素。数组的索引从0开始&#xff0c;这是C语言的规定。例如&#xff0c;一个有n个元素的数组&#xff…

【最新攻略】腾讯云双十一最强攻略密码

引言一起来薅羊毛准备工作双人成团PK有大礼! 福利总结 引言 腾讯云&#xff08;Tencent Cloud&#xff09;想必大家都听说过吧&#xff1f;腾讯云是腾讯提供的“云计算”服务。你可以把它想成一个超级强大的网络平台&#xff0c;帮助公司和开发者把自己的技术、数据、网站等东西…

【C#】List求并集、交集、差集

值类型List List<int> intList1 new List<int>() { 1, 2, 3 };List<int> intList2 new List<int>() { 3, 4, 5 };var result intList1.Union(intList2);Console.WriteLine($"并 {string.Join(,,result)}");result intList1.Intersect(in…