3.5.3 页面大小

页面大小是操作系统可以选择的一个参数。例如,即使硬件设计只支持512字节的页面,操作系统也可以很容易通过总是为页面对0和1、2和3、4和5等分配两个连续的512字节的页框,而将其作为1KB的页面。

要确定最佳的页面大小需要在几个互相矛盾的因素之间进行权衡。从结果看,不存在全局最优。首先,有两个因素可以作为选择小页面的理由。随便选择一个正文段、数据段或堆栈段很可能不会恰好装满整数个页面,平均的情况下,最后一个页面中有一半是空的。多余的空间就被浪费掉了,这种浪费称为内部碎片(internal fragmentation)。在内存中有n个段、页面大小为p字节时,会有np/2字节被内部碎片浪费。从这方面考虑,使用小页面更好。

选择小页面还有一个明显的好处,如果考虑一个程序,它分成8个阶段顺序执行,每阶段需要4KB内存。如果页面大小是32KB,那就必须始终给该进程分配32KB内存。如果页面大小是16KB,它就只需要16KB。如果页面大小是4KB或更小,在任何时刻它只需要4KB内存。总的来说,与小页面相比,大页面使更多没有用的程序保留在内存中。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

在另一方面,页面小意味着程序需要更多的页面,这又意味着需要更大的页表。一个32KB的程序只需要4个8KB的页面,却需要64个512字节的页面。内存与磁盘之间的传输一般是一次一页,传输中的大部分时间都花在了寻道和旋转延迟上,所以传输一个小的页面所用的时间和传输一个大的页面基本上是相同的。装入64个512字节的页面可能需要64×10ms,而装入4个8KB的页面可能只需要4×12ms。

在某些机器上,每次CPU从一个进程切换到另一个进程时都必须把新进程的页表装入硬件寄存器中。这样,页面越小意味着装入页面寄存器花费的时间就会越长,而且页表占用的空间也会随着页面的减小而增大。

最后一点可以从数学上进行分析,假设进程平均大小是s个字节,页面大小是p个字节,每个页表项需要e个字节。那么每个进程需要的页数大约是s/p,占用了se/p个字节的页表空间。内部碎片在最后一页浪费的内存是p/2。因此,由页表和内部碎片损失造成的全部开销是以下两项之和:

开销=se/p+p/2

在页面比较小的时候,第一项(页表大小)大。在页面比较大时第二项(内部碎片)大。最优值一定在页面大小处于中间的某个值时取得,通过对p一次求导并令右边等于零,我们得到方程:

-se/p2 +1/2=0

从这个方程可以得出最优页面大小的公式(只考虑碎片浪费和页表所需的内存),结果是:

阅读 ‧ 电子书库

对于s=1MB和每个页表项e=8个字节,最优页面大小是4KB。商用计算机使用的页面大小一般在512字节到64KB之间,以前的典型值是1KB,而现在更常见的页面大小是4 KB或8KB。随着存储器越来越大,页面也倾向于更大(但不是线性的)。把RAM扩大4倍极少会使页面大小加倍。