当前课程知识点:操作系统 > 第六讲 物理内存管理: 非连续内存分配 > 6.4 页表概述 > 6.4 页表概述
接下来
我们对页表进行进一步的介绍
那么在页表里头呢 我们刚才说
页表是负责从逻辑页号
到物理页号之间的转换
那这个转换
它到底在里头是如何进行的
在前面我们讲到过有一个页表
页表负责完成这个转换
那这里我们想说的是
每一个逻辑页面
对应着在页表里头呢
有一个页表项
这个页表项完成这个逻辑页号
到物理帧号之间的转换
那在这个转换过程当中呢
我们还有一条需要说明的就是
页表里的内容
会随着程序的运行而发生变化
这种变化呢 就使得我们有可能
动态的去调整我分配给一个进程的
内存空间的大小
好 再有一个呢就是
这个表放在哪儿呢
这个表它在一个寄存器里
页表基址寄存器
在这个寄存器里 告诉你
这个页表它的起始位置在哪
好 有了你的逻辑页号之后
那我就可以找到相应的表项
那这个表项里头
还有一些啥内容
我们在前面的讨论里头呢是说
里头有页帧号
它的页帧在哪
但是这个页表项里呢不止这些
我们刚才说了 这里有一条动态
我们可以在程序运行的过程当中
来给它分配新的物理帧
放到这个 它的进程地址空间里头
那这时候呢 这种新加入的状态的改变
就是靠这里的这些标志
这里的状态来修改的
那这里头呢是我们常用到的
几个标志位 存在位 修改位 和引用位
存在位是指我们有一个逻辑页号
是否有一个物理页面
物理帧和它相对应
如果有 这个存在位就是1
好 这一条是表示我们这个页
对应的分配的动态性
然后修改位和引用位
是在我们后续的课程内容当中会用到的
修改位是说我对应的这个页面
里面内容是否修改了
然后引用位 是指这个页面
在过去一段时间里
是否有过对它的引用
是否访问过这个页面里的
某一个存储单元
刚才我们在页表中加了几个标志位
那下面呢 我们就来通过
一个实际的过程
来看这几个标志位当中的
存在位在里头作用
好 这是一个实际的系统当中的示例
这是逻辑地址空间 物理地址空间
分页之后 每一页上页的结束页号
页内偏移最后单位
这地方呢是它的假设前提
每页有2的10次方
1024个字节
总共是一个16位的系统
这是每一K算一页 每一K算一页
这是一个示意
好 我们再看在这个
我们前面讲的里头
是我有一个逻辑地址
CPU在执行指令的时候
它转换成一个物理地址
这是32K的
那在这儿呢
16位地址是从0到15
那0到9是页内偏移
10到15是页号
那页表呢 在这里完成这个转换
这个转换 如果说在我们
没有标志位的情况下呢
我是每一个逻辑页号都对应过来
有一个帧号组合起来
找到实际的位置
那现在有了存在位之后呢
我们就可能有些没有
那这个存在位在哪呢
就在这里 那你找过来的时候
有可能某一页找不到
那实际上就说这一页对应过来
没有对应的物理帧号
那这时候 相当于
并没有给它分配相应的存储
这使得我们可以在这里呢
可以有动态的变化
页式存储管理可以让我们
不连续地分配内存空间
但是它也会带来很多的问题
那这儿列的第一个问题
是它的访问性能的问题
我们在没有页表的时候
我要访问一个存储单元
那我给你的是物理地址
物理地址呢 直接去访问
就能拿到你要的东西
但现在因为我们为了实现
非连续内存分配
好 那这时候呢
我们就会加了一个页表在中间
那我每访问一个存储单元的时候呢
我都需要先知道
它逻辑页号对应的物理页帧号是多少
那这个转换都要求我去访问页表
那这样一来的话
我的访问就变成是两次了
先读页表项
看看那个对应的物理页帧号是多少
然后再依据这个页帧号
和页内的偏移合到一起得到物理地址
再去访问实际的内容
这样的话它的读写性能就会大幅度下降
读写量也会大幅度增加
第二个问题是说我们有了一个页表
如果说这时候我的内存地址空间很大
这个页表的存储容量也是不能忽视的
它可能会很大
像我们刚才说那个示例系统里头
32K的物理内存
那 1K占一项 那我就32项
如果每一项占4字节的话
那就是128字节
这个量呢相对来说很小
而我们现在实际系统已经达到了64位
也就是说 我的地址总线
可能会是64位地址总线
如果这时候 你仍然使用
1K作为它的页面的大小
那这个时候你会有多少个页面
2的64次方
页的大小是2的10次方
那就是2的54次方个页面
2的54次方个页面
如果每一个页表项占64位的地址
光地址的话那就是8 8 64
那就要占8个字节
那这样的话你的一个页表项
至少是8个字节
好 实际上如果再加上标志位
它仍然是不够的
假定它就是8个
那这时候2的54次方
每一个占8字节 那
就是2的57次方
那2的57次方的存储区域来存你的页表
这个空间也是足够大的
好 那针对这种页表引入的好处之外
它又带来的麻烦
这些麻烦我们怎么处理呢
那这是给出的两种做法
第一种呢是缓存
那由于我们在程序执行的时候
访问的数据 访问的代码
它都具有一定的相邻性
我访问执行一条指令
我接下来执行的是它的下一条指令
我访问数组的第一个元素
我接下来可能访问是它第二个元素
这时候它们可能都会在一页里头
这种可能性比较大
好 这样一来的话
把你得到的页表项缓存下来
我下一次的时候利用这缓存
极大的可能性
我是可以直接访问到物理内存的
这样的话 就可以把你的
这个访问次数减下来
第二个是说我的页表很大
一个很长的表 那很麻烦
那我们对付这种长的问题
的做法是什么呢
我把它切段 好 间接访问
先找它是在哪个子表里头
然后在子表里再去找
好 这就是我们说的间接访问
这种间接访问
对应过来呢就是多级页表
那我们下面呢
会深入再讨论快表和多级页表
-0.1 Piazza讨论区
--html
-0.2 在线实验平台
--实验平台使用帮助
--平台使用帮助
-0.2在线实验平台
--Raw HTML
-1.1 课程概述
--视频
-第一讲 操作系统概述--练习
-1.2 教学安排
--视频
-1.3 什么是操作系统
--Video
-1.4 为什么学习操作系统,如何学习操作系统
--Video
-1.5 操作系统实例
--视频
-1.6 操作系统的演变
--视频
-1.7 操作系统结构
--视频
-2.1 前言和国内外现状
-2.2 OS实验目标
-2.3 8个OS实验概述
-2.4 实验环境搭建
-2.5 x86-32硬件介绍
-2.6 ucore部分编程技巧
-2.7 演示实验操作过程
--Q6
--Q7
--Q10
-3.1 BIOS
--3.1 BIOS
-3.2 系统启动流程
-3.3 中断、异常和系统调用比较
-第三讲 启动、中断、异常和系统调用--3.3 中断、异常和系统调用比较
-3.4 系统调用
--3.4 系统调用
-第三讲 启动、中断、异常和系统调用--3.4 系统调用
-3.5 系统调用示例
-3.6 ucore+系统调用代码
-4.1 启动顺序
--4.1 启动顺序
-4.2 C函数调用的实现
-4.3 GCC内联汇编
-4.4 x86中断处理过程
-4.5 练习一
--4.5 练习一
-4.6 练习二
--4.6 练习二
-4.7 练习三
--4.7 练习三
-4.8 练习四 练习五
-4.9 练习六
--4.9 练习六
-5.1 计算机体系结构和内存层次
-5.2 地址空间和地址生成
-5.3 连续内存分配
-5.4 碎片整理
--5.4 碎片整理
-5.5 伙伴系统
--5.5 伙伴系统
-第五讲 物理内存管理: 连续内存分配--5.6 练习
-6.1 非连续内存分配的需求背景
-6.2 段式存储管理
-- 6.2 段式存储管理
-6.3 页式存储管理
-6.4 页表概述
--6.4 页表概述
-6.5 快表和多级页表
-6.6 反置页表
--6.6 反置页表
-6.7 段页式存储管理
-第六讲 物理内存管理: 非连续内存分配--6.8 练习
-7.1 了解x86保护模式中的特权级
-第七讲 实验二 物理内存管理--7.1 了解x86保护模式中的特权级
-7.2 了解特权级切换过程
-第七讲 实验二 物理内存管理--7.2 了解特权级切换过程
-7.3 了解段/页表
-第七讲 实验二 物理内存管理--7.3 了解段/页表
-7.4 了解UCORE建立段/页表
-第七讲 实验二 物理内存管理--7.4 了解UCORE建立段/页表
-7.5 演示lab2实验环节
-8.1 虚拟存储的需求背景
-8.2 覆盖和交换
-8.3 局部性原理
-8.4 虚拟存储概念
-8.5 虚拟页式存储
-8.6 缺页异常
--8.6 缺页异常
-9.1 页面置换算法的概念
-9.2 最优算法、先进先出算法和最近最久未使用算法
-第九讲 页面置换算法--9.2 最优算法、先进先出算法和最近最久未使用算法
-9.3 时钟置换算法和最不常用算法
-第九讲 页面置换算法--9.3 时钟置换算法和最不常用算法
-9.4 Belady现象和局部置换算法比较
-第九讲 页面置换算法--9.4 Belady现象和局部置换算法比较
-9.5 工作集置换算法
-第九讲 页面置换算法--9.5 工作集置换算法
-9.6 缺页率置换算法
-第九讲 页面置换算法--9.6 缺页率置换算法
-9.7 抖动和负载控制
-10.1 实验目标:虚存管理
-第十讲 实验三 虚拟内存管理--10.1 实验目标:虚存管理
-10.2 回顾历史和了解当下
-第十讲 实验三 虚拟内存管理--10.2 回顾历史和了解当下
-10.3 处理流程、关键数据结构和功能
-第十讲 实验三 虚拟内存管理--10.3 处理流程、关键数据结构和功能
-10.4 页访问异常
-第十讲 实验三 虚拟内存管理--10.4 页访问异常
-10.5 页换入换出机制
-第十讲 实验三 虚拟内存管理--10.5 页换入换出机制
-11.1 进程的概念
-第十一讲 进程和线程--11.1 进程的概念
-11.2 进程控制块
-第十一讲 进程和线程--11.2 进程控制块
-11.3 进程状态
-第十一讲 进程和线程--11.3 进程状态
-11.4 三状态进程模型
-11.5 挂起进程模型
-第十一讲 进程和线程--11.5 挂起进程模型
-11.6 线程的概念
-第十一讲 进程和线程--11.6 线程的概念
-11.7 用户线程
-第十一讲 进程和线程--11.7 用户线程
-11.8 内核线程
-第十一讲 进程和线程--11.8 内核线程
-12.1 进程切换
-第十二讲 进程控制--12.1 进程切换
-12.2 进程创建
-第十二讲 进程控制--12.2 进程创建
-12.3 进程加载
-第十二讲 进程控制--12.3 进程加载
-12.4 进程等待与退出
-第十二讲 进程控制--12.4 进程等待与退出
-13.1 总体介绍
-13.2 关键数据结构
-13.3 执行流程
-13.4 实际操作
-14.1 总体介绍
-14.2 进程的内存布局
-14.3 执行ELF格式的二进制代码-do_execve的实现
--14.3 执行ELF格式的二进制代码-do_execve的实现
-14.4 执行ELF格式的二进制代码-load_icode的实现
--14.4 执行ELF格式的二进制代码-load_icode的实现
-14.5 进程复制
-14.6 内存管理的copy-on-write机制
-15.1 处理机调度概念
-第十五讲 处理机调度--15.1 处理机调度概念
-15.2 调度准则
-15.3 先来先服务、短进程优先和最高响应比优先调度算法
--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-第十五讲 处理机调度--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
--15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
-第十五讲 处理机调度--15.4 时间片轮转、多级反馈队列、公平共享调度算法和uc
-15.5 实时调度和多处理器调度
-第十五讲 处理机调度--15.5 实时调度和多处理器调度
-15.6 优先级反置
-第十五讲 处理机调度--15.6 优先级反置
-16.1 总体介绍和调度过程
-16.2 调度算法支撑框架
-16.3 时间片轮转调度算法
-16.4 Stride调度算法
-17.1 背景
--17.1 背景
-17.2 现实生活中的同步问题
-第十七讲 同步互斥--17.2 现实生活中的同步问题
-17.3 临界区和禁用硬件中断同步方法
-第十七讲 同步互斥--17.3 临界区和禁用硬件中断同步方法
-17.4 基于软件的同步方法
-第十七讲 同步互斥--17.4 基于软件的同步方法
-17.5 高级抽象的同步方法
-第十七讲 同步互斥--17.5 高级抽象的同步方法
-18.1 信号量
--18.1 信号量
-第十八讲 信号量与管程--18.1 信号量
-18.2 信号量使用
-第十八讲 信号量与管程--18.2 信号量使用
-18.3 管程
--18.3 管程
-第十八讲 信号量与管程--18.3 管程
-18.4 哲学家就餐问题
-18.5 读者-写者问题
-19.1 总体介绍
-19.2 底层支撑
-第十九讲 实验七 同步互斥--19.2 底层支撑
-19.3 信号量设计实现
-第十九讲 实验七 同步互斥--19.3 信号量设计实现
-19.4 管程和条件变量设计实现
-第十九讲 实验七 同步互斥--19.4 管程和条件变量设计实现
-19.5 哲学家就餐问题
-20.1 死锁概念
-第二十讲 死锁和进程通信--20.1 死锁概念
-20.2 死锁处理方法
-第二十讲 死锁和进程通信--20.2 死锁处理方法
-20.3 银行家算法
-第二十讲 死锁和进程通信--20.3 银行家算法
-20.4 死锁检测
-第二十讲 死锁和进程通信--20.4 死锁检测
-20.5 进程通信概念
-第二十讲 死锁和进程通信--20.5 进程通信概念
-20.6 信号和管道
-第二十讲 死锁和进程通信--20.6 信号和管道
-20.7 消息队列和共享内存
-第二十讲 死锁和进程通信--20.7 消息队列和共享内存
-21.1 文件系统和文件
-第二十一讲 文件系统--21.1 文件系统和文件
-21.2 文件描述符
-第二十一讲 文件系统--21.2 文件描述符
-21.3 目录、文件别名和文件系统种类
-第二十一讲 文件系统--21.3 目录、文件别名和文件系统种类
-21.4 虚拟文件系统
-第二十一讲 文件系统--21.4 虚拟文件系统
-21.5 文件缓存和打开文件
-第二十一讲 文件系统--21.5 文件缓存和打开文件
-21.6 文件分配
-第二十一讲 文件系统--21.6 文件分配
-21.7 空闲空间管理和冗余磁盘阵列RAID
-第二十一讲 文件系统--21.7 空闲空间管理和冗余磁盘阵列RAID
-22.1 总体介绍
-第二十二讲 实验八 文件系统--22.1 总体介绍
-22.2 ucore 文件系统架构
-第二十二讲 实验八 文件系统--22.2 ucore 文件系统架构
-22.3 Simple File System分析
-第二十二讲 实验八 文件系统--22.3 Simple File System分析
-22.4 Virtual File System分析
-第二十二讲 实验八 文件系统--22.4 Virtual File System分
-22.5 I/O设备接口分析
-第二十二讲 实验八 文件系统--22.5 I/O设备接口分析
-22.6 执行流程分析
-23.1 I/O特点
--视频
-第二十三讲 I/O子系统--23.1 I/O特点
-23.2 I/O结构
--816C80A0F5E3B8809C33DC5901307461
-第二十三讲 I/O子系统--23.2 I/O结构
-23.3 I/O数据传输
--C58221E14388B9DB9C33DC5901307461
-第二十三讲 I/O子系统--23.3 I/O数据传输
-23.4 磁盘调度
--567A3F1FCBFB3F4C9C33DC5901307461
-第二十三讲 I/O子系统--23.4 磁盘调度
-23.5 磁盘缓存
--C327536B80D25CE79C33DC5901307461
-第二十三讲 I/O子系统--23.5 磁盘缓存
-html
--html