3.1_8 两级页表
文章目录
- 3.1_8 两级页表
- (一)单级页表存在的问题
- (二)如何解决单级页表的问题?
- (三)两级页表的原理、地址结构
- (四)如何实现地址变换
- (五)需要注意的几个细节
- 总结
3.1_8 两级页表
(一)单级页表存在的问题
某计算机系统按字节寻址,支持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 220∗4B=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个连续的页表项为一组,每组刚好占一个内存块,再将各组离散地放到各个内存块中)。
另外,要为离散分配的页表再建立一张页表,称为页目录表,或称外层页表,或称顶层页表。
问题二
没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。
解决方案:
可以在需要访问页面时才把页面调入内存(虚拟存储技术)。可以在页表项中增加一个标志位,用于表示该页面是否已经调入内存。
缺页中断肯定是在执行某条指令、这个指令想访问到某一个暂时还没有被调入内存的页面而产生的。所以,这个中断信号和当前执行的指令有关。因此,这种中断应该属于内中断。(对于缺页中断的相关内容,在之后会更加详细的介绍)
(三)两级页表的原理、地址结构
32位逻辑地址空间,页表项大小为4B,页面大小为4KB,则页内地址占12位。
页号占20位,则进程最多有 2 20 2^{20} 220个页面。
按照刚才的思路,我们可以把这么大的一个页表,拆分成多个小的分组。每个小分组的大小可以让它刚好能够装入一个内存块。
我们每个内存块的大小是4KB,而页表项的大小是4B,所以一个页面可以存放1K个页表项。——所以,我们把这个大的页表拆分成一个个的小分组,其中,每个小分组当中也有1024个页表项,如图所示。
另外,我们给这些“小页表”进行编号,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(刚好是内存块的大小),因此每个小页表都可以各自放到一个页框当中。
所以,为了记录这些小页表最终存放到的内存块的位置。我们需要对这些小页表再建立上一级的表。这个上一级的表就叫做“页目录表”(或顶级页表、外层页表)。
那么相应的,我们下一级的那1024个小页表就可以称之为“二级页表”。
在采用这样的两级页表之后,逻辑地址结构也需要发生相应的变化。我们可以把以前20位的页号,拆分成两个部分——第一个部分是10位的,用来表示“一级页号”;第二个部分是10位的,用来表示“二级页号”。(且10位二进制数刚好足够表示0 ~ 1023
)
(四)如何实现地址变换
例:将逻辑地址(0000000000, 0000000001, 111111111111)
转换为物理地址(用十进制表示)。
分析
1.按照地址结构将逻辑地址拆分成三部分。
2.从PCB中读出页目录表始址,再根据一级页号查页目录表,找到下一级页表在内存中的存放位置。
根据题目信息,可知,要查询的逻辑地址,其一级页号是0,即“页目录表”中的0号表项。(即下图中的第一项,其对应内存块号是3)
根据一级页表查出,其二级页表存放的物理位置在内存块号为3的地方。于是就可以从内存当中对应位置读出该二级页表。
根据题目条件,可知逻辑地址当中的“二级页号”是页号1,即查找二级页表中页号为1的页表项,即上图中间的二级页表的第二项。
3.根据二级页号查表,找到最终想访问的内存块号。
通过二级页表的查找,可以知道,最终我们想要查找的逻辑地址是在4号内存块中。
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位的页号,我们可以把它分成三个部分。
2.两级页表的访存次数分析(假设没有快表机构)。
第一次访存:访问内存中的页目录表(顶级页表);
第二次访存:访问内存中的二级页表;
第三次访存:访问目标内存单元。
如果是单级页表,不考虑快表的话,在访问一个逻辑地址的时候只需两次访存。
可见,两级页表虽然解决了我们之前提出的单级页表的两大问题,但是这种内存空间利用率的上升所同时付出的代价就是,逻辑地址需要更多一次的访存,就会导致我们访问某个逻辑地址的时候就要花费更长的时间。这也是两级页表相比于单级页表的一个比较明显的缺点。
如果我们继续分析三级页表、四级页表的访存次数……
会发现,其实有一个规律:n级页表在访问逻辑地址的时候,访存次数是n+1次。(在不考虑快表机构的情况下)
总结
相关文章:

3.1_8 两级页表
文章目录 3.1_8 两级页表(一)单级页表存在的问题(二)如何解决单级页表的问题?(三)两级页表的原理、地址结构(四)如何实现地址变换(五)需要注意的几…...
【SysBench】sysbench-1.20 命令速查表
1、通用语法 The general command line syntax for sysbench is: sysbench [options]... [testname] [command] testname is an optional name of a built-in test (e.g. fileio, memory, cpu, etc.), or a name of one of the bundled Lua scripts (e.g. oltp_read_only), or…...

neo4j网页无法打开,启动一会儿后自动关闭,查看neo4j status显示Neo4j is not running.
目录 前情提要User limit of inotify watches reached无法访问此网站 前情提要 公司停电,服务器未能幸免,发现无法访问此网站,http://0.0.0.0:7474 在此之前都还好着 User limit of inotify watches reached (base) [rootlocalhost ~]# n…...
一键卸载和安装 nvidia、cuda、cudnn、tensorrt
1. 卸载 nvidia、cuda、cudnn、tensorrt sudo apt purge \"cuda*" \"libcudnn*" \"libnvinfer*" \"libnvonnxparsers*" \"libnvparsers*" \"tensorrt*" \"nvidia*&…...
LeetCode 389. 找不同
文章目录 一、题目二、C 题解 一、题目 给定两个字符串 s 和 t ,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 示例 1: 输入:s “abcd”, t “abcde” 输出&…...

科技云报道:两会热议的数据要素,如何拥抱新技术?
科技云报道原创。 今年全国两会上,“数字经济”再次成为的热点话题。 2024年政府工作报告提到:要健全数据基础制度,大力推动数据开发开放和流通使用;适度超前建设数字基础设施,加快形成全国一体化算力体系࿱…...

【linux】进程管理:进程控制块、进程号、fork创建进程、特殊进程及exec函数族解析
一、进程的概述 可执行程序运行起来后(没有结束之前),它就成为了一个进程。程序是存放在存储介质上的一个可执行文件,而进程是程序执行的过程。进程的状态是变化的,其包括进程的创建、调度和消亡。程序是静态的,进程是…...

【DL经典回顾】激活函数大汇总(八)(Maxout Softmin附代码和详细公式)
激活函数大汇总(八)(Maxout & Softmin附代码和详细公式) 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不…...

Docker进阶:深入了解 Dockerfile
Docker进阶:深入了解 Dockerfile 一、Dockerfile 概述二、Dockerfile 优点三、Dockerfile 编写规则四、Dockerfile 中常用的指令1、FROM2、LABEL3、RUN4、CMD5、ENTRYPOINT6、COPY7、ADD8、WORKDIR9、 ENV10、EXPOSE11、VOLUME12、USER13、注释14、ONBUILD 命令15、…...

【LeetCode热题100】206. 反转链表(链表)
一.题目要求 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 二.题目难度 简单 三.输入样例 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head [1,2…...

电玩城游戏大厅计时软件怎么用,佳易王计时计费管理系统软件定时语音提醒操作教程
电玩城游戏大厅计时软件怎么用,佳易王计时计费管理系统软件定时语音提醒操作教程 一、前言 以下软件操作教程以 佳易王电玩计时计费软件V18.0为例 说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件计时计费,只需点击开…...

selenium也能过某数、5s盾..
文章转载于:selenium也能过某数、5s盾… 直接安装: pip install undetected_chromedriver运行代码: import undetected_chromedriver as uc import timedriver uc.Chrome(executable_pathrC:\Users\chromedriver.exe,version_main111) driver.get(网…...
mysql笔记:8. 视图
文章目录 创建视图修改视图删除视图通过视图更新数据1. 插入数据2. 更新数据3. 删除数据 查看视图信息1. DESCRIBE2. SHOW TABLE STATUS3. SHOW CREATE VIEW4. 在views表中查看 数据库中的视图是一个虚拟表。同真实的表一样,视图包含一系列带有名称的列和行数据。行…...

指针的基本概念和用法
指针的基本概念 每个变量都被存放在从某个内存地址(以字节为单位)开始的若干字节中 “指针”也被称作“指针变量”,大小为4个字节(在64位编译器中,也优肯为8个字节)的变量,其内容代表一个内存地…...
工作随记:oracle重建一张1T数据量的大表
文章目录 一、删除测试表二、重命名旧表:三、验证:四、检查alert日志和昨天到今天的统计信息任务收集是否正常 一、删除测试表 #xshell登录用户hthis用户连接登录处理: sqlplus ht/"123456" sqlplus ht/"123456"10.8.5.…...

使用timm库的一些知识点
timm(Torch Image Models)是一个在PyTorch上构建的图像模型库,它提供了一系列预训练的深度学习模型,使得研究人员和开发者可以方便地进行图像分类、目标检测等任务。 使用timm库创建模型时,如何确定模型的名字 使用…...

一种基于宏和serde_json实现的rust web中统一返回类
本人rust萌新,写web碰到了这个,基于ChatGPT和文心一言学了宏,强行把这玩意实现出来了,做个学习记录,如果有更好的方法,勿喷。 先看效果,注意不支持嵌套,且kv映射要用>(因为它这个…...

每周一算法:A*(A Star)算法
八数码难题 题目描述 在 3 3 3\times 3 33 的棋盘上,摆有八个棋子,每个棋子上标有 1 1 1 至 8 8 8 的某一数字。棋盘中留有一个空格,空格用 0 0 0 来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局…...

爬虫练习:获取某网站的房价信息
一、相关网站 二、相关代码 import requests from lxml import etree import csv with open(房天下数据.csv, w, newline, encodingutf-8) as csvfile:fieldnames [名称, 地点,价格,总价,联系电话]writer csv.DictWriter(csvfile, fieldnamesfieldnames)writer.writeheader…...
第一个C语言hello world
#include <stdio.h> int main() {printf("hello world ! \n");//打印函数return 0; } "#" : 预处理标志 include <> : 表示预处理的文件在<>内 stdio.h : 标准的io头文件 // io : 输入输出 // printf()…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...