内存管理(mmu)/内存分配原理/多级页表

1.为什么要做内存管理?

随着进程对内存需求的扩大,和同时调度的进程增加,内存是比较瓶颈的资源,如何更好的高效的利于存储资源是一个重要问题。

这个内存管理的需求也是慢慢发展而来,早期总线上的master是直接使用物理地址,再到发展出对CPU进行内存管理的MMU,到现在给SOC内部的各个具有DMA功能的模块进行内存管理的IOMMU或者叫做SMMU

在没有内存管理的时代,物理空间只能连续的使用,一个进程要用多少存储,在进程开始就确定好了,但是进程在运行过程中由于程序局部性的原理,在一段时间内可能只使用了分配好的内存的一部分,其余大部分时间都是空闲的;另外一个问题就是在分配内存过程中会出现一些小的且不连续的内存空间,这些空间(内存碎片)无法满足任何进程的使用,造成了一定的空间浪费。

所以内存管理解决的就是就是两个问题:

  • 让进程在运行过程中动态分配存储空间,即根据需求在运行过程中不断的分配空间【这同时促进了多级页表的产生】,而不需要一次分配很大的空间,这样可以提高进程并行调度能力
  • 降低空间碎片的产生

内存管理采用虚拟地址到物理地址的映射,这种用虚拟空间来隔离进程的做法又促进了虚拟化/虚拟机【VM】的发展,本文先不讨论VM。

1.1 内存碎片

内存碎片是由内存的申请和释放产生的,通常分为内部碎片和外部碎片。

  1. 内部碎片是由于采用固定大小的内存分区,即以固定的大小块为单位来分配,采用这种方法,进程所分配的内存可能会比所需要的大,这多余的部分便是内部碎片。
  2. 外部碎片是由于未分配的连续内存区域太小,以至于不能满足任意进程所需要的内存分配请求,这些小片段且不连续的内存空间被称为外部碎片。

2.内存管理算法

linux每一个用户进程都对应有自己的页表,我们不禁要问这些页表或者说物理空间是如何分配的?为什么每个进程对应一个页表?

通俗的来讲,每一个用户进程看到的都是一样大小的虚拟空间,所以它们并不知道实际可用的物理地址有哪些。【物理地址空间的管理和分配是一个独立于这些用户进程的,实际是OS操作系统管理的】当运行一个新的进程时,OS根据当前可用的PA【OS知道哪些PA正在被使用】,建立VA到PA的映射,也就是产生一个新的对应该进程的页表【每一个进程运行时当前可用PA都是不一样的,所以每个进程都要自己的页表】。

2.1内存管理的伙伴系统算法

linux使用的时伙伴系统来管理和分配内存

  • Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算法由Knowlton设计, 后来Knuth又进行了更深刻的描述.
  • 伙伴系统是一个结合了2幂次个分配器和空闲缓冲区合并计技术的内存分配方案, 其基本思想很简单. 内存被分成含有很多页面的大块, 每一块都是2^n个页面大小. 如果找不到想要的块, 一个大块会被分成两部分, 这两部分彼此就成为伙伴. 其中一半被用来分配, 而另一半则空闲. 这些块在以后分配的过程中会继续被二分直至产生一个所需大小的块. 当一个块被最终释放时, 其伙伴将被检测出来, 如果伙伴也空闲则合并两者.

具体的算法请参考本人的转载文章:

内存管理之伙伴系统分析-CSDN博客

3.多级页表及节省内存

页表:是存储PTE的一个内存分页,而PTE是描述VA与PA映射关系的entry。

多级页表结构分为PGD/PUD/PMD/PTE这几个层级,P代表page,G代表global,D代表目录(Director),U代表上级,M代表中间,T代表Table,E代表Entry,所以:

PGD:page global director

PUD:page upper director

PMD:page middle director

PTE:page table entry

PTE是页表项。他们之间的关系是层级结构,通过PGD访问到最低端的PTE,访问方式是上一层地址+偏移量(offset)。PTE+页内偏移量可以访问到具体的物理地址。

为什么要建立多级页表的结构呢?

先给出结论【经过确认的结论】就是多级页表是为了节省页表的存储空间。

举个例子,4GB的DDR空间,4KB的页大小,一个PTM 4B,总共需要4GB/4K=1M个PTE,如果每个进程都要产生并存储一个1Mx4B的PTE,就会占用不少内存空间。

只要进程需要寻址4GB内存空间的能力,无论建立多少级的页表,最终都需要1Mx4B的PTE,在加上多出来的几级页表存储空间只会更多,那么为什么会说多级页表可以节省内存空间呢?

在这里先做一个统一,最底层的PTE这一级我们叫做第一级,PMD,PUD,PGD分别是第二/三/四级【这里PMD/PUD只是一个相对的层级,可能代表有多个中间层和上层,也可能没有,这里假设每一个就代表一层】,这样最底层为底层的话,无论增加多少层它的叫法不变。

写到这里有一个问题:页表既然是存在内存中的,那么有没有为页表空间建立页表?

其实多级页表可以理解为对上级页表对下级页表建立的页表,比如只有两级页表,配置了第二级页表的基地址,我们可以用虚拟地址的高位来映射第一级页表的物理地址。这样就可以理解高层页表是为了底层页表能够不连续的存储

多级页表的好处是可以将PTE分散存储,而不是用连续的物理地址存储。即使只有一级的PTE页表,也可以根据程序运行的局部特性只在特定时刻生成一部分PTE页表,但关键不在于只生成一部分的PTE,而是只有一级页表的话需要连续物理地址空间,即使只生成一部分的PTE,这1Mx4B的地址空间也不能给别人用。【这一原因也是很多文章没有说清楚的地方

另外多级页表还有一个优势,就是可以将那些不常用的低级页表swap out到硬盘中,当进程再次访问到该页表映射的物理内存是,内核将页表从硬盘中swap in到内存中。当然最顶层的PGD页表是必须常驻内存的。

既然多级页表也是存储在DDR的页上的数据,那么和其他数据一样就可以经过cache来高速缓存,其对应的高速缓存cache就是TLB(translation lookaside buffer,转换后备缓冲区,又常被称为快表)。这里不在详细介绍。

总结起来多级页表能够节省内存空间的原因如下:

  • 将页表变为非连续存储,同时可以只生成当前需要的一段页表
  • 可以将不常用页表swap到硬盘

参考资料:

操作系统中的多级页表到底是为了解决什么问题? - 知乎

该问题的答主中bin的技术小屋的回答

4.程序的局部性原理

多次提到程序的局部性原理,如何来描述呢?

局部性原理表现为:时间局部性和空间局部性。时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;如果某块数据被访问,则不久之后该数据可能再次被访问;空间局部性是指一旦程序访问了某个存储单元,则不久之后,其附近的存储单元也将被访问。

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

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

相关文章

Oracle篇—分区索引的重建和管理(第三篇,总共五篇)

☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣…

ES的一些名称和概念总结

概念 先看看ElasticSearch的整体架构: 一个 ES Index 在集群模式下,有多个 Node (节点)组成。每个节点就是 ES 的Instance (实例)。每个节点上会有多个 shard (分片), P1 P2 是主分片, R1 R2…

达梦数据库——记录一次离谱的登录失败报错

好久没更新了哇 前面有整理过一些常见的数据库登录失败问题哈,今天记录一个遇到概率比较小,但碰上了一般不太容易找到原因的登录失败问题。 今天给客户同时初始化了三台服务器数据库,惟独这一台死活登不进去,满脑子问号&#xf…

【论文解读】Object Goal Navigation usingGoal-Oriented Semantic Exploration

论文:https://devendrachaplot.github.io/papers/semantic-exploration.pdf 代码:https://github.com/devendrachaplot/Object-Goal-Navigation 项目: Object Goal Navigation using Goal-Oriented Semantic Exploration example&#xff1…

2、鼠标事件、键盘事件、浏览器事件、监听事件、冒泡事件、默认事件、属性操作

一、鼠标事件 1、单击事件&#xff1a;onclick <body><header id"head">我是头部标签</header> </body> <script> var head document.getElementById("head")head.onclick function () {console.log("我是鼠标单击…

金蝶云星空--写插件不重启IIS热更新简单配置指南

云星空7.5版本&#xff0c;以简单方式配置并测试了热更新的实现方式可行&#xff0c;操作如下&#xff08;7.5外版本没试过&#xff0c;大家可试下&#xff09;&#xff1a; 1、打开WebSite\App_Data\Common.config&#xff0c;修改appSettings&#xff0c;设置IsEnablePlugIn…

go slice 扩容实现

基于 Go 1.19。 go 的切片我们都知道可以自动地进行扩容&#xff0c;具体来说就是在切片的容量容纳不下新的元素的时候&#xff0c; 底层会帮我们为切片的底层数组分配更大的内存空间&#xff0c;然后把旧的切片的底层数组指针指向新的内存中&#xff1a; 目前网上一些关于扩容…

redis源码之:clion搭建cluster环境

cluster集群通常每个node节点都是一主N从的模式&#xff0c;此处为简化环境搭建&#xff0c;所有node节点均只有一个主节点。 在clion环境中&#xff0c;为方便debug&#xff0c;需要通过配置多个cmake application实现redis-server、redis-cli等源码debug模式启动。 一、配置…

费曼学习法 - 理工科的学习利器

费曼学习法是以物理学家理查德费曼&#xff08;Richard Feynman&#xff09;命名的一种高效的学习方法。它旨在帮助你深入理解复杂概念&#xff0c;并能够用简单的语言解释它们。费曼学习法是一个学习框架&#xff0c;能够帮你对给定主题进行深入理解&#xff0c;包含以下4个简…

HTML-表单

表单 概念&#xff1a;一个包含交互的区域&#xff0c;用于收集用户提供的数据。 1.基本结构 示例代码&#xff1a; <form action"https://www.baidu.com/s" target"_blank" method"get"><input type"text" name"wd&q…

完成NAT实验

实验要求&#xff1a; 步骤一&#xff1a;配置vlan vlan b 2 3 interface GigabitEthernet 0/0/2 port link-type access port default vlan 2 interface GigabitEthernet 0/0/3 port link-type access port default vlan 3 interface GigabitEthernet 0/0/1 port link-type…

【PyTorch】使用PyTorch创建卷积神经网络并在CIFAR-10数据集上进行分类

前言 在深度学习的世界中&#xff0c;图像分类任务是一个经典的问题&#xff0c;它涉及到识别给定图像中的对象类别。CIFAR-10数据集是一个常用的基准数据集&#xff0c;包含了10个类别的60000张32x32彩色图像。在本博客中&#xff0c;我们将探讨如何使用PyTorch框架创建一个简…

C#,打印漂亮杨辉三角形(帕斯卡三角形)的源代码

杨辉 Blaise Pascal 这是某些程序员看完会哭的代码。 杨辉三角形&#xff08;Yanghui Triangle&#xff09;&#xff0c;是一种序列数值的三角形几何排列&#xff0c;最早出现于南宋数学家杨辉1261年所著的《详解九章算法》一书。 欧洲学者&#xff0c;最先由帕斯卡&#x…

Windows打开IE浏览器命令最简单的方法

问题场景&#xff1a; 许多插件或特定版本的系统需要使用ie浏览器来访问&#xff0c;window默认的ie浏览器是被禁用的如何快速打开ie浏览器解决问题 目录 问题场景&#xff1a; 测试环境&#xff1a; 检查环境是否支持&#xff1a; 问题解决&#xff1a; 方法一 方法二 方法…

03 SB实战 -微头条之首页门户模块(跳转某页面自动展示所有信息+根据hid查询文章全文并用乐观锁修改阅读量)

1.1 自动展示所有信息 需求描述: 进入新闻首页portal/findAllType, 自动返回所有栏目名称和id 接口描述 url地址&#xff1a;portal/findAllTypes 请求方式&#xff1a;get 请求参数&#xff1a;无 响应数据&#xff1a; 成功 {"code":"200","mes…

hex 尽然可以 设置透明度,透明度参数对比图 已解决

还不知道CSS Color Module Level 4标准早在2014年就推出8位hex和4位hex来支持设置alpha值&#xff0c;以实现hex和rgba的互转。这个办法可比6位HEX转RGBA简洁多了&#xff0c;先来简单解释一下&#xff1a; 8位hex是在6位hex基础上加后两位来表示alpha值&#xff0c;00表示完全…

Hadoop-MapReduce-MRAppMaster启动篇

一、源码下载 下面是hadoop官方源码下载地址&#xff0c;我下载的是hadoop-3.2.4&#xff0c;那就一起来看下吧 Index of /dist/hadoop/core 二、上下文 在上一篇<Hadoop-MapReduce-源码跟读-客户端篇>中已经将到&#xff1a;作业提交到ResourceManager&#xff0c;那…

数据结构——树的合集

目录 文章目录 前言 一.树的表达方式 1.树的概念 2.树的结点 3.树的存储结构 01.双亲表示法 顺序表示形式 优缺点说明 02.孩子表示法 03.孩子兄弟表示法 04.非类存储代码演示 二.二叉树 1.树的特点 2.二叉树 01.定义 02.二叉树的性质 03.满二叉树 04.完全二叉树…

uniapp封装公共的方法或者数据请求方法

仅供自己参考&#xff0c;不是每个页面都用到这个方法&#xff0c;所以我直接在用到的页面引用该公用方法&#xff1a; 1、新建一个util.js文件 export const address function(options){return new Promise((resolve,reject)>{uni.request({url:"https://x.cxniu.…

Istio-gateway

一. gateway 在 Kubernetes 环境中&#xff0c;Kubernetes Ingress用于配置需要在集群外部公开的服务。但是在 Istio 服务网格中&#xff0c;更好的方法是使用新的配置模型&#xff0c;即 Istio Gateway&#xff0c;Gateway 允许将 Istio 流量管理的功能应用于进入集群的流量&…