3.1_8 两级页表

news2024/9/28 21:29:41

文章目录

  • 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.coloradmin.cn/o/1516757.html

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

相关文章

【Cookie和Session辨析】

1.cookie 1.1什么是cookie Cookie 是一种在客户端(通常是 Web 浏览器)和服务器之间传递信息的机制,用于在客户端存储少量的数据。它由服务器发送到客户端浏览器,然后浏览器会将这些数据存储在本地,并在后续的请求中将…

全球首个 AI 软件工程师 Devin它来了!

如果您想每日获取AI最新新闻,欢迎关注文章底部的公众号 Cognition AI 发布 AI 软件工程师 Devin 初创公司 Cognition 近日发布公告,宣布推出全球首个 AI 软件工程师 Devin,并号称会彻底改变人类构建软件的方式。Devin 擅长长期推理能力,可以自主规划和完成软件项目,并在此…

Kotlin:为什么创建类不能被继承

一、为什么创建类不能被继承 class或data class 默认情况下,Kotlin 类是最终(final)的:它们不能被继承。 示例:data class PsersonBean 反编译data class PsersonBean 生成 public final class PsersonBean 示例&…

智慧路灯杆AI监测应用,让高速出行更安全

高速公路是现代交通出行的重要组成,高速公路上的交通安全也一直是人们关注的焦点。针对更好监测和管理高速公路上的交通状况,可以基于智慧路灯杆打造AI交通监测应用,通过智能感知高速路段的路况、车况、环境状况,实现实时风险感知…

基于SpringBoot的“实验室管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“实验室管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 注册界面 实验室界面 设备界面图 消耗…

linux 安装gradle7.4.2环境

1.下载gradle7.4.2工程 百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/1hoNEFkBJPHAgs9ITAEh3Zg?pwdGJ…

Spring Cloud Alibab 入门搭建,包含Nacos中心,注册服务发现服务,Feign请求,GateWay网关,sentinel限流

一、安装Nacos注册中心 1.1查看Nacos官网,安装Nacos服务,下载源码或者安装包 1.2启动服务,默认端口为8848, 二、创建服务注册&发现 2.1使用脚手架,创建注册服务和发现服务项目,我用的版本是2.6.13&…

多媒体操作流程

! 从左至右依次为:话筒、投影遥控器、ppt演讲笔、幕布升降遥控器、无线投屏连接器 主机箱 投影仪 二、操作流程 1、打开主机电源:最下面两台设备的开关打开 2、打开投影仪:用投影遥控器对准投影仪按开机键(如无需用到…

嵌入式系统中端口号的理解与分析

每当看到有人的简历上写着熟悉 tcp/ip, http 等协议时, 我就忍不住问问他们: 你给我说说, 端口是啥吧! 可惜, 很少有人能说得让人满意... 所以这次就来谈谈端口(port), 这个熟悉的陌生人. 在此过程中, 还会谈谈间接层, naming service 等概念, IoC, 依赖倒置等原则以及 TCP 协议…

Java开发从入门到精通(八):Java的面向对象编程OOP:封装、继承、多态

Java大数据开发和安全开发 (一)Java的封装1.1 什么是封装1.1.1 封装的设计规范1.1.2 代码层面如何控对象的成员公开或隐藏? 1.2 JavaBean(实体类)1.2.1创建实体类1.2.2 实体类有啥应用场景?1.2.3 实体类总结 1.3 static关键字1.3.1 static修饰成员变量…

Groovy语言

1 Groovy介绍 1.1 Groovy介绍 Groovy是一种编程语言,它结合了Java的强大功能和脚本语言的简洁性。它具有动态类型、易读的语法、与Java的紧密集成、脚本编程能力、强大的闭包等特点。 1.2 Groovy SQL介绍 Groovy SQL是 Groovy 编程语言的一部分,用于…

Windows,MacOS,Linux下载python并配置环境图文讲解

Windows 打开python官网 点击download 点击黄色按钮 另存为 打开文件 全选 配置安装路径 安装中 关闭路径长度限制 完成 验证 同时按住winr(win就是空格键左边的东西) 输入cmd 键入python,如果出现版本(红框)即安装成功 MacOS 同理打开python官网 点击最新版本 拖…

LeetCode - 和可被K整除的子数组

974. 和可被 K 整除的子数组 题目描述:一个连续的区间可以被k整除。 一个连续的区间可以被k整除,如果用前缀和就是(arr[r] - arr[l - 1]) / k 0;当然,在计算机语言里面,用除法判断结果是否为0不行,需要用%,(arr[r] -…

使用Make Sense为YOLOv5-5.0制作自定义数据集及应用

详细可参考官方文档: ​​​​​​​培训自定义数据 -Ultralytics YOLOv8 文档 0.使用Make Sense标注数据集 我们在网页上随机下载五张图片用以演示如何使用Make Sense工具进行标注。下载图片存放在指定文件夹中,如下图所示。 Make Sense网页链接&…

【自监督学习算法】

【自监督学习算法】 什么是自监督学习 (SSL) 算法? 自监督学习 (SSL)是一种不断发展的机器学习技术,旨在解决过度依赖标记数据带来的挑战。多年来,使用机器学习方法构建智能系统在很大程度上依赖于高质量的标记数据。因此,高质量注释数据的成本是整个训练过程中的主要…

【Flutter 面试题】await for 如何使用?

【Flutter 面试题】await for 如何使用? 文章目录 写在前面解答补充说明完整代码示例运行结果详细说明 写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51…

01 数据结构引入 和 顺序表

阅读引言: 从本文开始给大家带来我在复习过程中写的数据结构的代码, 分享给需要的同学 一、数据结构引入 1.数据结构解决什么问题 数据结构可以将杂乱无章的数据管理起来, 提高数据的访问效率 计算机处理的对象(数据&#xff09…

Jsp在Javaweb中扮演什么角色?

1.什么是Jsp JSP(Java Server Pages,Java 服务器页面)是一种动态网页技术,它允许在 HTML 页面中嵌入 Java 代码,并由 Web 服务器在请求页面时动态生成 HTML 页面。JSP 通常用于创建动态 Web 内容,如交互式表…

幻兽帕鲁服务器搭建运行遇到的问题详解

幻兽帕鲁服务器搭建运行遇到的问题详解 大家好我是艾西,在个人玩家搭建幻兽帕鲁时会遇到些小问题。今天艾西给把这些问题全部罗列出来并给到解决方案,需要的小伙伴可以通过本篇文章进行详细的解读。 服务器搭建无法进入/服务器搭建失败:这个出…

Android Kotlin知识汇总(一)编程语言

在 2019 年 Google I/O 大会上宣布今后将优先采用 Kotlin 进行 Android 开发。Kotlin 是一种富有表现力且简洁的编程语言,不仅可以减少常见代码错误,还可以轻松集成到现有应用中。如果您想构建 Android 应用,建议您从 Kotlin 开始着手&#x…