3.1_8 两级页表

文章目录

  • 3.1_8 两级页表
    • (一)单级页表存在的问题
    • (二)如何解决单级页表的问题?
    • (三)两级页表的原理、地址结构
    • (四)如何实现地址变换
    • (五)需要注意的几个细节
  • 总结

3.1_8 两级页表

image-20240314192940164

(一)单级页表存在的问题

image-20240314193726220

  某计算机系统按字节寻址,支持32位的逻辑地址,采用分页存储管理,页面大小为4KB,页表项长度为4B。

  4KB = 2 12 B 2^{12}B 212B,因此页内地址要用12位表示,剩余20位表示页号。

  因此,该系统中用户进程最多有 2 20 2^{20} 220页。相应的,一个进程的页表中,最多会有 2 20 = 1 M = 1 , 048 , 576 2^{20} = 1M = 1,048,576 220=1M=1,048,576个页表项,所以一个页表最大需要 2 20 ∗ 4 B = 2 22 B 2^{20} * 4B=2^{22}B 2204B=222B,共需要 2 22 / 2 12 = 2 10 2^{22}/2^{12}=2^{10} 222/212=210个页框存储该页表。

  根据页号查询页表的方法:K号页对应的页表项存放位置 = 页表始址 + K * 4。

  要在所有的页表项都连续存放的基础上才能用这种方法找到页表项。

  因此,在这个系统当中,某个进程,光对它的页表进行存储,就有可能需要专门分配 2 10 = 1024 2^{10}=1024 210=1024连续的页框

  为每个进程都要分配许多连续的页框,这显然是很吃力的,完全不具备离散存储的优点。——这是单级页表的第一个明显的缺点。

  根据局部性原理可知,很多时候,进程在一段时间内只需要访问某几个页面就可以正常运行了。因此没有必要让整个页表都常驻内存

  这是单级页表存在的第二个问题。

(二)如何解决单级页表的问题?

问题一

  页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。

  思考:我们是如何解决进程在内存中必须连续存储的问题的?

  答:将进程地址空间分页,并为其建立一张页表,记录各页面的存放位置。——同样的思路,再次套用,就可用于解决“页表必须连续存放”的问题,把必须连续存放的页表再分页。

  解决方案

  可将长长的页表进行分组,使每个内存块刚好可以放入一个分组(比如上个例子中,页面大小4KB,每个页表项4B,每个页面可存放1K个页表项,因此每1K个连续的页表项为一组,每组刚好占一个内存块,再将各组离散地放到各个内存块中)。

  另外,要为离散分配的页表再建立一张页表,称为页目录表,或称外层页表,或称顶层页表

问题二

  没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。

  解决方案

  可以在需要访问页面时才把页面调入内存(虚拟存储技术)。可以在页表项中增加一个标志位,用于表示该页面是否已经调入内存。

image-20240314214909174

  缺页中断肯定是在执行某条指令、这个指令想访问到某一个暂时还没有被调入内存的页面而产生的。所以,这个中断信号和当前执行的指令有关。因此,这种中断应该属于内中断。(对于缺页中断的相关内容,在之后会更加详细的介绍)

(三)两级页表的原理、地址结构

  32位逻辑地址空间,页表项大小为4B,页面大小为4KB,则页内地址占12位。

image-20240314195647015

image-20240314195844536

  页号占20位,则进程最多有 2 20 2^{20} 220个页面。

  按照刚才的思路,我们可以把这么大的一个页表,拆分成多个小的分组。每个小分组的大小可以让它刚好能够装入一个内存块。

  我们每个内存块的大小是4KB,而页表项的大小是4B,所以一个页面可以存放1K个页表项。——所以,我们把这个大的页表拆分成一个个的小分组,其中,每个小分组当中也有1024个页表项,如图所示。

image-20240314200222004

  另外,我们给这些“小页表”进行编号,0号页表、1号页表……、1023号页表。

  进行这样的拆分后,我们就把 2 20 2^{20} 220个页表项的大页表,拆分成了 2 10 2^{10} 210个小页表,且每个小页表中有 2 10 2^{10} 210个页表项。

  需要注意“页号”的分配。例如,在原来的大页表当中,页号为1024的页表项,它经过分配以后,它应该是变成了1号页表当中的页号为0的页表项。

  在得到拆分好的 2 10 = 1024 2^{10}=1024 210=1024个小页表之后,由于每个小页表的大小也都是4KB(刚好是内存块的大小),因此每个小页表都可以各自放到一个页框当中。

image-20240314200751294

  所以,为了记录这些小页表最终存放到的内存块的位置。我们需要对这些小页表再建立上一级的表。这个上一级的表就叫做“页目录表”(或顶级页表、外层页表)。

  那么相应的,我们下一级的那1024个小页表就可以称之为“二级页表”。

image-20240314200925893

  在采用这样的两级页表之后,逻辑地址结构也需要发生相应的变化。我们可以把以前20位的页号,拆分成两个部分——第一个部分是10位的,用来表示“一级页号”;第二个部分是10位的,用来表示“二级页号”。(且10位二进制数刚好足够表示0 ~ 1023

image-20240314201310049

(四)如何实现地址变换

image-20240314201413738

  例:将逻辑地址(0000000000, 0000000001, 111111111111)转换为物理地址(用十进制表示)。

分析

  1.按照地址结构将逻辑地址拆分成三部分。

  2.从PCB中读出页目录表始址,再根据一级页号查页目录表,找到下一级页表在内存中的存放位置。

  根据题目信息,可知,要查询的逻辑地址,其一级页号是0,即“页目录表”中的0号表项。(即下图中的第一项,其对应内存块号是3)

image-20240314201733333

  根据一级页表查出,其二级页表存放的物理位置在内存块号为3的地方。于是就可以从内存当中对应位置读出该二级页表。

image-20240314213937030

  根据题目条件,可知逻辑地址当中的“二级页号”是页号1,即查找二级页表中页号为1的页表项,即上图中间的二级页表的第二项。

  3.根据二级页号查表,找到最终想访问的内存块号。

  通过二级页表的查找,可以知道,最终我们想要查找的逻辑地址是在4号内存块中。

image-20240314214135093

  4.结合页内偏移量得到物理地址。

  最后,我们根据所访问的内存块号,结合页内偏移量,得出最终的物理地址。

  我们最终要访问的内存块号为4,并且每个内存块的大小为4KB。那么,该内存块的起始地址为4 * 4096 = 16384。同时,由题目条件可知,页内偏移量转换为十进制之后是1023。

  最终物理地址为:16384 + 1023 = 17407

(五)需要注意的几个细节

  1.若采用多级页表机制,则各级页表的大小不能超过一个页面

例题:

  某系统按字节编址,采用40位逻辑地址,页面大小为4KB,页表项大小为4B,假设采用纯页式存储,则要采用()级页表,页内偏移量为()位?

分析:

  首先,比较容易确定的是“页内偏移量的位数”。页面大小是4KB,且是按字节编址。所以,页内偏移量应该占12位。而剩余的28位就应该是用来表示页号的。

  另外,由于页面大小是4KB,每个页表项大小是4B,所以每个页面可以存放 2 10 2^{10} 210 =1024个页表项。

  由于采用多级页表机制时,各级页表的大小不能超过一个页面。所以,各级页表当中,页表项的个数最多不能超过 2 10 2^{10} 210个。——相应地,各级的页号所占位数不能超过10位。——所以,28位的页号,我们可以把它分成三个部分。

image-20240314215636312

  2.两级页表的访存次数分析(假设没有快表机构)。

  第一次访存:访问内存中的页目录表(顶级页表);

  第二次访存:访问内存中的二级页表;

  第三次访存:访问目标内存单元。

  如果是单级页表,不考虑快表的话,在访问一个逻辑地址的时候只需两次访存。

  可见,两级页表虽然解决了我们之前提出的单级页表的两大问题,但是这种内存空间利用率的上升所同时付出的代价就是,逻辑地址需要更多一次的访存,就会导致我们访问某个逻辑地址的时候就要花费更长的时间。这也是两级页表相比于单级页表的一个比较明显的缺点。

  如果我们继续分析三级页表、四级页表的访存次数……

  会发现,其实有一个规律:n级页表在访问逻辑地址的时候,访存次数是n+1次。(在不考虑快表机构的情况下)

总结

image-20240314220332215

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

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

相关文章

基于51单片机的数控直流可调电源设计[proteus仿真]

181基于51单片机的数控直流可调电源设计[proteus仿真] 电源系统这个题目算是课程设计和毕业设计中常见的题目了,本期是一个基于51单片机的数控直流可调电源设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】,赞赏任意文章 2&#xffe…

动态内存管理(下)

1.C/C程序的内存开辟 C/C程序内存分配的几个区域: 1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中…

谈谈你对Java平台的理解?

从你接触 Java 开发到现在,你对 Java 最直观的印象是什么呢?是它宣传的 “Write once, run anywhere”,还是目前看已经有些过于形式主义的语法呢?你对于 Java 平台到底了解到什么程度?请你先停下来总结思考一下。 今天…

TikTok新手如何起号?环境因素与内容创新技巧

相信很多刚入行的TikTok玩家都遇到过一个难题,那就是账号权重低,播放量在个位数徘徊,其实都是因为还没起号!那么具体如何起号呢?下面小编也给大家分享一下技巧。 一、如何起号 1、明确注册 TikTok 账号的目的 无论是…

怎么把mp4转换成amv格式?如何下载amv格式视频?

MP4(MPEG-4 Part 14)是一种通用的视频文件格式,广泛用于多媒体应用。作为MPEG-4标准的一部分,MP4以其卓越的压缩性能、出色的视频质量和广泛的兼容性成为当前最流行的视频格式之一。 AMV文件格式的介绍 AMV文件格式起源于中国公司…

深入理解JAVA异常(自定义异常)

目录 异常的概念与体系结构 异常的概念: 异常的体系结构: 异常的分类: 异常的处理 防御式编程 LBYL: EAFP: 异常的抛出 异常的捕获 异常声明throws try-catch捕获并处理 finally 面试题: 异常的处理流程 异常处…

计算机网络——OSI网络层次模型

计算机网络——OSI网络层次模型 应用层表示层会话层传输层TCP和UDP协议复用分用 网络层数据链路层物理层OSI网络层次模型中的硬件设备MAC地址和IP地址MAC地址IP地址MAC地址和IP地址区别 OSI网络层次模型通信过程解释端到端点到点端到端和点到点的区别 我们之前简单介绍了一下网…

sqllab第十三关通关笔记

知识点: 登录框处常见的语句(一般都是查询语句) where usernamewhere username""where usernam()where username("")错误注入知识回顾这里使用错误注入 通过admin admin登录发现没有任何回显信息;但是有成功登录的提示 通过bp抓包…

CSPM有必要换吗?目前持有PMP?

从事项目管理岗位的,尤其是国企工作的,建议换一个,但是有进一步发展打算的,可以直接考CSPM-3级更好,PMP持证增持的是CSPM-2级证书,相对来说是个初级证书,CSPM-3级含金量更高。 一、什么是 CSPM…

美众议院通过强制要求 TikTok 剥离的法案; 首个 AI 软件工程师上线丨 RTE 开发者日报 Vol.165

开发者朋友们大家好: 这里是**「RTE 开发者日报」**,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 …

交换机/路由器的存储介质-华为

交换机/路由器的存储介质-华为 本文主要介绍网络设备的存储介质组成。 SDRAM(同步动态随机存取内存) 系统运行内存,相当于电脑的内存; NVRAM(Non-Volatile Random Access Memory,非易失性随机访问存储器…

高等数学相关知识点整理汇总

说明:由于工作原因可能更新不及时,内容逐步完善中… 一、空间解析几何与向量代数 二、多元函数的微分学 三、重积分 四、曲线积分与曲面积分 五、常微分方程 六、无穷级数

基于HarmonyOS ArkTS中秋国庆祝福程序、以代码之名,写阖家团圆祝福

中秋、国庆双节将至,作为程序员,以代码之名,表达对于阖家团圆的祝福。本节将演示如何在基于HarmonyOS ArkUI的SwiperController、Image、Swiper等组件来实现节日祝福轮播程序。 规则要求具体要求如下: 1、根据主题,用…

Flutter 核心原理 - UI 框架(UI Framework)

Flutter 既能保证很高的开发效率,又能获得很好的性能。 这两年 Flutter 技术热度持续提高,整个 Flutter 生态和社区也发生了翻天覆地的变化。目前Flutter 稳定版发布到了3.0,现在已经支持移动端、Web端和PC端,通过Flutter 开发的…

sql注入重学

sql基本操作 基本查询语句 union (必须得是前面的列与后面的列相同才可以查询) 看第二局uses表中的列有3列,而emails中的列只有两列,所有无法成功查询 这就相当于我们再加了一列 group by (分组) 相当于将其分为10列…

力扣大厂热门面试算法题 24-26

24. 两两交换链表中的节点,25. K 个一组翻转链表,26. 删除有序数组中的重复项,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.14 可通过leetcode所有测试用例。 目录 24. 两两交换链表中的节点 解题思路…

硬盘新建分区时选4096扇区 是4K对齐吗?

环境: 固态硬盘 问题描述: 硬盘新建分区时或者格式化选4096扇区 是4K对齐吗 解决方案: 1.选择4096扇区大小,实际上是进行了4K对齐。在传统硬盘格式化时,通常会选择以4096字节(4K)为单位的扇…

html--钢琴

代码 <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>html钢琴</title> <script src"js/js.js"></script> <link href"…

CVE-2022-1310:RegExp[@@replace] missing write barrier lead a UAF

文章目录 环境搭建漏洞分析漏洞利用漏洞触发链RCE原语构造 总结参考 环境搭建 嗯&#xff0c;这里不知道是不是环境搭建的有问题&#xff0c;笔者最后成功的实现了任意地址读写&#xff0c;但是任意读写的存在限制&#xff0c;任意写 wasm 的 RWX 区域时会直接报错&#xff0c…

leetcode刷题日志-108/1382将有序数组转换为二叉搜索树/将二叉搜索树变平衡

由于这两道题思路极其类似&#xff0c;在此统一记录&#xff1a; 108题.将有序数组转换为平衡二叉搜索树 思路&#xff1a;给定的数组已经升序排列&#xff0c;而二叉搜索树中序遍历的结果就是升序&#xff0c;但是仅凭中序遍历不能确定一颗二叉树&#xff0c;但是题目只是说…