C语言内存精讲系列(十一):内存分页机制 —分页、页表、MMU、TLB、页表内存权限

内存分页机制 —— 虚拟地址映射的 “精细操作”

同学们好!上节课我们聊到,用 “整个程序” 作为虚拟地址和物理地址的映射单位,虽然解决了地址隔离问题,但有个大麻烦 ——粒度太大。比如一个 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):物理内存的页(真实存在于内存条的 “页”);</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值