文章目录
1. 前言
在现代操作系统中,分页存储管理是一种重要的内存管理技术,它能够高效地管理进程的内存使用,避免外部碎片,提高内存利用率。本文将详细介绍分页存储管理的基本概念、工作原理、页表管理以及其优缺点。
2. 分页存储管理概述
分页存储管理(Paging)是一种将进程的逻辑地址空间划分成固定大小的页(Page),并将物理内存划分成相同大小的页框(Frame),进程的页可以被映射到物理内存的任意页框中。
2.1 主要特点
- 固定大小的页框:物理内存和逻辑内存按照相同大小的页进行划分,避免外部碎片问题。
- 地址映射:通过页表(Page Table)来管理逻辑地址到物理地址的映射关系。
- 非连续存储:进程的不同页可以分散存放在物理内存的不同页框中。
3. 分页存储管理的工作原理
3.1 逻辑地址与物理地址
在分页存储管理方式中,一个逻辑地址由两个部分组成:
- 页号(Page Number,P):用于索引页表,找到对应的物理页框。
- 页内偏移量(Offset,W):表示页内的具体位置。
物理地址计算方式:
物理地址
=
页框号
×
页大小
+
页内偏移量
\text{物理地址} = \text{页框号} \times \text{页大小} + \text{页内偏移量}
物理地址=页框号×页大小+页内偏移量
例如:
- 逻辑地址为
(P, W) = (2, 100)
- 页表中
Page 2
对应的页框号为5
- 假设页大小
4KB = 4096
- 物理地址 =
5 × 4096 + 100 = 20480 + 100 = 20580
3.2 地址映射过程
- CPU 生成逻辑地址
(P, W)
。 - 查找页表,找到
Page P
对应的Frame
。 - 计算物理地址:
Frame × Page Size + W
。 - 访问物理内存,读取或写入数据。
4. 页表管理
由于进程的页可能分散存放在物理内存的不同位置,因此需要页表来记录逻辑页到物理页框的映射关系。
4.1 页表结构
页表是一个数组,每个页表项(Page Table Entry, PTE)包含:
- 页框号(Frame Number):映射到的物理页框编号。
- 状态位:
- 存在位(Present Bit):标记页是否在物理内存中。
- 修改位(Dirty Bit):标记页是否被修改,以决定是否需要回写到磁盘。
- 访问位(Access Bit):标记最近是否被访问,用于页置换算法。
示例页表:
逻辑页号 § | 物理页框号 (Frame) | 存在位 | 修改位 | 访问位 |
---|---|---|---|---|
0 | 3 | 1 | 0 | 1 |
1 | 7 | 1 | 1 | 1 |
2 | 5 | 1 | 0 | 0 |
3 | - | 0 | 0 | 0 |
4.2 多级页表
对于大规模内存,单级页表可能会占用过多空间,因此操作系统通常采用多级页表来减少页表的存储开销。常见的多级页表包括:
- 二级页表(常见于32位系统)
- 三级页表(常见于64位系统)
多级页表的思路:
- 逻辑地址拆分成多个部分,先查找一级页表,再查找二级页表,最终找到物理地址。
4.3 快表(TLB)
由于页表存储在内存中,每次访问页表会增加一次内存访问时间。为提高效率,CPU 采用**快表(Translation Lookaside Buffer, TLB)**进行地址缓存:
- TLB 是一个高速缓存,存储最近访问的页表项。
- 如果TLB 命中,地址转换只需一步。
- 如果TLB 未命中,则需要访问页表,更新 TLB。
5. 页表管理中的问题
5.1 内部碎片问题
虽然分页存储消除了外部碎片,但由于页的大小是固定的,可能会造成内部碎片(即分配的页未完全使用)。
5.2 页表占用的内存
对于大进程,页表可能会很大,消耗大量内存,因此需要采用多级页表或反向页表进行优化。
5.3 页置换
当物理内存不足时,操作系统需要进行页置换,将不常用的页换出磁盘,腾出空间。常见的页置换算法:
- FIFO(先进先出):移除最早进入的页。
- LRU(最近最少使用):移除最近最少被访问的页。
- Clock(时钟算法):改进的 LRU,使用访问位判断替换页。
6. 分页存储的优缺点
6.1 优点
✅ 消除了外部碎片:由于页是固定大小,不会出现难以利用的小碎片。
✅ 支持进程的动态增长:进程可在运行时动态分配更多的页。
✅ 提高内存利用率:多个进程可以共享相同的页(例如共享库)。
6.2 缺点
❌ 内部碎片:如果进程的最后一页未完全使用,会造成浪费。
❌ 地址转换开销:需要查找页表,增加了内存访问的时间。
❌ 页表占用大量内存:尤其是进程较大时,页表可能非常庞大。
7. 总结
分页存储管理是一种高效的内存管理方式,它通过将逻辑地址空间划分为固定大小的页,并利用页表进行地址映射,从而提高了内存的利用率,并支持进程的动态扩展。然而,它也引入了一定的开销,例如内部碎片和页表存储开销。现代操作系统通常结合 TLB、多级页表和高效的页置换算法来优化分页存储的性能。