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

news2024/11/20 3:24:03

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.coloradmin.cn/o/1417156.html

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

相关文章

C++:STL - string

C&#xff1a;STL - string basic_stringstringstring的常见构造string的输入输出operator<<c_stroperator>>getline string访问及遍历operator[ ] & atfont & back迭代器begin & endrbegin & rend 范围for string的容量操作size & lengthmax_…

用甘特图有效管理多个项目进度

当公司或组织同时承担多个项目时,合理规划各项目的时间节点与资源分配对确保高效完成至关重要。采用甘特图可以直观地展示多个项目的时间进程、关键里程碑以及资源分配情况,便于从宏观层面全面把控各项目的动态。 在线甘特图软件 zz-plan.com 提供了非常强大的时间轴规划功能,支…

CSS 多色正方形上升

<template><view class="loop cubes"><view class="item cubes"></view> <!-- 方块1 --><view class="item cubes"></view> <!-- 方块2 --><view class="item cubes"></vie…

C# 将HTML网页、HTML字符串转换为PDF

将HTML转换为PDF可实现格式保留、可靠打印、文档归档等多种用途&#xff0c;满足不同领域和情境下的需求。本文将通过以下两个示例&#xff0c;演示如何使用第三方库Spire.PDF for .NET和QT插件在C# 中将Html 网页&#xff08;URL&#xff09;或HTML字符串转为PDF文件。 HTML转…

【C语言】深入理解指针(3)数组名与函数传参

目录 &#xff08;一&#xff09;数组名的理解 &#xff08;1&#xff09;数组名是数组首元素的地址 &#xff08;2&#xff09;两个例外 &#xff08;二&#xff09;函数内数组传参 &#xff08;1&#xff09;一维数组传参 &#xff08;2&#xff09;二维数组传参 &…

以太网交换基础VLAN原理与配置

目录 7.以太网交换基础 7.1.以太网协议 7.2.以太网帧介绍 7.3.以太网交换机 7.4.同网段数据通信全过程 8.VLAN原理与配置 8.1.VLAN的基本概念 8.2.VLAN的应用 7.以太网交换基础 7.1.以太网协议 以太网是当今现有局域网(Local Area Network,LAN)采用的最通用的通信协议…

git使用指南——以gitlab为例

注册gitlab 自行注册 新建项目 选择新建一个空白的项目 上传项目 clone项目地址到本地 执行完之后&#xff0c;会在目录下生成如下内容&#xff1a;进入里面&#xff0c;选择.git&#xff0c;要上传的内容&#xff08;资料或代码复制到该目录下&#xff09;&#xff1a;…

界面组件DevExpress .NET MAUI中文教程 - 如何优化手机屏幕空间?

DevExpress拥有.NET开发需要的所有平台控件&#xff0c;包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。 获取DevExpress v23.2正式版下载 Bottom Sheet是一个组件&#xff0c;它显示固定在屏幕底部的…

LeetCode:376.摆动序列

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;算法_仍有未知等待探索的博客-CSDN博客 题目链接&#xff1a;376. 摆动序列 - 力扣&#xff08;LeetCode&#xff09; 一、题目 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称…

【排序5】基数排序:数字的组织与整理艺术

&#x1f3a1;基数排序 &#x1f38a;1、基本思想&#x1f38a;2、基本步骤&#x1f38a;3、代码示例&#x1f38a;4、特性总结 &#x1f38a;1、基本思想 基数排序&#xff08;Radix Sort&#xff09;是一种非比较排序算法&#xff0c;它根据数字的每一位来对元素进行排序。它…

提示unzip :commad not found; 安装unzip教程

1.当使用unzip解压时 提示&#xff1a; unzip :commad not found; 2.安装命令 sudo yum install unzip 3.输入 y 确认 4.提示&#xff1a;完成 5.输入 unzip 文件名 解压-验证 6.完成

34.基于51单片机的智能停车位计时收费系统设计

一、系统功能介绍&#xff1a; 本设计基于 RFID智能识别和高速的视频图像和存储比较相结合&#xff0c;通过计算机的图像处理和自动识别&#xff0c;对车辆进出停车场的收费、车牌识别和车位诱导等&#xff0c;以实现停车场全方位智能管理。 本设计是以AT89C51 型单片机为主控芯…

Kubernetes (十七) 资源监控

一. 资源监控 二. metrics-server资源下载配置 官网:资源下载&#xff1a;http…

搭建Mybatis环境

1.导入依赖 pom.xml <dependencies> <!-- Mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency> <!-- Mysql依…

Tonka Finance 测试网活动,开启新铭文时代财富之门

Tonka Finance 是铭文赛道首个借贷市场&#xff0c;通过搭建一套铭文资产借贷质押方案&#xff0c;为铭文资产以借贷的形式释放价值、捕获流动性等方面提供了基础。作为铭文赛道最重要的基建设施之一&#xff0c;Tonka Finance 在面向市场后备受关注&#xff0c;并迅速作为铭文…

【UE】在控件蓝图中通过时间轴控制材质参数变化

效果 步骤 1. 新建一个控件蓝图和一个材质 2. 打开材质&#xff0c;设置材质域为用户界面&#xff0c;混合模式设置为“半透明” 在材质图表中添加两个参数来控制材质的颜色和不透明度 3. 对材质创建材质实例 4. 打开控件蓝图&#xff0c;在画布面板中添加一个图像控件 将刚…

vue常用指令(v-html)

一、v-html 指令 作用: 获取文本数据设置元素的innerHTML&#xff0c;此为和v-text的区别 二、代码演示 1、获取普通文本数据 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewpor…

32个Java面试必考点-08高并发架构基石-缓存

本课时介绍缓存相关的知识点以及 Memcache 和 Redis 这两个最常使用的缓存。重点学习以下三个方面的内容&#xff1a; 1.使用缓存时常遇到的典型问题&#xff1b; 2.Memcache 的内存结构&#xff1b; 3.Redis 相关的知识点以及 Redis 常用结构的实现。 缓存知识点 类型 缓…

day34WEB 攻防-通用漏洞文件上传黑白盒审计逻辑中间件外部引用

目录 一&#xff0c;白盒审计-Finecms-代码常规-处理逻辑 黑盒思路&#xff1a;寻找上传点抓包修改突破获取状态码及地址 审计流程&#xff1a;功能点-代码文件-代码块-抓包调试-验证测试 二&#xff0c;白盒审计-CuppaCms-中间件-.htaccess 三&#xff0c;白盒审计-Metin…

XCTF:Normal_RSA[WriteUP]

从题目中获取到两个文件 flag.enc内容是通过rsa加密了的密文 pubkey.pem是rsa公钥&#xff0c;加密者利用这个文件对flag原文进行了加密 如果对rsa加密算法不了解的可以补一下教学视频 数学不好也能听懂的算法 - RSA加密和解密原理和过程_哔哩哔哩_bilibili 使用openssl对公…