20 分页:较小的表

目录

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

混合方法:分页和分段

多级页表

详细的多级示例

超过两级

​编辑地址转换过程:记住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,在命中是,物理地址直接获取到,没有命中的时候。才需要执行完整的多级查找。可以看到传统的两级页表的成本:两次额外的内存访问来查找有效的转换映射。

反向页表

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

将页表交换到磁盘

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高中数学:平面向量-基本概念

一、定义 有方向,且有大小的量,就叫向量 与之对应的是,数量,只有大小,没有方向 例如 A B → \mathop{AB}\limits ^{\rightarrow} AB→ a → \mathop{a}\limits ^{\rightarrow} a→ 二、相关性质 相等 大小相同…

(超详细讲解)实现将idea的java程序打包成exe (新版,可以在没有java的电脑下运行,即可以发给好朋友一起玩)

目录 实现打包到exe大概步骤 工具准备 1.将java程序文件打包成jar文件 2.准备好jre文件 3.使用exe4j软件打包好 4.最终打包 实现打包到exe大概步骤 1.打包需要满足的条件:将java文件转成jar文件的工具exe4j、 以及需要满足jdk1.8以上(因安装exe4…

【必看】Spring系列面试题

Spring Core Container, AOP, Data Access, Web... 基础 1. 简单介绍Spring 一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。Spring 支持 IoC(Inversion of Control:控制反转) 和 AOP(Aspect-Oriented Pro…

网络隔离状态下,如何可以安全高效地进行研发文件外发?

研发部门的数据传输通常需要保证数据的安全性、完整性和保密性,尤其是当涉及到公司的核心技术、产品设计、源代码等重要信息时。研发文件外发,即研发资料的外部传输,通常涉及到公司的核心技术和商业机密,因此需要采取严格的安全措…

动态NAT

在上一章静态NAT中我们提过了,静态NAT只能一对一映射,无法有效缓解IPV4地址池紧张的问题,那么我们今天来学习一个新的技术——动态NAT,来解决这个问题。 第一章 1.1 动态NAT工作流程 动态NAT基于地址池来实现私有地址和公有地址的…

学习软考----数据库系统工程师29

数据操作 SELECT基本结构 简单查询 连接查询 子查询 聚集函数 分组查询 字符串操作 集合操作 外连接 INSERT INTO语句 DELETE语句 UPDATE语句

融入新科技的SLM27211系列 120V, 3A/4.5A高低边高频门极驱动器兼容UCC27284,MAX15013A

SLM27211是高低边高频门极驱动器,集成了120V的自举二极管,支持高频大电流的输出,可在8V~17V的宽电压范围内驱动MOSFET,独立的高、低边驱动以方便控制,可用于半桥、全桥、双管正激和有源钳位正激等拓。有极好的开通、关…

下载文件名称乱码或变成了随机码

如图 后端是有正常返回附件名称的,浏览器开发工具中也正常显示了这个数据,但是下载下来的文件名称确实一堆随机码. 其实这个问题的原因是因为跨域 查看console: Refused to get unsafe header "content-disposition" 现象,后端传递到前端的fileName不能被识别,下载…

吴恩达2022机器学习专项课程C2(高级学习算法)W1(神经网络):Lab02 TensorFlow构建神经网络

这里写目录标题 实验目的导入训练集并绘制散点图特征缩放处理数据集扩展数据集TensorFlow构建神经网络模型1.设置模型的层2.获取模型信息2.优化模型3.设置模型参数3.开始预测4.转换预测结果 检测神经元的功能1.目的2.准备工作3.第一层的预测与真实数据的对比2.第二层3.神经网络…

【.net core】微信支付基础功能(开发及使用)

注意 微信开发前期准备工作参照:【微信开发】微信支付前期准备工作(申请及配置)-CSDN博客 本文仅提供微信支付下单,付款,回调,退款等基础功能内容,更多微信支付功能请参照微信支付官网:微信支…

GT2712-STBD 三菱触摸屏12.1寸型

GT2712-STBD 三菱触摸屏12.1寸型 GT2712-STBD参数说明:12.1型, SVGA, TFT彩色液晶屏 65536色, 黑色边框, 电源DC24V。 一、三菱触摸屏GT2712-STBD性能规格: [显示部*1*2] . 显示软元件:TFT彩色液晶屏 . GT2712-STBD画面尺寸:12.1寸 . GT2712-STBD…

这三大场景是未来电瓶车充电桩布局的重中之重

电瓶车充电桩主板作为电瓶车充电系统中的核心组成部分,在实际应用场景中发挥着关键作用。 电瓶车充电桩主板作为电瓶车充电系统的核心组成部分,在各种应用场景中发挥着关键作用。下面我们将一起探讨电瓶车充电桩主板未来重点布局的场景。 01、老旧小区—…

PVFS: A Parallel File System for Linux Clusters——论文泛读

ALS 2000 Paper 分布式元数据论文阅读笔记整理 问题 Linux集群作为低成本、高性能并行计算平台,但缺乏并行文件系统的支持,它对于此类集群上的高性能I/O至关重要。 本文方法 本文为Linux集群开发了一个并行文件系统,称为并行虚拟文件系统…

云原生技术发展概述:投身云计算,从拥抱云原生开始

一、云原生的起源 云计算领域正在进行着一场革命,主机虚拟化实现了主机资源的池化,可以看作是云计算的上半场。以容器为基础的云原生真正实现了应用层的弹性,可以看作是云计算的下半场。 图来源:CNCF公开资料 有人说&#xff0c…

AI+文旅|当智慧遇见风景,感受文旅新体验

今年的五一假期,公众出游热度持续升温,全国多地景区再现“人山人海”,在这样的背景下,促使文旅行业不断通过数字化手段,提升旅游体验质量、探索新的服务方式,AI技术的加入为旅游业带来了革命性的变化。智能导游、智能推…

nuxt3.0+scrollreveal动画插件实现页面滚动加载动画效果

项目安装 npm install scrollreveal --save 在src下创建plugins文件夹,写入名为scrollreveal.client.ts的文件。 import { defineNuxtPlugin } from "#app"; import scrollReveal from scrollrevealexport default defineNuxtPlugin((nuxtApp) > {l…

最新微信智能电子名片源码 全开源可二开 智能名片系统开发

在数字化日益深入人心的今天,名片已不再是简单的纸质交换工具,而是成为了一个展示个人或企业形象、促进商务交流的重要窗口。分享一款全新的微信智能电子名片系统,源码开源、可二次开发的灵活性,更在功能上进行了全面升级和优化&a…

docker搭建mysql集群实现主从复制

前言 随着业务的增长,一台数据服务器已经满足不了需求了,负载过重。这个时候就需要减压了,实现负载均衡和读写分离,一主一丛或一主多从。 主服务器只负责写,而从服务器只负责读,从而提高了效率减轻压力。 …

微服务核心01-Maven【项目管理工具】基础

一、Maven 简介 1.1 传统项目管理: 1.2 Maven 的作用 项目构建:提供标准的、跨平台的自动化项目构建方式。依赖管理:管理项目依赖的资源(jar 包),避免资源间的版本冲突问题统一开发结构:提供标…

夜莺监控(Nightingale)上线内置指标功能

Prometheus 生态里如果要查询数据,需要编写 promql,对于普通用户来说,门槛有点高。通常有两种解法,一个是通过 AI 的手段做翻译,你用大白话跟 AI 提出你的诉求,让 AI 帮你写 promql,另一种是平台…