本文是在 基本分页存储管理 的基础上对分页管理的优化。在上篇文章中说到,操作系统会为每个进程建立一张页表,实现页号和内存块号之间的对应关系。本文从单级页表存在的问题引出两级页表,以及两级页表如何实现地址的变换。
如何解决页表过大需要连续存储的问题呢?这个问题可以参考进程太大需要连续存储的答案。因为页表必须连续存放,所以可以将页表再分页。
解决方案: 可以将长长的页表进行分组,使每个页面中刚好可以放下一个分组 (如上面的例子中,页面的大小4KB),每个页表项4B,所以每个页面中可以存放1K个(1024)个页表项,因此每1K个连续的页表项为一组,每组刚好占一个页面,再讲各组离散的放在各个内存块中)。这样就 需要为离散的页表再建立一张页表 ,称为 页目录表 ,或外层页表,或顶层页表。
还是面的例子,32位的逻辑地址空间,页表项大小为4B,页面大小4KB,则页内地址占12位,单级页表结构逻辑结构图如下图所示
两级页表如何实现地址转换:
下面以一个逻辑地址为例。将逻辑地址(0000000000,0000000001,11111111111)转换为物理地址的过程。
再解决了页必须连续存放的问题后,再看如何第二个问题: 没有必要让整个页表常驻内存,因为进程一段时间内可能只需要访问某几个特定的页面。
解决方案: 可以在需要访问页面时才把页面调入内存——虚拟存储技术(后面再说)。可以在页表中增加一个标示位,用于表示该页表是否已经调入内存。
(1) 若采用多级页表机制,则 各级页表的大小不能超过一个页面。
举例说明,某系统按字节编址,采用40位逻辑地址,页面大小为4KB,页表项大小为4B,假设采用纯页式存储,则要采用()级页表,页内偏移量为()位?
页面大小 = 4KB,按字节编址,因此页内偏移量为 12 位。
页号 = 40 - 12 = 28位。
页面大小 = 4KB,页表项大小 = 4B,则每个页面可存放1024个页表项。因此各级页表最多包含1024个页表项,需要10个二进制位才能映射到1024个页表项,因此每级页表对应的页号应为10位二进制。共28位的页号至少要分为 3 级。
(2) 两级页表的 访问次数 分析(假设没有页表):
从上面可以看出,两级页表虽然解决了页表需要连续存储的问题,但是同时也增加了内存的访问次数。