Linux内存管理(1)——MMU内存管理单元及Buddy算法详解

news2024/9/25 13:26:41

文章目录

  • 1.内存管理单元(MMU)
    • 1.1 MMU的作用
    • 1.2 MMU相关概念
    • 1.3 ARM处理器访问内存过程
  • 2.内存优化之buddy伙伴算法
    • 2.1 背景
    • 2.2 优缺点
    • 2.2 原理

最近复习Linux内存管理部分,简单将自己的理解记录一下

内存:包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)
RAM:随机存取存储器,掉电丢失,CPU直接交换数据的内部存储器,也叫主存(内存)。可以随时读写,而且速度很快
ROM:只读存储器,掉电不丢失,只读不可写,用于存放计算机的基本程序和数据
Cache:高速缓冲存储器,位于CPU与内存之间,读写速度比内存更快。当CPU向内存中写入或读出数据时,这个数据也被存储进高速缓冲存储器中

1.内存管理单元(MMU)

1.1 MMU的作用

内存管理单元MMU,辅导操作系统进行内存管理
1)提供虚拟地址和物理地址的映射,使用转换表存储(使开发者感觉程序可以访问非常大的虚拟内存空间,从而不用考虑计算机物理内存实际容量)
2)提供内存访问权限保护(例如.text和.data段,是被MMU设置为只读的)
3)提供cache缓存控制等硬件支持

1.2 MMU相关概念

1)TLB(Translation Lookaside Buffer):转换旁路缓存,也就是转换表的Cache,负责缓存少量的虚拟地址和物理地址转换关系。
2)TTW(Translation Table walk):转换表漫游,当TLB中没有对应的虚拟及物理地址转换关系,需要进行TTW转换表漫游,访问内存中转换表获得虚拟及物理地址转换关系,成功后,结果写入到TLB中。

1.3 ARM处理器访问内存过程

image.png
这是在Linux设备驱动开发详解里找到的一张图,加以自己对这张图的理解,大概过程如下:
当处理器访问一块内存时,如果已经开启了MMU,则去TLB中查找是否有对应的虚拟地址及物理地址转换关系,未找到则进行TTW操作,访问内存中的转换表获得转换关系,成功后,结果写入到TLB中。
而若一开始便在TLB就找到了转换关系,便继续检查访问权限,访问权限正确,则查看要访问的这片内存,是否已经被读取到cache中,未读取到cache则直接访问内存并更新cache,在cache中找到便直接进行访问。

2.内存优化之buddy伙伴算法

2.1 背景

嵌入式开发经常遇到的一个问题就是,频繁请求和释放不同大小的内存,会导致许多外部空闲碎片,造成空间的浪费,buddy算法以2的n次方个页面为单位管理内存,将空闲内存进行拆分或合并,能有效提高内存利用率及减少外部碎片。
而在平常使用的应用层内存池,其实也是这种类似的思想。

buddy算法管理的内存称为伙伴内存:相同大小、物理地址连续、从同一个大内存块拆分出。

2.2 优缺点

buddy算法优点
1)快速响应内存分配请求
2)能有效提高内存利用率及减少外部碎片

buddy算法缺点
1)在连续的一片内存中,即使有一个很小的块还没有释放,也会阻碍大的内存块合并。
image.png
2)会产生一定的内部碎片,当申请的内存不是2的幂次方申请内存时,便会有部分内存浪费
3)拆分和合并会涉及链表和位图操作,有一定的系统开销。

2.2 原理

初始化:操作系统在分配内存时,会将所有的空闲页框,分组为11块链表,每一块链表分别包含大小为1,2,4,8,16,32,64,128,256,512,1024个连续的页框。
内存块申请:假设要申请256页的块,算法会先从256页的节点中查找是否有空闲块,如果存在这个大小的空闲节点,则会直接将这个节点拿去使用,而若没有这个大小的节点,则去512页的节点中查找,如果存在这样的块,则将512页的这个空闲节点分成两等份,一份拿去用,一份则插入到256页的链表中,如果512页的节点也没有,则继续往1024页的节点中去找。如果一直没能找到,则发出错误信号,申请内存失败。
内存块释放:内存释放其实就是内存申请的逆向过程,比如要释放4页内存,首先会到链表中4页的节点寻找伙伴,如果找到并且伙伴也未在使用,则合并为一个更大的块,并不断向上查找伙伴,直到无法再找到伙伴,便插入链表对应位置,并标记内存可用。
位图操作:二进制位图的某一位对应两个互为伙伴的块,分配和释放,都是在对位图进行异或操作,异或的结果1代表其中一块已经分配,0表示两块都空闲或都已分配。
异或操作为0,则代表两个内存块此时状态一致,可进行合并,反之不能合并。
(异或:相同为0,不同为1 )

内存链表大概结构如下:
image.png

内存位图大概结构如下:
image.png

等有时间继续依据buddy算法来实现一个内存池

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

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

相关文章

委托 by 操作符

属性委托给属性 使用 by:: 操作符,代表调用系统内置的方法。 读:getVaule 写:setValue 共享同一个数据。 /*** 属性委托给属性* by:: 系统内置的方法,非自定义的* 共享同一个数据*/ var num:Float 9999.0f/*** newNum属性委托…

黑神话悟空-画质提升+帧数提升+超宽屏+写实画质补丁+无光追也可拥有的超强画质

超真实画质提升!!! 下载地址:https://pan.quark.cn/s/529202fbbbef

Python | Leetcode Python题解之第381题O(1)时间插入、删除和获取随机元素-允许重复

题目: 题解: import random class RandomizedCollection:def __init__(self):"""Initialize your data structure here."""self.table {}self.ns []def insert(self, val: int) -> bool:"""Inserts …

WPF 手撸插件 七 日志记录(二)

1、本文使用Serilog进行记录日志,目前想只用log4net进行日志记录,但是Serilog有想学习一下,所有这里使用控制台项目来学习一下Serilog。我使用的还是.Net Framework 4.5. 2、NuGet 安装Serilog 2.12.0、Serilog.Sinks.Console 4.1.0&#xf…

智能学习辅助系统——后端部分

目录 前言 一、准备工作 1.需求&环境搭建 1.1需求说明 1.2环境搭建 2.开发规范 2.1 开发规范-REST 2.2 开发规范-统一响应结果 3.开发流程 二、部门管理 1.查询部门 (1)原型和需求 (2)接口文档 (3&…

阿里巴巴1688 阿里228滑块 网站分析(不涉及逆向)

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我…

R语言统计分析——回归模型深层次分析

参考资料:R语言实战【第2版】 本文主要讨论回归模型的泛化能力和变量相对重要性的方法。 1、交叉验证 从定义上看,回归方法就是从一堆数据中获取最优模型参数。对于OLS(普通最小二乘)回归,通过使得预测误差&#xff0…

【书生大模型实战营(暑假场)】进阶任务六 MindSearch CPU-only 版部署

进阶任务六 MindSearch CPU-only 版部署 任务文档GitHub CodeSpace硅基流动HuggingFace Space 任务: MindSearch 部署到Github Codespace 和 Hugging Face Space 笔者部署在 HuggingFace 的 MindSearch 模型链接为:ccdgyro/MindSearch 1 开发机创建和环…

重塑视频监控体验:WebRTC技术如何赋能智慧工厂视频高效管理场景

视频汇聚EasyCVR视频监控平台,作为一款智能视频监控综合管理平台,凭借其强大的视频融合汇聚能力和灵活的视频能力,在各行各业的应用中发挥着越来越重要的作用。 EasyCVR平台不仅兼容多种主流标准协议及私有协议/SDK的接入(如&…

汽车线束品牌服务商推荐-力可欣:致力于汽车连接线束和汽车连接器的开发、生产和应用

汽车线束品牌服务商推荐-力可欣:致力于汽车连接线束和汽车连接器的开发、生产和应用

医院建筑的电气设计——保障医疗质量与安全的坚固基石

医疗资源与水平的提升成为了衡量民生福祉的重要标尺。随着一批批新建医院及既有医院的华丽蜕变,从社区医院到综合医院,再到医疗城、医疗集聚区的崛起,不仅彰显了政府对民生健康的深切关怀,也预示着我国医疗体系正迈向智能化、高效…

C++初学(17)

17.1、字符函数库cctype C有一个与字符相关的、非常方便的函数软件包,它可以简化如确定字符是否为大写字母、数字或标点符号等工作。这些函数的原型是在头文件cctype中定义的。如果ch是一个字母,则isalpha(ch)函数返回一个非零值,否则返回0。…

关于zotero无法识别拖入的pdf和caj的题录信息

一、首先要安装好茉莉花插件 1、点击链接,进入Zotero 插件商店, Zotero 插件商店 | Zotero 中文社区 (zotero-chinese.com) 搜索:Jasminum,选择好版本,点击下载 2、 下载好后,点击“工具”,…

兔子序列(c语言)

1.//描述 //兔子发现了一个数字序列,于是开始研究这个序列。兔子觉得一个序列应该需要有一个命名, // 命名应该要与这个序列有关。由于兔子十分讨厌完全平方数, // 所以兔子开创了一个新的命名方式:这个序列中最大的不是完全平方数…

kubectl陈述式资源管理

目录 概念 kubectl的基础命令 *每天常用的查看集群的基本信息 deployment的部署方式 deployment 的特点 基于deployment创建pod 手动缩容 service的类型以及工作原理 创建service service的类型 修改service的类型为nodeport **nodeport实验:对外暴露端…

数据结构(Java)实现:栈和队列

文章目录 1. 栈的模拟实现1.1 普通栈的模拟实现1.2 泛型栈的模拟实现 2. 栈的介绍3. 栈的使用4. 栈的应用场景4.1 改变元素的序列4.2 将递归转换为循环4.3 使用栈解题 5. 栈的链表实现6. 队列概念7. 队列的使用8. 模拟队列的实现8.1 链式队列8.2 顺序队列 9. 双端队列 1. 栈的模…

C++和OpenGL实现3D游戏编程【连载6】——不规则图形的纹理贴图

C++和OpenGL实现3D游戏编程【连载6】——不规则图形的纹理贴图 1、本节实现的内容 上一节我们讨论了纹理贴图的相关基础操作,但上一节的纹理贴图操作基本上都是规则图形,包括圆形和球形虽然复杂一点,但是它也是规则的。这一节课我们要讨论一下,怎么在不规则图形上纹理贴图…

​polarctf靶场[web]upload1​

[web]upload1 考点:文件上传漏洞 不信邪,先上传php,发现被拦截 在上传jpg和png图片,发现也被拦截 所以先拦截抓包,上传个有一句话木马的png图片 将文件后缀改为php,先在重发器发送,发现上传成…

MATLAB 计算凹凸多边形的面积(85)

MATLAB 计算凹凸多边形的面积(84) 一、算法介绍二、算法实现1.代码一、算法介绍 计算凹凸多边形的面积,并输出计算结果,可视化 二、算法实现 1.代码 % 设置多边形的顶点坐标 % 这里以一个五边形为例 x = [1, 3, 4

深入理解DPO(Direct Preference Optimization)算法

目录 1. 什么是DPO?2. Bradley-Terry模型2.1 奖励模型的训练 3. 从PPO到DPO4. DPO的简单实现5. 梯度分析Ref 1. 什么是DPO? 直接偏好优化(Direct Preference Optimization, DPO)是一种不需要强化学习的对齐算法。由于去除了复杂的…