在分页存储管理中,一个程序的逻辑地址空间被划分成若干个大小相等的区域,每个区域称为页或页面,并且程序地址空间中所有的页从 0 开始顺序编号。相应地,内存物理地址空间也按同样方式划分成与页大小相同的区域,每个区域称为物理块或页框,与页一样内存空间中的所有物理块也从 0 开始顺序编号。在为程序分配内存时,允许以页为单位将程序的各个页,分别装入内存中相邻或不相邻的物理块中。由于程序的最后一页往往不能装满分配给它的物理块,于是会有一定程度的内存空间浪费,这部分被浪费的内存空间称为页内碎片。
分页系统中页的选择对系统性能有重要影响。若页划分得过小,虽然可以有效减少页内碎片,并提高内存利用率,但会导致每个进程需要更多的页,这样会使分页系统中用于页管理的页表增大,而占用更多的内存空间。若页划分得过大,虽然可以减少页表大小,并提高页的置换速度,但会导致页内碎片增大,而且当一个页大到能装下一个程序时就退化为分区存储管理了。因此页的大小应适中,分页系统中页的大小取决于机器的地址结构,一般设置为 2 的整数幂,通常为 512B~8KB。
在分页存储管理中,程序中的逻辑地址被转换为页号和页内地址。这个转换工作在程序执行时由系统硬件自动完成,整个过程对用户透明。因此用户编程时不需要知道逻辑地址与页号和页内地址的对应关系,只需要使用一维的逻辑地址。
程序的一维逻辑地址空间经过系统硬件自动分页后,形成「页号 + 页内地址」的地址结构。在图 所示的地址结构中,逻辑地址通过页号和页内地址来共同表示。其中,0~11 位是页内地址,即每个页的大小是 4KB;12~31 位是页号,即地址空间最多允许有 1M 个页。一维逻辑地址与页号和页内地址的关系是(注:页长即一页的大小)
一维逻辑地址 = 页号 × 页长 + 页内地址
为了实现分页存储管理,系统主要设置了以下两种表格。
在分页系统中,允许程序所有的页以离散方式分别存储在内存不同的物理块里,为了使程序能够正确运行,必须在内存空间中找到存放每个页的物理块。因此操作系统为每个程序(进程)建立了一张页映射表,简称页表(Page Table),用来存储页号及其映射(装入)的内存物理块号。最简单的页表由页号及其映射的物理块号组成。由于页表的长度由程序所拥有页的个数决定,故每个程序的页表长度通常不同。
为了正确地将一个页装入到内存的某一物理块中,就必须知道内存中所有物理块的使用情况,因此系统建立一张内存分配表来记录内存中物理块的分配情况。由于每个物理块的大小相同且不会改变大小,因此最简单的办法是用一张位示图(Bitmap)来构成内存分配表。位示图是指在内存中开辟若干个字,它的每一位与内存中的一个物理块相对应。每一位的值可以是 0 或 1,当取值为 0 时,表示对应的物理块空闲;当取值为 1 时,表示对应的物理块已分配。此外,在位示图中增加一个字节,来记录内存当前空闲物理块的总数。
在分页存储管理中,系统为每个程序建立了一张页表并存放于内存中 当程序被装入内存但尚未运行时,页表始址(页表在内存中的起始地址)和页表长度(程序逻辑地址空间从页号 0 开始划分出的最大页号)等信息被保存到为该程序(进程)创建的 PCB 中,或保存到请求表中 一旦进程调度程序调度该进程运行时,其 PCB 中保存的页表始址和页表长度信息(或请求表中这两个的信息)便被装入到页表控制寄存器中,基本地址转换过程如图 所示
从基本地址转换过程可知 物理地址 = 物理块号 页长 + 页内地址,由于页表驻留在内存,因此当 CPU 依据指令中的逻辑地址进行操作时,至少要两次访问内存
为了提高地址转换的速度,一种行之有效的方法是在地址转换机构中,增加一个具备并行查找能力的高速缓冲寄存器,又称联想存储器(Associative Memory)来构成一张快表,快表中保存着当前运行进程最常用的页号及其映射的物理块号
在快表中查找和在内存中查找是同时进行的,只不过在内存页表中查找的速度要慢一些,当快表中找到含有该页号的页表项时,则终止内存页表的查找。
由于成本的关系,快表不可能做得很大,通常只存放 32~1024 个页表项 据统计,从快表中能找到所需页表项的概率可达 90% 以上。