分页管理
在分页系统下,一个程序发出的虚拟地址由两个部分组成:页面号和页内偏移
为了解决程序比内存大的问题,我们可以允许一个进程的部分虚拟页面存放在物理页面之外,也就是磁盘上,在需要访问这些外部虚拟页面时,再将其调入物理内存,需要腾出空间时,将暂时不用的内存swap到磁盘
系统对每个进程,都将保存一个页表,该页表记录了虚拟页面到物理页面的映射,每当为一个虚拟页面寻找到一个物理页面后,就要在页面内增加一个记录,来保存该虚拟页面到物理页面的映射;随着虚拟页面进出物理页面,页表的内容页不断发生变化
页表
一个页表项的结构:
缓存禁止 | 访问位 | 修改位 | 保护标识区 | 在内存中 | 物理页面号 |
---|
页表过大问题
对于一个32位寻址的虚拟地址,如果页面大小为4KB,则虚拟页面数最多可以达到\(2^{20}\)个,那么页表的记录条数就为\(2^{20}\)条,这是一个页表过大问题
多级页表
页表被划分成:顶级页表、一级页表、二级页表、三级页表等
顶级页表里面存放的是一级页表的信息
一级页表里面存放的是二级页表的信息
......
最后一级页表存放的才是虚拟页面到物理页面的映射
多级页表节省内存的本质:通过一个顶级页表,为真正有用的页表提供索引
顶级页表号 | 次级页表项 | 页内偏移值 |
---|
页表快速翻译
地址翻译因为增加了内存访问次数而降低了系统效率
如果只使用单级页表,则每次内存访问变为两次内存访问,速度的下降还可以接受;如果使用多级页表或者反转页表,则每次内存访问变为多于两次的内存访问,这样的访存效率下降非常明显
考虑将页面的翻译结果放在缓存中,而不需要在访问该页面的每个地址时再翻译一次,这种存放翻译结果的缓存被成为翻译快表,Translation Look-Aside Buffer,TLB中存放的时从虚拟页面到物理页面的映射,其记录的格式与内容与正常的记录格式与内容一样
TLB虽然是线性结构,但是硬件设计让从中item Ask(virtual-page)
这个操作的时间复杂度是O(1)
的
显然,采用多级页表的分页系统的效率将取决于TLB的命中率。如果命中率很高,则系统效率高;如果命中率低,则系统效率低。例如,Linux使用的是三级页表,按照常理来说,这将使得系统的执行效率大大降低,但许多人并没有感觉到Linux特别慢,这就是因为Linux的TLB命中率高,据称其命中率达98%