58-59-60 - 动态内存分配的实现

news2024/11/24 5:45:17

---- 整理自狄泰软件唐佐林老师课程

文章目录

  • 1. 讨论
  • 2. 动态内存管理
    • 2.1 动态内存管理的关键
    • 2.2 动态内存管理的分类
  • 3. 定长内存管理的设计与实现
    • 3.1 空间划分
    • 3.2 内存申请和归还
    • 3.3 关键数据类型
    • 3.4 思考
  • 4. 变长内存管理的设计与实现
    • 4.1 空间划分
    • 4.2 内存申请和归还
    • 4.3 关键数据类型&初始化
    • 4.4 编程实验:变长内存管理
  • 5. 问题
    • 5.1 D.T.OS中的策略
    • 5.2 D.T.OS架构图
    • 5.3 D.T.OS内存布局
    • 5.4 编程实验:D.T.OS中的动态内存分配
  • 6. 扩展讨论
  • 7. 小结

1. 讨论

  • 开发操作系统不能使用malloc()动态内存分配吗?
    • 不是不能,而是没有!malloc()作为系统函数需要实现才能有,目前的D.T.OS还没有实现
  • 那么如何 实现malloc() 呢?
    • 动态内存管理的本质 是一个算法设计问题

2. 动态内存管理

  • 根据需要分配内存和回收内存
    通常在一块较大且连续的内存空间上进行分配和回收
  • 动态内存管理解决的问题
    内存资源稀缺,通过内存复用增加任务的并发性
  • 动态内存管理的本质
    时间换空间,通过动态分配和回收 “扩大” 物理内存

2.1 动态内存管理的关键

  • 时间效率
    从发出内存申请到获得内存的时间越短越好
  • 空间效率
    为了管理内存而占用的内存越少越好
  • 碎片化
    最大可分配内存占空闲内存总和的比例越大越好

2.2 动态内存管理的分类

  • 定长内存管理
    将内存分为大小相同的单元,每次申请一个单元的内存
  • 变长内存管理
    每次申请需要的内存(大小不固定,以字节为单位)

3. 定长内存管理的设计与实现

3.1 空间划分

将内存分为两部分:管理单元 & 分配单元

  • 管理单元与分配单元一一对应

在这里插入图片描述

  • 将管理单元组织成链表(定长内存管理链表)
  • 管理内存时操作链表头

3.2 内存申请和归还

  • 申请内存
    • 从链表头获取一个管理单元,并计算下标
    • 根据下标计算分配单元的内存起始地址
  • 归还内存
    • 计算分配单元的下标,并将对应下标的管理单元插入链表

3.3 关键数据类型

在这里插入图片描述

在这里插入图片描述

  • void FMemInit(byte* mem, uint size)
    • 初始化内存管理,从mem中构建管理单元和分配单元

在这里插入图片描述
在这里插入图片描述

  • void* FMemAlloc()
    • 动态申请 一个内存单元,失败时返回NULL
  • int FMemFree(void* ptr)
    • 归还申请的单元,成功时返回1,失败时返回0

【参看链接】:58-59-60 - 动态内存分配的实现 / 58

3.4 思考

  • 定长内存管理能够满足开发需要吗?

4. 变长内存管理的设计与实现

4.1 空间划分

将内存分为三部分:管理头 & 已用区域 & 空闲区域
在这里插入图片描述

  • 管理头:记录已用区域和空闲区域的位置
  • 已用区域:已分配的内存区域(使用中)
  • 空闲区域:可分配的内存区域(空闲)

4.2 内存申请和归还

管理结点构成管理链表:

  • 申请内存
    • 初始时只有一个管理结点(used == 0,free == all)
    • 每次申请时从管理结点查找可用内存(alloc <= free)(alloc包含 管理头的内存申请的内存
    • 划分可用内存成为新的管理结点(used == size,free == 0)
    • 将管理结点组织成管理链表

在这里插入图片描述

  • 归还内存
    • 遍历管理链表,找到对应的目标管理结点
    • 将目标管理结点从管理链表中移除
    • 目标管理结点所占用的内存归入前一个管理结点的空闲区域中(新管理结点是插入在管理链表中部)

4.3 关键数据类型&初始化

管理结点中的管理头:
在这里插入图片描述

  • 初始化管理链表:
    在这里插入图片描述
  • void* VMemAlloc(uint size)
    动态申请size字节内存,失败时返回NULL
  • int VMemFree(void* ptr)
    归还申请的内存单元,成功时返回1,失败返回0

4.4 编程实验:变长内存管理

【参看链接】:58-59-60 - 动态内存分配的实现 / 59

在这里插入图片描述
在这里插入图片描述

5. 问题

  • void* Malloc(uint size) 函数如何具体实现?

5.1 D.T.OS中的策略

  • 内存申请

在这里插入图片描述

  • 内存归还

在这里插入图片描述

5.2 D.T.OS架构图

在这里插入图片描述

5.3 D.T.OS内存布局

在这里插入图片描述

5.4 编程实验:D.T.OS中的动态内存分配

【参看链接】:58-59-60 - 动态内存分配的实现 / 60

在这里插入图片描述
在这里插入图片描述

6. 扩展讨论

  • 变长内存管理法从结点空闲区域的尾部划分内存,为什么?
  • void* Malloc(uint size)函数的效率怎么样?
  • 再回过头考虑:
    • 内存越界运行却没有错,为什么?
    • malloc(0)返回什么,是NULL吗?
    • free(NULL)为什么不会出问题?

7. 小结

  • 动态内存管理是 在一块连续的内存空间上进行分配和回收
  • 动态内存管理通常分为 定长管理法和变长管理法
    • 定长内存管理法高效但不灵活
    • 变长内存管理法灵活但不高效
  • Malloc() / Free()结合使用定长管理法和变长管理法的优势,在效率和灵活性上达到了平衡

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

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

相关文章

802.11 MCS 的最低SNR分析

常常看到这样的表格: 那么这个SNR如何而来? 看看RSSI和SNR的关系,它们之间隔了一个noise floor。从表格看得出,这个底噪在-80~-90之间。 而SNR的核心,也有类似的原因,它和BER有关。

tkinter界面的TCP通信/开启线程等待接收数据

前言 用简洁的语言写一个可以与TCP客户端实时通信的界面。之前做了一个项目是要与PLC进行信息交互的界面&#xff0c;在测试的时候就利用TCP客户端来实验&#xff0c;文末会附上TCP客户端。本文分为三部分&#xff0c;第一部分是在界面向TCP发送数据&#xff0c;第二部分是接收…

【Python从入门到进阶】9、流程控制语句-条件语句(if-else)

接上篇《8、Python的输入输出》 上一篇我们学习了Python的输入和输出相关内容。本篇我们来学习Python的控制流语句。 一、流程控制语句的含义 之前我们分别学习过“变量及数据类型”、“运算符”&#xff0c;其中“变量及数据类型”相当于我们学习自然语言中的“字”&#xf…

【数据库系统概论】基础知识总结

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

Linux基础命令和工具使用详解

Linux基础命令和工具使用详解一、grep搜索字符二、find查找文件三、ls 显示文件四、wc命令计算字数五、uptime机器启动时间负载六、ulimit用户资源七、curl http八、scp远程拷贝九、dos2unix和unix2dos十、sed 行处理10.1、简单模式10.2、替换模式十一、awk 列处理11.1、打印某…

【C++从入门到放弃】类和对象(上)

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《C从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 类和对…

JavaScript 高级1 :面向对象

JavaScript 高级1 &#xff1a;面向对象 Date: January 16, 2023 Text: 面向对象、ES6中类和对象、类的继承、面向对象案例 目标&#xff1a; 能够说出什么是面向对象 能够说出类和对象的关系 能够使用 class 创建自定义类型 能够说出什么是继承 面向对象编程介绍 面向过…

JDK安装指导

Oracle官网地址https://www.oracle.com/java版本查询这里仅标识了java19和java17java archived 查看更多随便进入一个&#xff0c;根据后缀提示下载对应包即可Linux安装&#xff08;示例 java 1.8版本&#xff09;https://www.oracle.com/java/technologies/javase/javase8u211…

基于MaixBit(K210芯片)的图像识别猜拳手势博弈装置

本文介绍了一种基于嵌入式平台开发的图像识别部署装置&#xff0c;其主要功能包括实现机器与人的“猜拳博弈”&#xff0c;其组成分为三个部分&#xff1a;手势检测数据集图像识别模型训练模型格式部署maixbit开发板部署手势检测数据集&#xff1a;本项目的数据集包括三种标签&…

2023自动化测试岗位需求的 7 项必备技能 (最新版)

目录&#xff1a;导读 一、自动化测试员技能——编程语言 二、自动化测试员技能–出色的手动测试技能 三、.自动化测试员技能–自动化工具专业知识 四、自动化测试员技能–了解业务需求 五、自动化测试员技能–自动化工具故障排除 六、自动化测试员技能–具有测试管理工具…

Android 网络框架——Retrofit源码精析

众所周知&#xff0c;Retrofit是OkHttp的封装&#xff0c;APP对网络交互部分的实现基本上都是RxJavaRetrofitOkHttp架构&#xff08;或协程RetrofitOkHttp&#xff09;&#xff0c;可以说&#xff0c;Retrofit已经广为人知。本文主要介绍Retrofit主线源码实现机制&#xff0c;及…

二叉树的前序遍历-java两种方式-力扣144

一、题目描述给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。示例 1&#xff1a;输入&#xff1a;root [1,null,2,3]输出&#xff1a;[1,2,3]示例 2&#xff1a;输入&#xff1a;root []输出&#xff1a;[]示例 3&#xff1a;输入&#xff1a;root [1]输出…

MySQL进阶(二)

目录 1、视图 1、检查选项 2、视图的更新 3、视图作用 2、存储过程 1、语法 2、变量 1、系统变量 2、用户定义变量 3、局部变量 3、if 4、参数 5、case 6、循环 1、while 2、repeat 3、loop 7、游标、条件处理程序 8、存储函数 3、触发器 4、锁 1、全局锁 2、表级锁 …

AIR系列|板载LED|gpio引脚选择|GPIO|流水灯|LuatOS-SOC接口|官方demo|学习(20-1):GPIO库基础

AIR系列各型号开发板板载LED对应管脚及GPIO控制代码 AIR103&#xff1a; rtos_bsp "AIR103" then -- Air103开发板LED引脚编号--return pin.PB26, pin.PB25, pin.PB24return 42,41,40 AIR105&#xff1a; rtos_bsp "AIR105" then -- Air105开发板LED引…

DFT基本入门介绍

1.什么是DFT&#xff1f;2.为什么要做DFT&#xff1f;3.“测试”与“验证”的区别4.DFT的核心技术1&#xff09;扫描路径设计&#xff08;Scan Design&#xff09;2)内建自测试&#xff08;Bist&#xff09;3)JTAG4)ATPG5.DFT工程师的岗位职责随着芯片的制程越来小(5nm), 芯片的…

xxjob分布式任务调度

前言 在工作中使用到了定时任务,通过查找资料选择了xxjob,以下是xxjob的介绍以及基本的使用. xxjob介绍 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 将调度行为抽象形成“调度中心”公共平台&#xff0c;而平台自身…

vue3+rust个人博客建站日记3-编写主页

内容 绘制了主页的基本布局设置了封装了header栏组件并设置了全局黑夜模式. 选择一个组件库-Naive UI 如果没有设计能力&#xff0c;又想开发出风格统一的前端页面。就一定要选择一个漂亮的组件库。 本次项目选择使用Naive UI&#xff0c;NaivUI库曾被Vue框架作者尤雨溪推荐…

【云原生】k8s核心技术—集群安全机制 Ingress Helm 持久化存储-20230222

文章目录一、k8s集群安全机制1. 概述2. RBAC——基于角色的访问控制二、Ingress三、Helm1. 引入2. 使用功能Helm可以解决哪些问题3. 介绍4. 3个重要概念5. helm 版本变化6. helm安装及配置仓库7. 使用helm快速部署应用8. 自己创建chart9. 实现yaml高效复用四、持久化存储1.nfs—…

ArXiv简介以及论文提交

arXiv网站简介 arXiv是一个收集物理学、数学、计算机科学、生物学与数理经济学的论文预印本的网站。其中arXiv发音同“archive”&#xff0c;因为“X”代表希腊字母 &#xff0c;国际音标为[kai]。它于1991年8月14日成立&#xff0c;现由美国康奈尔大学维护。 ——维基百科 对…

在Angular项目中引入NG-ZORRO

在Angular项目中引入NG-ZORRO1.前置2.安装NG-ZORRO并进行初始化配置3.引入样式4.引入组件1.前置 首先创建一个angular项目&#xff1a;angular创建一个新项目的步骤 这是我项目的结构&#xff1a; 2.安装NG-ZORRO并进行初始化配置 安装NG-ZORRO&#xff1a;cd 到当前项目位…