两级页表概述

一、单级页表存在的问题和解决方法

1.问题

某计算机系统按字节寻址,支持32位的逻辑地址,采用分页存储管理,页面大小为4KB,页表项长度为4B。

4 KB = 2^12 B,因此页内地址要用12位表示,剩余20位表示页号。

因此,该系统中用户进程最多有2^20页。相应的,一个进程的页表中,最多会有2^20 B= 1M = 1048576个页表项,所以一个页表最大需要2^20 * 4B= 2^22 B

共需要2^22 / 2^12 = 2^10个页框存储该页表。

根据页号查询页表的方法:

K 号页对应的页表项存放位置=页表始址+K*4

要在所有的页表项都连续存放的基础上才能用这种方法找到页表项

所以需要:专门给进程分配 2^10=1024个连续的页框来存放他的页表

2.解决方法

根据局部性原理可知,很多时候,进程在一段时间内只需要访问某几个页面就可以正常运行了。因此没有必要让整个页表都常驻内存。

问题一:页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。

可将长长的页表进行分组,使每个内存块刚好可以放入一个分组(比如上个例子中,页面大小4KB,每个页表项4B,每个页面可存放1K个页表项,因此每1K个连续的页表项为一组,每组刚好占一个内存块,再讲各组离散地放到各个内存块中)

另外,要为离散分配的页表再建立一张页表,称为页目录表,或称外层页表,或称顶层页表

二、两级页表的原理、地址结构

对于一个32位的计算机:

0~11(12位):页内偏移量

12~21(10位):二级页号

22~31(10位):一级页号(页目录表)

10位的一级页号,可以表示0~1023,每一个一级页号可以对应一个内存块号,通过这个内存块号,可以找到一个二级页表,在二级页表中可以找到二级页号对应的内存块,这个就是内存块号

三、地址转换

1.过程

1.按照地址结构将逻辑地址拆分成三部分(10位,10位,12位)(一级页号,二级页号,页内偏移量)

2.从PCB中读出页目录表始址,再根据一级页号查页目录表,找到下一级页表在内存中的存放位置

3.根据二级页号查表,找到最终想访问的内存块号

4.结合页内偏移量得到物理地址

将逻辑地址(0000000000,0000000001,111111111111)转换为物理地址(用十进制表示)。

第一个10位二进制表示一级页号为0,找到对应的内存块号为3,所以3号内存块中保存着0号二级页表

第二个10位二进制表示二级页号为1,找到对应内存块号为4,所以最终要访问的内存块号就是4.

4号内存块起始地址为:4*4096(4KB)=16384,最终的物理地址为:16384+1023=17407

问题二:没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。

可以在需要访问页面时才把页面调入内存(虚拟存储技术)。可以在页表项中增加一个标志位,用于表示该页面是否已经调入内存。

如果要访问的页面不在内存中,则会产生缺页中断(内中断),然后将目标页面从外存中调入内存

四、细节问题

1.若采用多级页表机制,则各级页表的大小不能超过一个页面

例:某系统按字节编址,采用40位逻辑地址,页面大小为4KB,页表项大小为4B,假设采用纯页式存储,则要采用()级页表,页内偏移量为()位?

页面大小= 4KB =2^12B,按字节编址,因此页内偏移量为12位页号=40 - 12 =28位

页面大小= 2^12B,页表项大小=4B,则每个页面可存放2^12/4 =2^10个页表项

因此各级页表最多包含2^10个页表项,需要10位二进制位才能映射到2^10个页表项,因此每一级的页表对应页号应为10位。总共28位的页号至少要分为三级

一级页号——8位,二级页号——10位,三级页号——10位,页内偏移来那个——12位

两级页表的访存次数:(假设没有快表机构)

1.访问内存中的页目录表

2.访问内存中的二级页表

3.访问目标内存单元

一共三次

五、总结

 

  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值