接下来
我们对页表进行进一步的介绍
那么在页表里头呢 我们刚才说
页表是负责从逻辑页号
到物理页号之间的转换
那这个转换
它到底在里头是如何进行的
在前面我们讲到过有一个页表
页表负责完成这个转换
那这里我们想说的是
每一个逻辑页面
对应着在页表里头呢
有一个页表项
这个页表项完成这个逻辑页号
到物理帧号之间的转换
那在这个转换过程当中呢
我们还有一条需要说明的就是
页表里的内容
会随着程序的运行而发生变化
这种变化呢 就使得我们有可能
动态的去调整我分配给一个进程的
内存空间的大小
好 再有一个呢就是
这个表放在哪儿呢
这个表它在一个寄存器里
页表基址寄存器
在这个寄存器里 告诉你
这个页表它的起始位置在哪
好 有了你的逻辑页号之后
那我就可以找到相应的表项
那这个表项里头
还有一些啥内容
我们在前面的讨论里头呢是说
里头有页帧号
它的页帧在哪
但是这个页表项里呢不止这些
我们刚才说了 这里有一条动态
我们可以在程序运行的过程当中
来给它分配新的物理帧
放到这个 它的进程地址空间里头
那这时候呢 这种新加入的状态的改变
就是靠这里的这些标志
这里的状态来修改的
那这里头呢是我们常用到的
几个标志位 存在位 修改位 和引用位
存在位是指我们有一个逻辑页号
是否有一个物理页面
物理帧和它相对应
如果有 这个存在位就是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次方的存储区域来存你的页表
这个空间也是足够大的
好 那针对这种页表引入的好处之外
它又带来的麻烦
这些麻烦我们怎么处理呢
那这是给出的两种做法
第一种呢是缓存
那由于我们在程序执行的时候
访问的数据 访问的代码
它都具有一定的相邻性
我访问执行一条指令
我接下来执行的是它的下一条指令
我访问数组的第一个元素
我接下来可能访问是它第二个元素
这时候它们可能都会在一页里头
这种可能性比较大
好 这样一来的话
把你得到的页表项缓存下来
我下一次的时候利用这缓存
极大的可能性
我是可以直接访问到物理内存的
这样的话 就可以把你的
这个访问次数减下来
第二个是说我的页表很大
一个很长的表 那很麻烦
那我们对付这种长的问题
的做法是什么呢
我把它切段 好 间接访问
先找它是在哪个子表里头
然后在子表里再去找
好 这就是我们说的间接访问
这种间接访问
对应过来呢就是多级页表
那我们下面呢
会深入再讨论快表和多级页表