20 分页:较小的表

news2024/10/4 6:34:26

目录

简单的解决方案:更大的页

混合方法:分页和分段

多级页表

详细的多级示例

超过两级

​编辑地址转换过程:记住TLB

反向页表

将页表交换到磁盘


        

之前提到的一个问题:就是页表太大,假设一个 32 位地址空间(232 字节),4KB(212 字节)的页和一个 4 字节的页表项。一个地址空间中大约有一百万个虚拟页面(232/212)。乘以页表项的大小,你会发现页表大小为 4MB。然后如果开的进程比较多的话,那整个内存中,需要很多的空间来存放页表了。

这里上面的空间数据的计算,可以去了解。

简单的解决方案:更大的页

这里提到了一个解决方法,使用更大的页,32位地址空间为例,假设用16KB的页。所以,有18位的VPN加上14位的偏移量。假设每个页表项还是4字节,现在页表中有218项,每个页表的大小也就变成了1MB。

多种页的大小

在现在的体系结构中,都支持多种页的大小。通常使用的是一个比较小的数据。但是向数据库管理之类的,为了让TLB大概率的命中,减小TLB的压力,所以可以申请一个比较大的页表。同时也只占用一个TLB。记住这样不是为了节省页表空间。但是采用多种页的大小,是比较复杂的。所以,有时只需要想一些应用程序暴露一个接口,让他们直接请求内存页。

但是大内存页会出现每个页内存的浪费,你可以想到,有些应用程序就使用不了那么大的内存,从而导致了内部碎片。因此,在绝大数的情况下面,也就使用的是较小的页:4KB。

混合方法:分页和分段

这里是一个例子,简单分析一下,是这样的,将堆栈和代码的部分,映射到物理空间上面,但是因为有很多的地方,用不到,所以也就有了很多的无效项,是比较浪费的,这个只是16KB,如果大的话,就会更浪费。

因此使用的方法不是为每个地址空间提供单个页表,而是为每个逻辑段提供一个。上面的例子中,可以会提供三个给,栈堆,还有代码。

在分段中,需要一个基址寄存器保存该段的页表的物理地址,界限寄存器指示页表的结尾(即有几个有效页)

有个简单例子,32位虚拟空间包含4KB的页面,并且地址空间分为4个段。00 是未使用的段,01 是代码段,10 是堆段,11 是栈段。

在硬件中,所以就需要有这三对的寄存器。在进行上下文切换的时候,不许改变这些寄存器,反映新的运行进程的页表位置。

当TLB没有命中的时候,硬件需要用分段位(SN)来确定哪个基址和界限对。然后硬件将其中的物理地址和VPN结合,形成页表项的地址。这种当时大大节省了空间,那边需要几个页表,也就给分配几个,不会出现内存分配过大的问题,也通过限制或者界限寄存器,可以判断出访问的时候有没有出现越界的情况,栈和堆之间没有分配的页不在占用页表中的空间。

但是上面的这个方法并不是完美的,因为分段技术,导致不是很灵活,如果有个稀疏的堆,会导致大量的页表浪费,会出现外部碎片,因为页表可以是任意大小了。寻找空间比较复杂。

多级页表

因为上面的种种问题,然后提出了一个多级页表:将页表分成页大小的单元。如果整个页的页表项无效,也就不分配,使用页目录最终页表的页是否有效。可以反映出页表的页在哪里,或者页表的整个页不包含有效页。

看右边的,页目录将页表的两个页标记为有效。这个就是工作过程,也就释放一些帧用于其他用途。从这里看出在多个页目录项中,有有效位和页帧号,当有效位为1的时候,表示的是该项指向的页表中,至少有一页是有效的。

讲一下他的优势:首先,页表分配的页表空间和正在使用的地址空间内存量成比例,因此通常很紧凑,并且支持稀疏的地址空间。

然后,页表的每个部分可以整齐的放入一个页中,更加容易管理内存。可以在增长页表或者分配的时候获取下一个空闲页。线性的话,整个页表也就必须在连续的物理内存过中,这样的话寻找起来也就是比较困难的,但是现在的话,可以把页表页放到物理内存的任何位置。

但是这个也是有成本的,当TLB在没有命中的时候,内存需要加载两次,另一个点,就是这样做是比较复杂的。

详细的多级示例

在书中的例子讲述的是一个利用一个只有16kB的小地址空间,然后通过对这个地址空间的多级分页,然后达到需要的效果,着重总结几个点吧

  • 在整个虚拟页中,不一定所有的页都是含有数据的,所以我们只需要按照页目录中页表页可以存储的页的大小去分析只需要映射几个页

  • 获取VPN,首先是需要通过页目录索引,拿到,这个页存在在那个页表页中,如果页目录是无效的,所以就会出错。

  • 当获取到是哪个页的时候,然后在看存在于这个页表页中的那个页表中,最后获取到页表项。

超过两级

在很多的时候,可能会需要多级的页表去解决这个问题,其实里面的步骤都是一样的,也就是将页目录拆分,然后再添加页目录,就是一个层层嵌套的过程,也没有什么过多需要注意的地方。

地址转换过程:记住TLB

用算法的方式展现一下流程:

在任何复杂的多级页表访问发生之前,硬件首先检查TLB,在命中是,物理地址直接获取到,没有命中的时候。才需要执行完整的多级查找。可以看到传统的两级页表的成本:两次额外的内存访问来查找有效的转换映射。

反向页表

只需要一个页表来记录,其中每个项代表的是系统的每个物理页。页表项告诉我们哪个进程正在使用此页,以及该进程的哪个虚拟页映射到物理页中。这种扫描是比较昂贵的,所以采用了散列表去加速查找。

将页表交换到磁盘

如果之前接触到磁盘的时候,可以知道有个交换区,也就类似吧,在之前,都假设页表位于内核拥有的物理内存中,但是知道这样会减少行内,一些系统将页表,放入到内核虚拟内存中,从而系统在内存压力较大时候,将这些交换到磁盘。

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

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

相关文章

如何进行资产梳理(信息收集)

前言 渗透测试流程 线路一:渗透测试人员 1.域名收集--(备案收集) 1.1在线收集子域名 1.1.1 站长之家 1.1.2 IP138网站 1.1.3 查子域 1.1.4 RapidDNS 1.1.5 聚名 1.1.6 Crt.sh 1.1.7 googleHack 1.2工具和资产测绘收集子域名 1.2.1 oneforall(最好用,最全面) 1.2.…

火山引擎VeDI:A/B测试平台指标能力升级,助力企业提升精细化运营效率

在数字化浪潮的推动下,数据分析与精细化运营已成为企业提升竞争力的关键。近日,火山引擎A/B测试DataTester完成了指标能力的全面升级,为企业在流量竞争激烈的市场中提供了更强大、更可信的数据支持。 此次升级亮点在于引入了“按某个属性去重…

AI大模型探索之路-训练篇22: ChatGLM3微调实战-从原理到应用的LoRA技术全解

系列篇章💥 AI大模型探索之路-训练篇1:大语言模型微调基础认知 AI大模型探索之路-训练篇2:大语言模型预训练基础认知 AI大模型探索之路-训练篇3:大语言模型全景解读 AI大模型探索之路-训练篇4:大语言模型训练数据集概…

令牌桶算法:如何优雅地处理突发流量?

令牌桶算法的介绍 在网络流量控制和请求限流中,令牌桶算法是一种常用的策略。那么,令牌桶算法到底是什么呢?它的工作原理又是怎样的呢?让我们一起来探索一下。 令牌桶算法,顾名思义,就是有一个存放令牌的…

云原生技术解析

云原生的概念 云原生是一种软件架构和部署方法,旨在利用云计算的优势,以更灵活、可扩展和可靠的方式构建和部署应用程序。它主要关注在容器、微服务、自动化和持续交付等方面。 云原生技术是指以云计算作为基础,以平台和工具为依托&#xff0…

大规模 RGB LED灯控系统 Lumos:创新与智能化的融合

灯控系统:创新与智能化的融合 在现代照明技术不断进步的背景下,灯控系统的应用已经从简单的开关控制,发展到能够进行复杂程控操作的智能化管理。我们推出的新一代灯控解决方案,凭借其高度的可配置性和跨平台兼容性,已…

Hadopp入门之基础概念

Hadoop概述 Hadoop是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构主要解决海量数据的存储和海量数据的分析计算问题广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈 Hadoop优势 高可靠性:Hadoop底层维护多个数据副本&…

Linux基础之进程-fork()函数的详解

目录 一、前言 二、fork()函数 2.1 fork()函数的基本概念 2.2 问题一的解答 2.3 问题二的解答 2.4 问题三的解答 2.5 问题四的解答 2.6 问题五的解答 一、前言 在上节内容中我们已经学会了使用我们的getpid()和我们的getppid()去查看我们进程的pid,并且学习到…

通过Mendix Portal管理应用整个生命周期

一、前言 大家常常会听到Mendix是一个统一的平台,怎么理解这个统一平台呢?它指的是帮助企业搭建一个统一的开发平台,管理应用的整个生命周期,之前大家更多地关注在应用开发层面,而开发只是整个生命周期的一环。 从上图…

华为手机恢复出厂设置后怎么还原数据?该如何预防数据丢失?

华为手机恢复出厂设置是将手机恢复到出厂时的初始状态,同时会删除所有用户数据和个人设置。如果不做任何预防措施,在恢复出厂设置后,您将丢失手机上的所有数据。那华为手机恢复出厂设置后怎么还原数据呢?以下是关于如何在华为手机…

柔性数组+结构体类型转换

柔性数组&#xff1a;在结构体中声明的时候仅作为占位符&#xff0c;好处是地址是连续的 强制类型转换&#xff1a;可用于通信双方进行信息交流 #include <iostream> #include <string.h>struct DataWater {int count;float size;char buf[0]; }; // dbuf相当于是…

GLU(Gated Linear Unit) 门控线性单元

文章目录 一、RNN二、GLU2.1 整体结构2.2 输入层(Input SentenceLookup Table)2.3 中间层(ConvolutionGate)2.4 输出层(Softmax)2.5 实验结果2.6 实现代码 三、RNN与GLU的对比参考资料 GLU可以理解为能够并行处理时序数据的CNN网络架构&#xff0c;即利用CNN及门控机制实现了RN…

UKP3d,修改管道长度或标高的方法

南京用户问&#xff0c;请问这个起末点标高可以修改么&#xff1f;如图&#xff1a; 上述起末点的标高是不可以修改&#xff0c;用户没有详细阐述自已想要的结果。可能是以下几种场景&#xff0c;希望能帮助到用户&#xff1a; 1.修改管道长度&#xff1a; 1.1.(管道在模型的…

各种类型的背景音频音效,不同风格的背景音乐素材

一、素材描述 本套背景音乐素材&#xff0c;大小1.76G&#xff0c;58个压缩文件。 二、素材目录 8支简短精致的企业标志片头音乐.zip Avril 伴奏收藏 Wish you were here.zip 《带我回家》带给人温暖感动的男声歌曲 .zip 《光荣时刻》震撼激烈的英雄史诗电影音乐素材.zip…

风扇开启执行逻辑

执行流程 public static void businessExecutionWork(){//以下为业务逻辑部分System.out.println("1、根据电池包控制风扇服务执行 开始!");//1、获取电池包电压、电流、环境温度//获取电池包电压、电流、环境温度ObtainBatteryDataService obtainBatteryDataServic…

分享一个适用于 Vue3.x 非常好用的组件库【Naive UI】

一、Naive UI 介绍 Naive UI 是一种简单易用、不太复杂的用户界面&#xff08;UI&#xff09;框架&#xff0c;主要用于Web应用程序的开发。它提供了超过80个组件&#xff0c;覆盖了表格、表单、弹窗、图表等多个方面&#xff0c;这些组件不仅功能强大&#xff0c;而且高度可定…

tomcat 设置JVM 参数

tomcat 启动的服务 设置jvm 设置的文件目录&#xff1a; /tomcat/bin/catalina.sh 添加设置参数&#xff1a; JAVA_OPTS“$JAVA_OPTS -server -Xms1024m -Xmx4096m -XX:MetaspaceSize1024m -XX:MaxMetaspaceSize2048m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/se…

C++可变参数模板类通过递归和特化方式展开

可变参数模版类有2种方式展开参数包&#xff1a;通过继承和通过递归特化。在此只举例一个后着的例子以阐述展开的方式和过程。这些内容其实书上都有&#xff0c;我只是在看《深入C11 代码优化与工程应用》一书中遇到了些困惑&#xff0c;可能书中的写法与我的理解不对版&#x…

【C++历练之路】哈希思想的应用——位图、布隆过滤器

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;我们使用hash思想学习了哈希表&#xff0c;进行了模拟实现unordered_set与unordered_map。这些都是用hash思想实现出来的数据结构&#xff0c;今天我们来学习一下hash的应用——位图、布隆过滤器。 目…

课题组里有一个卷王是什么体验?

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…