内存分页机制 —— 虚拟地址映射的 “精细操作”
同学们好!上节课我们聊到,用 “整个程序” 作为虚拟地址和物理地址的映射单位,虽然解决了地址隔离问题,但有个大麻烦 ——粒度太大。比如一个 1GB 的游戏,就算你只玩 “登录界面”,也要把整个 1GB 加载到内存;物理内存不够时,还要把 1GB 全写到磁盘,这速度比蜗牛还慢!
那有没有办法 “按需加载”?只把程序当前要用的部分放进内存,暂时不用的留到磁盘?当然有 —— 这就是今天要讲的内存分页机制,它就像我们看电子书时,只加载当前章节,而不是把整本书都加载进来。
一、为什么需要内存分页?—— 解决 “大粒度” 的痛点
先问大家一个问题:你们手机打开微信时,是一下子加载所有聊天记录、朋友圈、视频号吗?肯定不是!只会先加载你最近的聊天页面(比如和家人的对话框),想翻朋友圈时再加载朋友圈的内容 —— 这就是 “按需加载”,效率高。
程序运行也是一个道理:某个时间段内,它只会频繁用到一小部分数据(比如游戏的 “登录界面代码”“当前操作的变量”)。如果按 “页”(固定大小的小块)来分割虚拟地址和物理地址,就能实现:
- 只把 “当前要用的页” 加载到物理内存;
- 物理内存不够时,只把 “暂时不用的页” 写到磁盘,不用整个程序搬家。
这就是分页机制的核心:以 “页” 为最小映射单位,减小换入换出的粒度,提高内存效率。
二、分页机制的基础:什么是 “页”?
“页”(Page)是地址空间被分割成的固定大小的小块,就像把一本书按固定页数(比如每 10 页)分成若干 “章节块”。
1. 页的大小由谁决定?
- 硬件(CPU)支持多种页大小(比如 Intel CPU 支持 4KB、4MB);
- 操作系统选择其中一种(目前 PC 端几乎都选 4KB)。
2. 原创例子:页的分割
假设我们有一个 10KB 的 C 语言源文件(main.c),按 4KB 每页分割:
- 第 1 页(VP0):0~4095 字节(存放
#include和全局变量); - 第 2 页(VP1):4096~8191 字节(存放
main函数的前半部分); - 第 3 页(VP2):8192~10239 字节(存放
main函数的后半部分和printf调用)。
当程序运行时,只要先加载 VP0 和 VP1(登录界面相关代码),VP2(后续功能)暂时留在磁盘,等需要时再加载 —— 这就是 “按需加载”。
三、分页如何实现映射?—— 虚拟页、物理页与磁盘页
分页机制中,地址空间被分成三类 “页”:
- 虚拟页(VP):虚拟地址空间的页(程序看到的 “页”);
- 物理页(PP):物理内存的页(真实存在于内存条的 “页”);</

最低0.47元/天 解锁文章
:内存分页机制 —分页、页表、MMU、TLB、页表内存权限&spm=1001.2101.3001.5002&articleId=151750650&d=1&t=3&u=411634af3669449b8783c95c7bde8fb3)
7364

被折叠的 条评论
为什么被折叠?



