内存管理笔记

news2024/9/20 18:53:09

1、内存管理简介

在计算机系统中,变量、中间数据一般存放在系统存储空间中,只有在实际使用时才将它们从存储空间调入到中央处理器内部进行运算。通常存储空间可以分为两种:内部存储空间和外部存储空间。内部存储空间访问速度比较快,能够按照变量地址随机地访问,也就是我们通常所说的RAM(随机存储器),或电脑的内存;而外部存储空间内所保存的内容相对来说比较固定,即使掉电后数据也不会丢失,可以把它理解为电脑的硬盘。

我们主要讨论内部存储空间(RAM)的管理--内存管理。

在嵌入式程序设计中内存分配应该是根据所设计系统的特点来决定选择使用动态内存分配还是静态内存分配算法,一些可靠新要求非常高的系统应选择使用静态的,而普通的业务系统可以使用动态来提高内存使用效率。静态可以保证设备的可靠性但是需要考虑内存上线,内存使用效率低,而动态则是相反。

FreeRTOS内存管理模块管理用于系统中内存资源,他是操作系统的核心模块之一。主要包括内存的初始化、分配以及释放。

除了FreeRTOS提供的动态内存管理方法,标准的C库也提供了函数malloc()和函数free()来实现动态地申请和释放内存,那为啥不用标准的C库自带的内存管理算法呢?

因为标准C库的动态内存管理方法有如下几个缺点:

(1)占用大量的代码空间,不适合用在资源紧缺的嵌入式系统中。

(2)没有线程安全的相关机制。

(3)运行有不确定性,每次调用这些函数时花费的时间可能都不相同。

(4)内存碎片化。

因此,FreeRTOS提供了多种动态内存管理的算法,可针对不同的嵌入式系统。

2、FreeRTOS内存管理算法

heap_1内存管理算法

heap_1只实现了pvPortMalloc,而没有实现vPortFree;也就是说,它只能申请内存,无法释放内存。

如果你的工程,创建好的任务、队列、信号量等都不需要被删除,那么可以使用heap_1内存管理算法。

heap_1的实现最为简单,管理的内存堆是一个数组,在申请内存的时候,heap_1内存管理算法只是简单地从数组中分出合适大小的内存,内存堆数组的定义如下所示:

heap_2内存管理算法

 相比于heap_1内存管理算法,heap_2内存管理算法使用最适应算法,并且支持释放内存;

heap_2内存管理算法并不能将相邻的空间内存块合并成一个大的空间内存块;因此heap_2内存管理算法不可避免地会产生内存碎片

最适应算法:
假设heap有三块空闲内存(按内存块大小由小到大排序):5字节、25字节、50字节。

现在就创建一个任务需要申请20字节的内存。

第一步:找出最小的、能满足pvPortMalloc的内存:25字节。

第二步:把它划分为20字节、5字节;返回这20字节的地址,剩下的5字节仍然是空闲状态,留给后续的pvPortMalloc使用。

heap_4内存管理算法

heap_4内存管理算法使用了首次适应算法,也支持内存的申请与释放,并且能够将空闲且相邻的内存进行合并,从而减少内存碎片化的现象。

首次适应算法:

假设heap_4有3块空闲内存(按内存块地址由低到高排序):5字节、50字节、25字节。

现在创建一个任务需要申请20字节的内存。

第一步:找出第一个能满足pvPortMalloc的内存:50字节。

第二步:把它划分为20字节、30字节;返回这20字节的地址,剩下30字节仍然是空闲状态,留给和后续的pvPortMalloc使用。

heap_5内存管理算法

heap_5内存管理算法是在heap_4内存管理算法的基础上实现的,但是heap_5内存管理算法在heap_4内存管理算法的基础上实现了管理多个非连续内存区域的能力

heap_5内存管理算法默认并没有定义内存堆,需要用户手动指定内存区域的信息,对其进行初始化。

如何定义一块内存?

使用如下结构体:

怎么指定多块且不连续的内存?

3、内存管理相关API函数

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

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

相关文章

【Redis】缓存(上)

为什么要使用缓存? 在日常开发中,通常使用Redis来做MySQL的缓存。究其原因,首先,根据二八定律,20%的数据可以应对80%的请求;其次,对于MySQL这样的关系型数据库来说,性能普遍都不是很…

复习:存储类别内存分配动态分配内存

目录 存储类别说明符 自动变量(auto) 寄存器变变量(register) 块作用域的静态变量(static) 外部链接的静态变量(external) 内存分配 概念回顾 动态分配内存 malloc函数 free函数 回…

若依框架(前后端分离)增加手机号验证码登录

这篇文章主要介绍了如何在若依架(前后端分离)版本中集成短信验证码登录功能。文章内容包括了前后端的详细实现步骤,并通过代码示例展示了如何生成验证码、验证验证码、验证码登录、自定义的认证处理等功能的实现。 前端部分: 登录界面改造:在现有的登录界面上增加短信验证…

Spring Boot集成google Authenticator实现mfa

1.什么时候mfa? 多重身份验证(MFA)是多步骤的账户登录过程,它要求用户输入更多信息,而不仅仅是输入密码。例如,除了密码之外,用户可能需要输入发送到其电子邮件的代码,回答一个秘密…

GoodSync - 本地云端备份同步工具

最近几年各种加密勒索软件层出不穷,个人数据受到威胁。如何让风险降到最低?养成好的备份习惯就很重要。 GoodSync 就是你值得信赖的同步备份工具,能够实现多合一管理网盘、文件安全备份或同步。 文件同步、备份好助手 要在多种设备中同步文…

9.1centos安装postgres

目录 一、安装并启动postgres 二、设置允许远程连接 三、重置密码 四、开放防火墙端口 五、重启服务后进入命令行模式 六、远程连接 一、安装并启动postgres # Install the repository RPM: sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpm…

用Python实现时间序列模型实战——Day 7: ARIMA 模型的诊断与调整

一、学习内容 1. 残差分析与模型诊断 残差分析: 在 ARIMA 模型拟合之后,我们需要检查模型残差是否满足白噪声的假设。如果模型残差表现为零均值、方差恒定且无自相关性,这说明模型已经捕捉了时间序列中的主要结构,剩下的残差是…

jarbas 靶机渗透(cms 渗透)

靶机信息 vulnhub 靶机 主机发现 (base) ┌──(root㉿kali)-[/home/kali/testJarbas] └─# sudo nmap -sn 192.168.50.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-28 15:45 CST Nmap scan report for 192.168.50.1 Host is up (0.00023s latency). MAC …

职场真相:在草台班子中寻找自我价值

在踏入社会的那一刻起,我们每个人都怀揣着对未来的无限憧憬与梦想,渴望在职场这个广阔的舞台上绽放光彩。然而,现实往往比理想骨感得多,尤其是在初入职场的几年里,那些曾经以为的“精英团队”、“完美计划”逐渐被现实…

如何选到好的宠物空气净化器,用哪款宠物空气净化器比较好?

在当今社会,养宠物已成为许多家庭不可或缺的一部分,猫猫狗狗以其独特的魅力,悄然融入了我们的生活,成为了家中的一员,它们不仅带来了无尽的欢笑与陪伴,更在无形中丰富了我们的情感世界,让家充满…

【Python】如何使用pip,安装第三方库和生成二维码、操作Excel

文章目录 第三方库使用 pip安装第三方库 生成二维码1. 确定使用哪个库2. 查看对应文档3. 开始操作 操作 Excel1. 安装 xlrd2. 编写代码 第三方库 第三方库就是别人已经实现好了的库,我们可以拿过来直接使用 虽然标准库已经很强大了,但是终究是有限的&am…

QT线程同步

#线程同步 在前面理解了QThread两种使用方法,和线程机制以及退出过程后,需要了解线程同步的内容了,今天开启学习线程同步知识。 还是从大佬的文章开始。 从下面这篇文章开始学习 线程同步 线程同步有: QMutex(互斥&…

【PID系列】一文理解PID原理

【PID系列目录】 [1、一文理解PID原理] 2、PID代码设计 本文目录 1、引出2、 PID概念2.1 首先,什么是偏差呢?2.2 其次,什么是PID比例项?2.3 积分————解决稳态误差的利器2.4  微分————改善动态响应…

while (r > b[i].r) del(a[r--]); while (r < b[i].r)

论 分治 cdq | [SDOI2011] 拦截导弹 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度、并且能够拦截任意速度的导弹,但是以后每一发炮弹都不能高于前一发的高度…

利用深度学习实现验证码识别-2-使用Python导出ONNX模型并在Java中调用实现验证码识别

1. Python部分:导出ONNX模型 首先,我们需要在Python中定义并导出一个已经训练好的验证码识别模型。以下是完整的Python代码: import string import torch import torch.nn as nn import torch.nn.functional as FCHAR_SET string.digits# …

静态库和共享库

文章目录 库的概念函数库库函数静态库的创建与使用静态库的概念静态库的创建代码示例--静态库的创建和使用 共享库的创建和是使用共享库的概念共享库的创建共享库的使用 总结 库的概念 当进行编辑C代码的时候常常会用到printf函数,这个函数被声明在stdio.h头文件中…

企业内部通信软件:打造高效协同办公的IM即时通讯工具

在现代企业中,高效的内部通信和协同办公是保持竞争优势的重要因素。为了实现团队间的快速沟通和协作,许多企业采用了企业内部通信软件,其中包括IM即时通讯工具。本文将探讨企业内部通信软件的重要性以及如何利用IM即时通讯工具打造高效协同办…

Clickhouse 为什么这么快

Clickhouse 的缘起 Clickhouse 最初是为 Yandex.Metrica 这个世界上第二大的Web分析平台开发的,并且一直是这个系统的核心组件。ClickHouse在Yandex.Metrica中的主要任务是使用非聚合数据在在线模式下构建报告,使用374台服务器组成的集群,在…

服务器间进行文件传输-SFTPSCP一篇搞定

1.简单介绍一下 在一些特殊场景,两台服务器之间需要进行文件传输的时候,或许我们会想到FTP,这也是我们常见的实现方式,但是如果我们不能操作远程服务器,无法判断远程服务器是否安装了FTP呢,众所周知&#…

学习周报-2024.8.31

目录 摘要 Abstract 创新点总结 模型数学原理 实验设置 一、验证实验 二、对比实验 摘要 这周重新梳理出论文的三个创新点,对所提出方法进行数学原理验证,证明其可行性。重新设置了实验部分,分为验证实验和对比实验,一共四…