分页内存管理——虚拟地址到物理地址的转换【转】

转自:https://blog.csdn.net/qq_39755395/article/details/78380942

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_39755395/article/details/78380942 引子:

这是逻辑地址(虚拟地址),包括程序中打印的变量地址显示的都是逻辑地址,并不是内存空间上的物理地址。

每条指令在被执行时,读取操作数时需要给出操作数所在的内存地址,这个地址不能是物理主存地址,因为该程序在哪种硬件设置的机器上运行并不能事前确定,那操作系统就不能在此给出对应于某台机器的物理地址。

一、物理内存和虚拟内存

我们先来了解一下,什么是物理内存,什么又是虚拟内存? 1.物理内存:指通过物理内存条而获得的内存空间,主要作用是在计算机运行时为操作系统和各种程序提供临时储存。 2.虚拟内存:对内存架构(内存、缓存、硬盘)进行管理(内存管理系统)的一种手段。简单理解就是在硬盘上划分出一块区域作为内存使用。

2.1 对于用户: 计算机主要面向的是对操作系统等计算机知识几乎没有了解的普通大众,他们大多是不了解什么主存外存的,所以为了方便用户的使用,就有必要使得程序不管是位于内存架构的哪个层次,对于用户来说都是一样的。虚拟内存就是让内存管理实现媒介透明的手段。

2.2 对于主存: 众所周知,一个程序要想运行,就必须加载到物理主存(内存)中,但是物理主存的容量是非常有限的,我们当然可以选择购买更大的物理主存,可是很费钱,那么还有没有什么办法可以在不明显增加成本的基础上扩大内存容量的呢? 虚拟内存就可以做到,它的手段就是将物理主存扩大到便宜、容量大的磁盘上,即将磁盘空间也看作是主存空间的一部分。

用户程序可以存放在主存,也可以部分存放在主存、部分存放在磁盘,那么程序发出的地址到底是在哪里是由操作系统的内存管理模块负责的。

虚拟内存让用户“感觉”内存容量大大增加了,内存速度也加快了,就像魔法师一样,让观众觉得小箱子能够“装下”一只巨大的雄狮。

二、内存管理——分页内存管理

1.内存管理使用的方法

内存管理的方法有许多种,固定加载地址的、固定分区的、非固定分区的和交换内存管理,其中只有第一种固定加载地址的内存管理适用于单道编程,其余三种则适合多道编程。与此同时,它们的共同实现机制是——基址和极限。

2.交换内存管理中的机制——基址和极限

交换内存管理是这些方法中最灵活的。它使用的基址和极限机制实际上就是“将程序发出的虚拟地址加上基址得到物理地址”。

见下图:

3.交换内存管理的两大问题

3.1 空间浪费:程序不断的执行并释放的过程中,造成了内存空间中的可用空间不连续就,难以加以应用,这种现象也称为“外部碎片化”。 见下图:

3.2 程序大小受限 当程序需要更多的内存空间时,需要将其全部从物理内存中“倒出”到磁盘上,再在内存中找到更大的一片区域去存放增长了的程序,这样使得程序的增长效率低下。同时,一个程序的大小还不能超过物理内存空间的大小。

4. 解决方法——分页内存管理

4.1 分页内存管理 将虚拟内存空间和物理内存空间皆划分成大小相同的页面,例如4KB、8KB和16KB等。并将页作为内存空间的最小分配单位,一个程序的一个页面(虚拟页面)可以存放在任何一个物理页面中。

一个程序发出的虚拟地址由虚拟页面号和页内偏移值两部分组成,组成见下:

4.2 分页内存管理是如何解决交换内存管理中的两个问题的?

1.空间浪费:通过将内存空间划分成大小一样的页面,并且将其作为内存分配的基本单位,这样就避免了大量外部碎片的积累,让内存空间得到有效利用。

2.程序受限:分页内存管理下,允许一个进程的部分虚拟页面存放在物理压面(物理内存)中,另一部分存放在磁盘上,等到需要使用时再将其从磁盘中加载到物理内存中。也就是说,当程序需要额外的空间时,只需要对其分配新的页即可,这样做使得程序的增长效率较高。

4.3 虚拟地址->物理地址的转化(地址翻译)

翻译工作则是交给MMU(内存管理单元),它只对虚拟地址的页面号进行翻译,而不处理页内偏移值。

MMU为每一个程序都配备了一个页表,里面存放的是虚拟页面到物理页面的映射,如果MMU接收到了程序发出的虚拟地址,在查找相对应的物理页面号时,没有找到,那么将会通过缺页中断来将需要的虚拟页面从磁盘中加载到物理内存的页面中。

并且随着虚拟页面的进出内存,页表的内容也是不断地变化的。

4.4 页表中的具体信息 MMU为每一个程序配备的页表除了有虚拟地址到物理地址的映射(虚拟页面号到物理页面号),还有其他的与页面的管理活动有关的信息,因为mmu要依赖页表来进行与页面相关的管理活动。

例如,页表如何知道需要的虚拟页面是否在物理页面中?那么页表中就有一项信息记录的是该虚拟页面是否在当前的物理页面中——在内存否。 再说,有一些虚拟页面是受到保护的,对它的读、写和执行操作是有限制的,记录该页面的保护信息的则是——保护标识区。 等等。

可以参考下图中,页表中存储的具体内容:

———————————————— 版权声明:本文为CSDN博主「帅气的羊羊杨」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_39755395/article/details/78380942

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏along的开发之旅

Linux下如何解压tar.gz和tar.bz2和zip

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

12450
来自专栏Java后端技术栈cwnait

不要折磨我了,Mybatis 中$和#千万不要乱用!

这是一次代码优化过程中发现的问题,在功能优化后发现部分数据查不到出来了,问题就在于一条sql上的#和$。

7510
来自专栏大数据学习笔记

Neo4J:Apoc插件的下载与安装

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

20420
来自专栏数据和云

如何在ORACLE CLOUD中创建和访问容器集群丨内附官方文档链接

墨墨导读:本文描述如何在Oracle Cloud中创建并访问容器服务。为了简单,所有的操作都是针对root隔离区。

7420
来自专栏机器人课程与技术

Ubuntu18.04 ROS1Melodic ROS2Dashing 机器人工具集学习镜像的制作说明 Pinguy

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

12910
来自专栏猿天地

Google 搜索的即时自动补全功能究竟是如何“工作”的?

Google 搜索的自动补全功能可以在 Google 搜索应用的大多数位置使用,包括 Google[1] 主页、适用于 IOS 和 Android 的 Goog...

8210
来自专栏Seebug漏洞平台

CVE-2019-14287(Linux sudo 漏洞)分析

近日 sudo 被爆光一个漏洞,非授权的特权用户可以绕过限制获得特权。官方的修复公告请见:https://www.sudo.ws/alerts/minus_1_...

12710
来自专栏安全漏洞环境学习

Joomla 3.4.6-RCE漏洞复现

Joomla是一套全球有名的CMS系统,基于PHP语言加上MySQL数据库所开发出来的WEB软件系统,目前最新版本是3.9.12。可以在多种不同的平台上部署并且...

16010
来自专栏架构专题

还在收集资料?我这里有个github汇总

国内程序员都喜欢收集资料,但是又不看,github是重灾区。更有莫名其妙fork的,让人不得要领。这些资料其实也代表了收集者的一个思路,还是有不小参考价值的。

150100
来自专栏苏生不惑

不会写Python代码如何抓取豆瓣电影 Top 250

说到爬虫,大多数人会想到用Python来做,毕竟简单好用,比如想抓取豆瓣电影top250 的所有电影数据。

12820

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励