段,页,段页,三种内存(RAM)管理机制分析

2024-06-24 09:36

本文主要是介绍段,页,段页,三种内存(RAM)管理机制分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

段,页,段页

        是为实现虚拟内存而产生的技术。直接使用物理内存弊端:地址空间不隔离,内存使用效率低。

段:就是按照二进制文件的格式,在内存给进程分段(包括堆栈、数据段、代码段)。通过段寄存器中的段表来进行虚拟地址和物理地址的转换。

段实现的虚拟地址 = 段号+offset

物理地址:被分为很多个有编号的段,每个进程的虚拟地址都有段号,这样可以实现虚实地址之间的转换。其实所谓的地址映射,就是虚实地址转换之间的那个公式。

经过上面的理解我们知道了,实现段机制的器件其实就是段寄存器(段表)

不足:内存碎片(程序结束后内存被分割为一小块一小块),解决方法是SWAP分区(将散开的进程读出来再粘贴到另一个进程边上,使空闲的内存是连贯的,但这样效率很低)

页:就是将物理内存固定大小地分为n个页(linux中是4KB一页)。通过MMU的页表来进行虚实地址转换,这里就不是用寄存器来实现了。页表记录着页号、页号对应的物理地址,比较创新的是还记录着权限。基本功能已经有了,就是物理地址和页号怎么对应上。

页实现的虚拟地址 = 页号 + 页内偏移

物理地址:被分为很多个有编号的页,每个进程的虚拟地址都是用页号和偏移来记录,通过MMU来进行虚实转换。

经过上面的理解我们知道了,实现页机制的器件其实就是MMU。

优点:为什么说MMU可以让原本1G SDRAM的物理内存,实现能够实际使用4G SDRAM空间?甚至给每个程序都安排上4G SDRAM的内容空间?为什么每一个进程的内存空间是独立的?

就是因为物理SDRAM用页来管理,有些不用的页,可以暂时先存到硬盘上,硬盘的空间就非常大了动不动就是几百个G,所以可以做到虚拟出很大的内存空间给到程序。因为每一个进程都有自己单独的页表,一个进程根本没法知道或者操作另一个进程的页表,对应的也就不知道另一个进程的地址(虚拟地址对应的物理地址)在哪里,自然就是独立的。

缺点:页表本身占用的内存太多了,每一个进程有一个页表,那么理论上32位的机器4G的物理内存,每一页是4K的话,总共会有4G/4K = 2^10 * 2*10 个页表,如果一个页表要4MB,那光是记录页表就要占用800M的内存。

解决:套娃,用多级页表。

采用多级页表机制的虚拟地址 = 一级页号 + 二级页号 + 页内偏移。这样MMU可以通过页号1来找到页号2,通过页号2+页内偏移来找到对应的物理地址从而实现虚实转换。那为啥这样能够降低页表占用内存的大小呢?其实就行把文件折叠了一样,如果一级页表里面有的二级页表没有被分配,那这些二级页表实际上就是没有分配内存的;如果有些二级页表很久没有被使用,那这些二级页表也可以暂时存到硬盘里,也不占用空间。假如一个一级页表是4MB的话,那就相当于你可以用1个4MB的内存大小去管理很多个占4MB的二级页表,然而实际只占用了4MB。照着这个思路,可以造出很多级的页表,进行极致的页表空间压缩。

缺点2:多级页表是省了空间,但是从虚拟地址转成物理地址也多了很多步骤,要一级一级地查找最终才能找到对应的物理地址。

解决2:建立快表TLB,实际就是把一些最近使用的进程它虚拟地址对应的最底层页号和偏移,存到一个一级表中(快表),这样要地址转换时,先去快表找,找不到再去查多级页表。如此就显著提高了虚实地址转换速度,而且也节省了空间。

段页式

段页式:其实就是把物理地址分为一大段一大段的,在段的内部,再进行分页。

段页式机制下虚拟地址 = 段号 + (段内)页号 + 页内偏移

这样就结合了段(契合二进制文件堆栈,代码段,数据段分层,便于程序分配地址)和页(多级页表节省空间)两个特点。

不足:就是实现起来比较复杂。但是段页式是现在内存(SDRAM)管理的主流。需要注意的是,Linux是使用页机制的。

但是linux中的页机制也一定程度上有段页结合的影子,下面是段页式的虚实地址转换流程:

linux中每一个进程虚拟地址中的段号都是对应的0~4GB的地址空间,每一个进程段空间范围都一样就意味着虚拟地址中的段号没有划分地址的作用,实际上linux中的虚拟地址是 "虚拟地址 = 段号+页号+页内偏移 ",系统有规定某些段号只有内核程序能使用,应用层程序只能使用另一些段号。从而实现了访问权限的机制。

这篇关于段,页,段页,三种内存(RAM)管理机制分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089772

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

高度内卷下,企业如何通过VOC(客户之声)做好竞争分析?

VOC,即客户之声,是一种通过收集和分析客户反馈、需求和期望,来洞察市场趋势和竞争对手动态的方法。在高度内卷的市场环境下,VOC不仅能够帮助企业了解客户的真实需求,还能为企业提供宝贵的竞争情报,助力企业在竞争中占据有利地位。 那么,企业该如何通过VOC(客户之声)做好竞争分析呢?深圳天行健企业管理咨询公司解析如下: 首先,要建立完善的VOC收集机制。这包括通过线上渠道(如社交媒体、官网留言

Android SurfaceFlinger——图形内存分配器(十一)

前面的文章中的图层合成器(HWC),这里我们接着看一下 SurfaceFlinger 中的另一个重要服务——图形内存分配器。 一、简介         android.hardware.graphics.allocator@2.0 是 Android 系统中硬件抽象层(HAL)的一个组件,专门用于图形内存的分配和管理。它是 SurfaceFlinger 在处理图形数据时所依赖的

二叉树三种遍历方式及其实现

一、基本概念 每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒。 性质: 1、非空二叉树的第n层上至多有2^(n-1)个元素。 2、深度为h的二叉树至多有2^h-1个结点。 3、对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。 满二叉树:所有终端都在同一层次,且非终端结点的度数为2。 在满二叉树中若其深度为h,则其所包含

逆向学习汇编篇:内存管理与寻址方式

本节课在线学习视频(网盘地址,保存后即可免费观看): ​​https://pan.quark.cn/s/3ceeb9ae6d98​​ 在汇编语言的世界中,内存管理和寻址方式是构建程序的基础。理解这些概念不仅对于编写高效的汇编代码至关重要,也是进行逆向工程分析的关键技能。本文将深入探讨内存管理的基本原则和多种寻址方式,并通过代码案例来展示它们的实际应用。 1. 内存管理 内存管理涉及如何分配

打包体积分析和优化

webpack分析工具:webpack-bundle-analyzer 1. 通过<script src="./vue.js"></script>方式引入vue、vuex、vue-router等包(CDN) // webpack.config.jsif(process.env.NODE_ENV==='production') {module.exports = {devtool: 'none

Java格式化日期的三种方式

1)借助DateFormat类: public String toString(Date d) { SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”); return sdf.format(d); } 2)使用String.format()方法。 String.format()的用法类似于C语

Java中的大数据处理与分析架构

Java中的大数据处理与分析架构 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来讨论Java中的大数据处理与分析架构。随着大数据时代的到来,海量数据的存储、处理和分析变得至关重要。Java作为一门广泛使用的编程语言,在大数据领域有着广泛的应用。本文将介绍Java在大数据处理和分析中的关键技术和架构设计。 大数据处理与