每个程序都以为自己"独占"了整台电脑

你有没有想过,你的电脑上同时运行着浏览器、音乐播放器、聊天软件,它们是怎么做到互不干扰的?答案就藏在一个叫虚拟内存的机制里。

简单来说,操作系统给每个程序都"画了一张饼"——让每个程序都以为自己独享了一整块连续的内存空间。这块"饼"就是虚拟内存。而真正干活、把这张饼变成现实的,就是分页分段这两大核心机制。

在这里插入图片描述


先搞懂:为什么需要虚拟内存?

物理内存(也就是你的内存条)是有限的,比如16GB。但如果你同时打开十几个程序,它们需要的内存总量可能远超16GB。更麻烦的是,如果让程序直接访问物理内存,A程序一不小心就可能把B程序的数据覆盖了。

虚拟内存的思路很巧妙:给每个程序一个独立的"假地址"空间,再由操作系统和硬件(MMU,内存管理单元)负责把假地址翻译成真实的物理地址。 这样既隔离了程序,又能灵活调度内存。

那具体怎么管理这些地址呢?这就轮到分段和分页出场了。


分段(Segmentation):按"逻辑"切蛋糕

分段的思想非常符合人类直觉——按照程序的逻辑结构来划分内存

一个程序通常包含代码区、数据区、堆区、栈区等。分段机制就把这些区域各自作为一个"段",每个段有自己的名字(段号)和长度。

打个比方:分段就像把一本书分成"前言"“正文”"附录"等章节,每章长度不同,但各有各的用途。

优点: 逻辑清晰,方便做权限保护(比如代码段只读、数据段可写),也利于共享(多个程序共享同一个代码段)。

缺点: 段的长度不固定,时间久了会产生大量外部碎片——就像衣柜里塞满了大小不一的衣服,明明还有空间,却放不下新衣服了。


分页(Paging):把内存切成"标准砖块"

为了解决碎片问题,分页机制登场了。它的核心思想简单粗暴:把虚拟内存和物理内存都切成大小固定的小块。

虚拟内存的小块叫页(Page),物理内存的小块叫页框(Page Frame),大小通常是4KB。程序使用的虚拟页号,通过一张叫页表(Page Table) 的映射表,找到对应的物理页框号。

继续用书的比喻:分页就像把一本书不管三七二十一,全部裁成同样大小的活页纸,再装订成册。你读的是连续的内容,但纸张在物理上可能散落在不同位置。

优点: 几乎没有外部碎片,内存利用率高,也方便把暂时不用的页换出到磁盘(这就是"虚拟内存比物理内存大"的秘密)。

缺点: 页表可能非常庞大。32位地址空间下,页表可能占用数MB内存。为此,现代系统采用了多级页表TLB(转换旁路缓冲器) 来加速地址翻译。


分页 vs 分段,到底谁更强?

对比维度 分段 分页
划分依据 程序逻辑 固定大小
块大小 不固定 固定(如4KB)
碎片问题 外部碎片 内部碎片(页内浪费)
用户可见性 程序员可感知 对程序员透明

实际上,现代操作系统往往两者结合使用——先用分段做逻辑划分,再在每个段内做分页。比如经典的x86架构就采用了"段页式"管理,兼顾了灵活性和效率。


写在最后

虚拟内存是操作系统最精妙的设计之一。分页解决了内存碎片和利用率的问题,分段则保留了程序的逻辑结构。两者配合,才让你的电脑在多任务运行时依然稳如磐石。

下次当你同时打开几十个Chrome标签页时,不妨想一想:背后正是分页与分段机制在默默守护着每一字节的安宁。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐