基本分页存储管理学习总结

为了减少内存碎片的产生,提高内存的利用率,非连续分配管理方式被提出。非连续分配管理方式不要求大块的连续内存空间,它把内存划分成适当的小区块, 分散的进行分配,以此来减少内部碎片和提高内存的利用率。
有 基本分页存储管理、基本分段存储管理、段页式存储管理 这 3 种基本的非连续分配管理方式,本文首先对 基本分页存储管理 进行总结。

分页存储管理方式不会产生外部碎片,其平均每个进程只产生半个页帧大小的内部碎片。在该分配方式中,操作系统根据设定的页面大小将内存划分为一个个相同大小的小分区,这些分区被称为物理块或页帧,每个页帧都有一个编号,编号从 0 开始。 而用户进程的逻辑空间也以相同的方式被划分为与页帧相同大小的一个个小分区,这些小分区被称为页或页面。
在分配内存时,操作系统以页帧为单位为各个进程分配内存空间,这些页帧可以不连续,也不区分顺序。进程的每个页面对应一个页帧,它们之间的对应关系通过页表来存放。
当进程需要访问内存时,它给出目标内存单元的逻辑地址,这个地址将被基本地址变换机构(MMU)转换为具体的物理地址然后访问目标内存单元。
由于基本地址变换机构需要借助进程存储在内存中的页表来完成地址转换,因此进程访问内存单元时,实际上要经过两次访存操作。 第一次访问页表,第二次才能访问目标内存单元。
基于此,为了减少访存次数以提高程序的性能,快表(又称联想寄存器 TLB)技术被引入。快表是一种访问速度比内存快很多的高速缓冲存储器, 用来存储当前访问的若干页表项,以加速地址变换的过程。在引入快表后,地址变换时将优先或同步查询快表中的页表项, 如果快表命中,则不再需要访问内存中的页表。如此,一次内存访问就被节省了下来,程序性能得到提升。 (快表可以达到 90% 以上的命中率,它基于局部性原理来对页表项进行缓存)

页表的存储需要连续的内存空间,其大小也会随着进程大小的增加而增加,并且基于局部性原理,其实同一时间内进程不会访问页表中的所有内容。 这些都会降低内存空间的利用率。为了解决该问题,32 位操作系统引入了两级页表,它沿用分页思想再次对页表进行分页,新建的页表被称为页目录或一级页表, 而原来的页表被降级为二级页表,并且它的大小被限制在一个页面内。一级页表存储二级页表所在的页帧号,二级页表维持不变,逻辑地址改为由一级页号和 二级页号以及页内偏移量构成,在进行地址变换时改为先查询一级页表然后再查询二级页表。通过这种方式,二级页表能够被分散分配,并且不需要时刻保存在内存中,只在需要它的时候再装入内存即可。
对于 64 位操作系统,系统需要划分更多层级的页表,这视操作系统和它的架构而定。更多的页表层级也意味着更多的访存次数,每多一级页表就多一次访存,这可以通过快表来解决。

一些概念:

  • 页帧(物理块 Page frame)
    操作系统将内存划分成若干个物理块,这些物理块被称为页帧。每个页帧都有一个编号,编号从 0 开始。

  • 页(页面 Page)
    进程的逻辑空间被分成若干个逻辑块,这些逻辑块被称为页。每个页都有一个编号,编号从 0 开始。

  • 页面大小
    一个页面占多大的内存空间。为了方便地址转换,一般取 2 的整数次幂,在 32 位系统下通常为 4KB。
    页面大小 = 2 ^ 页内偏移量所占位数。

  • 页表(PT)
    每个进程都有一张页表,其用来记录进程中的页号所对应的页帧号。页表由页表项构成,页表项是按顺序连续存放在内存中的,这使得页号可以被隐式包含而不需要实际存储。
    页表项大小 = 至少足以存储最大页号,在 32 位系统下通常为 4B。
    页表大小 = 页表中页表项个数 × 页表项大小。

  • 页表项(PTE)
    页表项由页号和页帧号构成。比如页号为 4,页帧号为 7,表明该进程的第 5 个页面对应内存的第 8 个物理块。

  • 逻辑地址(VA)
    进程中使用的地址都是逻辑地址。逻辑地址由页号和页内偏移量构成,其中,页号所占位数必须足以存储最大页号,页内偏移量所占位数 必须足以表示页面大小。不同架构的操作系统可能使用不一样的存储方式,在一个 32 位操作系统中,通常页号占 20 位(12 ~ 31),页内偏移量占 12 位(0 ~ 11)。

  • 页号(VPN)
    页的编号,标识一个页面。
    页号 = 逻辑地址 / 页面大小 (下取整)。

  • 页内偏移量(VPO)
    指逻辑地址在其所在页的偏移单位数。
    页内偏移量 = 逻辑地址 % 页面大小 (取余)。

  • 物理地址(PA)
    某个实际的存储单元在物理内存中的地址。
    物理地址 = 页帧号 × 页面大小 + 页内偏移量。

  • 页表寄存器(PTR Page-Table Register)
    存放页表在内存中的起始地址和页表长度。进程在未执行时,页表的起址和页表长度放在进程的控制块(PCB)中,当进程被调度时,操作系统会把它们放在页表寄存器中。

  • 内存最大页面数
    = 2 ^ 页号所占位数。

  • 系统可用内存大小
    = 内存最大页面数 × 页面大小。

逻辑地址到物理地址变换的过程:

  1. 根据逻辑地址计算页号 P 和页内偏移量 W。

  2. 比较页号 P 和页表长度 M,如果 P >= M 则触发越界中断。

  3. 从页表中取出页号所对应的页帧号。(页表中页号 P 对应的页表项地址 = 页表始址 + 页号 * 页表项大小,取出该页表项内容 b,即页帧号)

  4. 计算实际物理地址 = b * 页面大小 + W。

posted @ 2025-12-25 21:28  邓加领  阅读(22)  评论(0)    收藏  举报