页表(Page Table)
页表(Page Table)
概述: 实现虚拟内存的重要数据结构,作用是将虚拟地址映射到物理地址,从而允许操作系统和硬件进行有效的内存管理。虚拟内存技术允许程序使用比物理内存更大的地址空间
基本结构:
虚拟内存被划分为固定大小的页面(通常是4KB、8KB),物理内存被划分为固定大小的页框。然后页表保存着虚拟页面到物理页框的映射关系。
虚拟地址和物理地址都可以分成两部分:
- 页号:页面的编号
- 页内偏移:页面内的偏移量
页表的层级结构: 单一的页表结构可能非常大,查找效率较低。为了优化内存使用和查找速度,操作系统通常会使用多级页表结构:
- 一级页表:包含虚拟地址空间的最上层的页号映射
- 二级页表:用于映射一级页表中的页号进一步细分
- 三级页表:类似地,进一步细化映射关系
页表项(Page Table Entry, PTE): 通常包含
- 物理页框号:该PTE映射到的物理内存页框地址
- 有效位:标记该PTE是否有效。若无效,表示该虚拟页面没有映射到物理内存,可能需要缺页中断(Page Fault)。
- 访问权限:如可读、可写、可执行等权限
- 脏位:标记该页面是否被修改过。若修改过且没有写回磁盘,则表示该页面为脏页面,需进行写回操作
- 引用位:在页交换算法中使用,表示该页面是否最近被访问过
- 缓存控制:指示该页面的缓存行为,如是否允许缓存
页表管理的关键操作:
- 页表的创建与销毁:每个进程通常都会有自己的页表,操作系统在进行进程创建时为其分配页表,在进程结束时销毁页表。
- 页表更新:当进程访问某个虚拟地址时,操作系统需要检查该地址是否有对应的PTE,如果没有,则发生缺页中断,操作系统需要更新页表
- 页表切换:每个进程都有独立的虚拟地址空间。因此,切换进程时需要切换页表。这通常是通过更新页表基址寄存器来完成。
- 页表缓存:为了加速地址转换,现代CPU通常会使用快表(TLB, Translation Lookaside Buffer),这是一个小型缓存,用于存储最近访问的PTE,每次进行地址转换时,CPU会先查询TLB,若为命中,则需要访问页表
页表的管理策略:
- 分页与段式管理: 分页和分段式两种不同的内存管理方式,现代操作系统通常结合这两种方式,分页提供了一种均匀的虚拟地址空间,而分段则根据程序的逻辑结构划分地址空间
- 分配策略:操作系统通常根据需求将内存分配给页表,包括动态分配和按需分配。多级页表可以动态地分配内存,提高内存利用率
- 页交换:操作系统可能将一些页表项映射到磁盘的swap空间中, 称为虚拟内存的交换。当物理内存不足时,操作系统会将不活跃的页面交换出去,腾出空间给新的页面