计算机分页
Virtual Memory in Operating System
Page Table Entries in Page Table
页表基址寄存器(Page Table Base Register, PTBR)
Paging
Paging divides memory into small fixed-size blocks called pages.
When the computer runs out of RAM, pages that aren't currently in use are moved to the hard drive, into an area called a swap file. Here,#The swap file acts as an extension of RAM.
#When a page is needed again, it is swapped back into RAM, a process known as page swapping.
#This ensures that the operating system (OS) and applications have enough memory to run.
Page and Frame: Page is a fixed size block of data in virtual memory and a frame is a fixed size block of physical memory in RAM where these pages are loaded.Think of a page as a piece of a puzzle (virtual memory) While, a frame as the spot where it fits on the board (physical memory).
When a program runs its pages are mapped to available frames so the program can run even if the program size is larger than physical memory.
以上是www.geeksforgeeks.org技术网站文章节选,
上文说道“Page is a fixed size block of data in virtual memory”,但是它之前写的是“When the computer runs out of RAM, pages that aren't currently in use are moved to the hard drive, into an area called a swap file."。请解释,page既然只存在于虚拟内存而非实际的物理内存中,那为什么文中说当计算机RAM消耗光,当前不被使用的pages会被挪到硬盘的swap文件区域?
您的观察非常敏锐,确实点出了一个容易让人混淆的关键点。这个看似矛盾的说法,恰恰揭示了虚拟内存系统工作的核心机制。简单来说,“页”是虚拟内存的单元,而“换出到交换文件”这个动作,操作的是承载页内容的物理内存帧。
下面我将详细解释这个过程,以澄清这个疑问。
🔍 理解虚拟页与物理帧的映射
首先,我们需要明确几个核心概念的关系:
-
虚拟页:如文章所说,是虚拟内存中的固定大小块。它是由操作系统为每个进程创建的、一个连续的地址空间的组成部分。程序代码中访问的内存地址都是虚拟地址。
-
物理帧:是物理内存(RAM)中同等大小的块。它是实际存储数据的地方。
-
页表:这是连接虚拟和物理世界的关键数据结构。它由操作系统维护,存储在物理内存中,记录了每个虚拟页当前映射到了哪个物理帧(如果该页在物理内存中),或者记录该页的内容目前存放在磁盘的什么位置(如果已被换出)。
因此,一个“页”本身是一个虚拟的、逻辑上的概念。程序认为自己拥有大量连续的“页”,但其中只有一部分最活跃的页的内容真正存放在物理内存的“帧”中。
💾 当物理内存不足时会发生什么?
当物理内存(RAM)即将被用完时,操作系统需要腾出空间来满足新的内存需求。这个过程就是页面置换(Page Swapping),其流程如下图所示:

简单来说,文章中说“将页移动到硬盘”,是一种简化的、从程序视角的描述。从程序看来,它的某个页(虚拟地址空间的一部分)变得不可访问了。而实际上是操作系统为了腾出物理内存空间,把这个页所对应的物理帧上的数据转移到了硬盘上。
🔄 程序如何访问被换出的页?
当程序试图访问一个已被换出到硬盘的虚拟页时,CPU在查询页表后发现该页不在物理内存中,会触发一个称为缺页错误的中断。这时,操作系统会:
-
找到一个空闲的物理帧。
-
从硬盘上的交换文件中将所需页的数据读回这个物理帧。
-
更新页表,重新建立该虚拟页到这个物理帧的映射。
-
然后让程序继续执行,此时访问就能正常进行了。
这个过程对程序是透明的,程序感知不到自己的页曾被换出到磁盘,它只是会觉得那次访问稍微“卡”了一下。
💎 总结
所以,您引用的文章并无矛盾,只是表述的视角不同:
-
“页是虚拟内存中的块”:这是从逻辑视角的定义,阐明了页是地址空间的基本单位。
-
“不用的页被移到交换文件”:这是从系统行为视角的通俗说法,描述的是当物理内存不足时,操作系统如何通过移动页对应的物理数据来扩展可用内存容量。
简单来说,文章中说“将页移动到硬盘”,是一种简化的、从程序视角的描述。
从程序看来,它的某个页(虚拟地址空间的一部分)变得不可访问了。而实际上是操作系统为了腾出物理内存空间,把这个页所对应的物理帧上的数据转移到了硬盘上。
以上是你刚刚回复过的内容节选,
请问你说的是:“实际上是操作系统为了腾出物理内存空间,把这个页所对应的物理帧上的数据转移到了硬盘上。“。
而你给出的流程图内节点框里写的是:“释放对应的物理帧“。这个释放物理帧的动作就是上面你说的把“物理帧上的数据转移到了硬盘上“吗?
还有,
解释一下流程图内写的“更新页表条目”--->"标记为不在内存中,并标记磁盘位置",既然已经“直接丢弃页面内容了”,
为什么不直接清空对应的page table entry,
而是“更新页表条目”--->"标记为不在内存中,并标记磁盘位置"呢?
一、“释放物理帧”与“数据转移到硬盘”的关系
“释放对应的物理帧”是最终目标,但是否需要将数据转移到硬盘,取决于页面是否为“脏页”(即页面内容在内存中被修改过,与磁盘上的原始副本不一致)。两者的关系如下:
1. 若页面是“脏页”(被修改过)
-
前置步骤:必须先将物理帧中的数据写入硬盘(即“换出”到交换分区/文件),否则修改会丢失。
-
后续步骤:数据安全写入磁盘后,释放物理帧(该帧变为空闲,可分配给其他页面)。
-
例:你编辑的文档未保存(脏页),关闭前必须先保存到硬盘,才能释放内存空间。
2. 若页面是“干净页”(未被修改)
-
无需转移数据:因为磁盘上已有完整副本(如程序代码页、未修改的只读数据),可直接释放物理帧,无需写回硬盘。
-
例:只读的系统库代码页(如printf函数实现),内存中副本与磁盘完全一致,直接丢弃即可。
结论:“释放物理帧”是统一动作,但仅脏页需要先转移数据到硬盘,干净页可直接释放。流程图中的“释放物理帧”是最终结果,隐含了“脏页需先写回磁盘”的前提。
二、为何“更新页表条目”而非“清空”?
即使页面被换出到磁盘或直接丢弃,页表条目(Page Table Entry, PTE)也不能被清空,核心原因是:虚拟地址空间是程序的“逻辑视图”,必须始终保持完整。
1. 虚拟地址空间的连续性
程序编译时已确定虚拟地址布局(如代码段、堆、栈的范围),虚拟页是虚拟地址空间的组成部分。例如,程序访问虚拟地址0x12345678时,操作系统需要通过页表判断该虚拟页是否在内存中:
-
若直接清空页表条目,程序访问该虚拟页时会因“无映射”而触发错误(类似访问非法内存);
-
而“标记为不在内存中+记录磁盘位置”,则告诉操作系统:“这个虚拟页有效,但当前不在内存,需要时从磁盘X位置加载”。
2. 支持“页面换入”(Page In)
当程序未来再次访问该虚拟页时(如用户重新打开之前关闭的文档),操作系统需要通过页表条目执行“缺页中断”处理:
-
查找页表条目,发现“不在内存”但“磁盘位置已记录”;
-
根据磁盘位置将页面从硬盘读回内存,分配新的物理帧;
-
更新页表条目:标记为“在内存中”,并记录新的物理帧地址。
若页表条目被清空,这一过程将无法进行——操作系统不知道该虚拟页对应的磁盘数据在哪里,程序会崩溃。
3. “直接丢弃页面内容”的场景
你提到的“直接丢弃页面内容”通常针对临时文件或进程退出的情况:
-
若进程已退出,其虚拟地址空间被销毁,此时页表条目会被彻底删除(因为不再需要);
-
若进程未退出,即使页面内容被丢弃(如干净页),虚拟地址仍需保留,因此页表条目必须保留并标记“不在内存”(若未来访问,需从原始磁盘位置重新加载)。
三、总结:页表条目的核心作用
页表条目不仅是“虚拟页→物理帧”的映射表,更是页面状态的“身份证”:
-
记录页面是否在内存(Valid位)、是否被修改(Dirty位)、在磁盘上的位置(Swap Address)等关键信息。
-
即使页面暂时不在内存,只要程序未退出,虚拟地址空间就必须通过页表条目维持逻辑完整性,确保未来访问时能正确“找回”页面。
这就像你搬家时,不会注销身份证(页表条目),而是更新地址(标记磁盘位置)——这样别人(程序)需要找你时,仍能通过身份证(页表)查到新地址(磁盘位置)。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)