6.2.4. 最佳化 TLB 使用
有两种 TLB 使用的最佳化。第一种最佳化是减少一支程序必须使用的分页数。这会自动导致较少的 TLB 错失。第二种最佳化是借由减少必须被分配的较高层目录表的数量,以令 TLB 查询便宜一些。较少的目录表代表使用的memory较少,这可能使得目录查询有较高的cache命中率。
第一种最佳化与分页错误的最小化密切相关。我们将会在 7.5 节仔细地涵盖这个主题。分页错误经常是个一次性的成本,但由于 TLB cache通常很小而且会被频繁地冲出,因此 TLB 错失是个长期的损失。分页错误比起 TLB 错失还贵了数个数量级,但若是一支程序跑得足够久、而且程序的某些部分会被足够频繁地执行,TLB 错失甚至可能超过分页错误的成本。因此重要的是,不仅要从分页错误的角度、也要从 TLB 错失的角度来考虑分页最佳化。差异在于,分页错误的最佳化只要求分页范围内的程序码与资料分组,而 TLB 最佳化则要求 –– 在任何时间点 –– 尽可能少的 TLB 项目。
第二种 TLB 最佳化甚至更难控制。必须使用的分页目录数量是视行程的虚拟定址空间中使用的地址范围分布而定的。定址空间中广泛多样的位置代表著更多的目录。
一个难题是,定址空间布局随机化(Address Space Layout Randomization,ASLR)恰好造成这种状况。堆叠、DSO、堆积、与可能的可执行档的载入地址会在执行期随机化,以防止机器的攻击者猜出函式或变数的地址。
只有在最大效能至关重要的情况下,才应该关掉 ASLR。额外目录的成本低到足以令这步是不必要的,除了一些极端的状况之外。系统核心能随时执行的一个可能的最佳化是,确保一个单一的映射不会横跨两个目录之间的memory空间边界。这会以最小的方式限制 ASLR,但不足以大幅地削弱它。
程序开发者直接受此影响的唯一方式是在明确请求一个定址空间区域的时候。这会在以 MAP_FIXED 使用 mmap 的时候发生。以这种方式分配定址空间区域非常危险,人们几乎不会这么做。如果程序开发者使用上述方法且允许自由选取地址,则他们应该要知道最后一阶分页目录的边界,及适当挑选所请求的地址。