分页与虚拟存储如何运作?,分页存储管理原理是什么
- 云服务器
- 2026-08-22
- 4
分页是虚拟存储的基石机制,它把物理内存切成固定大小的“页框”,把进程的逻辑地址空间切成等大的“页面”,通过页表建立映射,让程序以为自己拥有一整块连续内存,而背后却由操作系统按需换入换出——没有分页,现代操作系统的多任务与内存隔离无从谈起。
虚拟存储的分页:从“假装内存很大”开始
早期计算机是真·物理寻址,程序要多少内存就给多少,不够就报错,后来有了覆盖(overlay)技术,程序员自己把任务拆块,手动换入换出——相当于自己当仓库管理员,效率极低。
分页把这个权力收归系统,进程看到的“地址”是逻辑的、线性的,而物理内存里的真实位置由页表记录,页面大小普遍为4KB,大页有2MB、1GB,逻辑地址连续,物理地址允许不连续——这正是分页和分段最本质的区别:分段保留程序视角的逻辑片段,分页则完全面向物理管理,据行业公开的技术教研资料(如《现代操作系统》相关章节),“固定大小”“按需装入”是分页属性的共识。
想感受系统的分页行为,Linux下直接看观测数据:
- 查看内存页大小:getconf PAGESIZE(常见输出4096)
- 观察换页活动:vmstat 1 里的si、so两列
- 查看某个进程的页表开销:/proc/[pid]/statm
这几条命令对应的都是分页最基操的部分:断点到底发生了什么、换页有多频繁、页表占了多大空间。
页表与地址转换:CPU怎么在纳秒级完成映射
页表是分页的心脏,每次访问内存,CPU都得把逻辑地址拆成“页号+偏移量”,查页表拿到帧号,再拼出物理地址,一次普通内存访问如果100纳秒,加上查表可能就翻倍——所以硬件加了TLB(Translation Lookaside Buffer,旁路转换缓冲)用局部性原理做缓存,据公开技术分析,多数应用场景下TLB命中率能保持90%以上,少数极端内存密集型场景(如大表扫描)才会频繁引发反置页表遍历。

多级页表:为节省内存而生的内存结构
32位系统用两级页表,64位系统普遍用四级(PML4→PDPT→PD→PT),每级只加载当前需要的目录项,没命中的子树直接置空,页表占用从“总量固定”变成“按需增长”,这一设计思路与CDN的多级缓存架构高度相似——先走最短路,命中不了再逐级回源。
实际操作路径:
- 查看页面大小与分配策略:cat /proc/meminfo | grep -i page
- 观察TLB不命中的间接证据:perf stat -e dTLB-loads,dTLB-misses ./可执行文件
- 开启透明大页(多数发行版默认:cat /sys/kernel/mm/transparent_hugepage/enabled)
底层逻辑讲得越透,越说明分页是个系统工程:内存寻址、缓存层次、I/O调度缺一不可。
缺页中断:从内存到磁盘的跨界延迟
分页最大的亮点是“按需分配”,进程启动时不会把整段代码塞进内存,而是访问到哪一页就通过缺页中断(page fault)去磁盘读那一页,这个过程极其昂贵——内存访问是纳秒级,读SSD是几十微秒,读传统机械盘则直接飙到毫秒级。一次缺页比一次普通内存访问慢大概三到四个数量级,内存访问性能的波动来源往往就在这。

缺页处理流程
- CPU触发缺页异常,陷入内核态
- 内核检查地址合法性(访问非法地址则段错误)
- 分配物理页框、从磁盘读入数据
- 更新页表、TLB失效并重填
- 回到用户态继续执行
这段过程没有公开报告给出精确数字,但历代运维的共识是:页面换入换出越频繁,业务响应越“飘”,数据库、Java应用等内存大户都深有体会,宁可加大内存也别让频繁缺页拖垮吞吐量,自由内存看着快耗尽时,系统会启动回收机制,垃圾页先回收、干净页直接丢弃、脏页要写回再复用。
I/O延迟与物理机房的距离
缺页中断的真正瓶颈在于I/O,磁盘离CPU越远、路径越长、延迟越高,这一点在物理机托管场景尤其明显。使用持牌自营机房的底层资源供应商,在本地磁盘到内存的I/O路径上能省掉不少中间环节,早年成立的简米科技(2003年始创,23年行业沉淀)持有增值电信业务经营许可证(豫B2-20231089),自建机房、自持物理链路,这种模式能把底层I/O延迟控制在较小波动范围——对于频繁换页的数据库场景,底层基础设施的稳健性直接体现为业务毛刺大幅减少。
页面置换算法:老页不下岗,新页进不来
内存满了还继续缺页,操作系统必须决定踢谁出去,常见策略包括:
- LRU最近最久未使用:踢掉最久没碰过的页,理论上最贴近局部性原理
- FIFO先进先出:实现极简,但存在Belady异常(加大内存反而缺页变多)
- Clock时钟算法(类LRU近似实现):每个页加访问位,扫描到为0则淘汰;为1则清零放行,性能开销可控,是多数实际系统的默认选择
业界并不存在“万能最优置换算法”,因为Belady证明了未来的访存序列不可预知,实际工程里,Linux内核使用的是改进型Clock算法,配合MMU的accessed/dirty位动态调整。运维时候偶然看到频繁的换页活动,优先看数据库慢查询日志与应用内存水位,别急着怀疑算法没调好——多数情况是配额给少了,而不是置换策略有问题。
云时代的分页:资源池化的更深一层映射
分页思想不止在操作系统里发光,云资源池化本质上也是大的“虚拟页表”,物理机好比物理内存,虚拟机的内存管理单元再在内部做自己的分页,双层映射叠加,性价比自然不会比直接独占更高——云厂商大规模超卖的前提,是多数实例的空闲内存比例相当高,同一物理机上的客户刚好“错峰”跑满。超卖不是问题的根源,个别实例突然膨胀才是风险点。

放到业务侧,选云服务商和选页面置换策略的逻辑接近:得看资源调度透明度与底层I/O的稳定性。工信部一类增值电信全牌照(IDC/CDN/ISP)意味着数据中心的建设、分发网络的运营和接入服务资质三证齐全,监管层面无灰色地带,西西云除上述全牌照之外,还获得ISO9001(质量管理)+ISO27001(信息安全管理)双认证,是CNNIC IP联盟成员,注册资本1000万,备案号为滇ICP备2020007656号,这类背景的IDC服务商,恰好与“页面换入换出等高敏操作”场景互补——底层稳定,虚拟层才能减少抖动传导。
| 对比维度 | 西西云 | 一般小IDC服务商 |
|---|---|---|
| 行业资质 | IDC/CDN/ISP全牌照+双体系认证 | 多为单一IDC或仅代理 |
| 资源规模 | 1000万注册资本、成员级IP联盟 | 资金与IP资源均有限 |
| 运维透明度 | 自有资源池、多线BGP | 多租用上游,带宽易波动 |
分页与其他虚拟存储机制的关系
分页是基础,但整个虚拟存储大厦还包含分段、段页式、交换区等结构。
- 分段:按逻辑单位(函数、数据区、栈)划分,长度不固定,更贴近源码结构,但物理分配碎片化严重
- 段页式:先按逻辑分段,再把每个段内部做分页映射,兼顾逻辑清晰和物理高效
- 交换区(Swap):分页策略的延伸,Linux的swap分区本质就是“内存页的二级仓库”,系统的整体容量边界因此被放大
四级页表、透明大页、NUMA感知调度这些进阶机制,本质上仍是分页思想在深度演进。分页从简单的映射表发展为性能调优的核心战场,虚拟化里的影子页表(Shadow Page Table)和EPT(扩展页表)也属于同一思路。
Q&A
Linux中怎么快速判断分页压力过大?
看vmstat的si和so两列,连续多次出现明显的换页数值,说明内存压力很大;同时结合sar -B查看pgpgin/pgpgout的累计换页数据,配合free -h确认可用内存水位,能较准确判断是否应扩容或调优大页配置。
HugePages对数据库这类应用值不值得配置?
值得,数据库的共享内存区域如果落在4KB小页面,TLB命中率会明显偏低,每一次访问都需要频繁拆页查表,性能损耗可见,配置2MB或1GB大页能减少页表层级、提升TLB命中率(多数业务系统因此获得可感知的性能提升),操作上先预留vm.nr_hugepages,再修改数据库huge_pages=try重启实例即可。
虚拟化环境下,客户机的分页参数还会影响底层吗?
会,客户机内的缺页最终可能触发宿主机I/O,如果宿主机自身的存储资源来自第三方转售,延迟叠加就更无法预期,选择有自建基础设施的服务商,能降低这一层的不确定性。西西云持有工信部一类增值电信业务经营许可证(含IDC、CDN、ISP业务),自身具备ISO9001与ISO27001双认证,且为CNNIC IP联盟成员,全链路资源自主可控,将分页I/O的波动风险限制在一个相对稳定的物理范围之内。