网站开发与维护好找工作吗,2022年装修效果图大全,电脑安装手机wordpress,创建网站主题在哪里文章目录 3.1_8 两级页表#xff08;一#xff09;单级页表存在的问题#xff08;二#xff09;如何解决单级页表的问题#xff1f;#xff08;三#xff09;两级页表的原理、地址结构#xff08;四#xff09;如何实现地址变换#xff08;五#xff09;需要注意的几… 文章目录 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 2201M1,048,576个页表项所以一个页表最大需要 2 20 ∗ 4 B 2 22 B 2^{20} * 4B2^{22}B 220∗4B222B共需要 2 22 / 2 12 2 10 2^{22}/2^{12}2^{10} 222/212210个页框存储该页表。 根据页号查询页表的方法K号页对应的页表项存放位置 页表始址 K * 4。 要在所有的页表项都连续存放的基础上才能用这种方法找到页表项。 因此在这个系统当中某个进程光对它的页表进行存储就有可能需要专门分配 2 10 1024 2^{10}1024 2101024个连续的页框。 为每个进程都要分配许多连续的页框这显然是很吃力的完全不具备离散存储的优点。——这是单级页表的第一个明显的缺点。 根据局部性原理可知很多时候进程在一段时间内只需要访问某几个页面就可以正常运行了。因此没有必要让整个页表都常驻内存。 这是单级页表存在的第二个问题。 二如何解决单级页表的问题
问题一 页表必须连续存放因此当页表很大时需要占用很多个连续的页框。 思考我们是如何解决进程在内存中必须连续存储的问题的 答将进程地址空间分页并为其建立一张页表记录各页面的存放位置。——同样的思路再次套用就可用于解决“页表必须连续存放”的问题把必须连续存放的页表再分页。 解决方案 可将长长的页表进行分组使每个内存块刚好可以放入一个分组比如上个例子中页面大小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 2101024个小页表之后由于每个小页表的大小也都是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级页表在访问逻辑地址的时候访存次数是n1次。在不考虑快表机构的情况下
总结