操作系统存储管理:页式存储、逻辑地址与物理地址详解
操作系统存储管理:页式存储、逻辑地址与物理地址详解
操作系统中的存储管理是计算机科学中的核心概念之一,其中页式存储是一种重要的内存管理方式。本文将详细介绍页式存储的基本原理、逻辑地址与物理地址的转换机制、页表结构以及物理内存淘汰策略等内容。
一、页式存储
1、CPU 调用数据
存储系统中,操作系统会将外存(磁盘)中的数据调入内存(内存条)中,内存中的数据再给 CPU 调用,CPU 中有涉及到三级高速缓存和寄存器的数据传递。如果 CPU 调用的数据不在内存中,此时 CPU 会产生"缺页中断",从外存调数据到内存中,内存数据就绪后返回到中断位置继续执行。
2、内存存储数据弊端
如果磁盘中的文件有 50G,内存只有 16G,显然内存中只能存放部分磁盘数据,此外内存中的可用空间也不一定是连续的:
- 内存的可用空间不一定够用;
- 内存的可用空间的地址不一定是连续的;
外存中的数据,要先将数据进行切割,然后在内存中分散放置切割后的数据。切割方式不同,内存中的数据的存储调用方式也是不同的,根据切割方式,内存的存储方式分为:
- 页式存储
- 段式存储
3、分页存储
分页存储,又称为页式存储,将用户程序的逻辑地址空间与物理内存空间划分成相同大小的块,一般是 4KB 或 8KB,这个区域称为"页"。该分页机制避免了连续分配内存造成的碎片问题,每个"内存页数据"可以单独映射到不同的"用户程序逻辑地址空间中的物理页框"中。"用户程序中的页"与"物理内存中的页",需要通过"页表"对应起来,页面中 最基础的内容如下:
- 页号:用户程序中的页号,又称为"逻辑页号",用户程序中的地址称为逻辑地址;
- 块号:物理内存中的块号,又称为"页帧号",物理内存中的地址称为物理地址;
4、逻辑地址 和 物理地址 的结构
"用户程序"中查询内存中的数据,程序中已知数据的"逻辑地址"由 CPU 生成,根据逻辑地址查询该地址在哪个"内存页",然后再"页表"中查询该内存页"页号"对应的"块号",然后到内存块中查询内存块对应的"物理地址"。
- 逻辑地址由两部分组成:页号 + 页内地址;
- 页号:表示逻辑地址空间中的具体页;
- 页内地址:表示页内的具体位置,又称为"页内偏移";
- 物理地址由两部分组成:块号 + 页内地址;
- 块号:表示物理地址空间中的具体块,又称为"页帧号"或"页框号";
- 页内地址:表示页内的具体位置,又称为"页内偏移";
逻辑地址/物理地址分为高位和低位,高位是页号或块号,低位是业内地址。数据的逻辑地址与物理地址,页内地址是不变的,变化的只是前面的页号或块号,逻辑地址高位是页号,物理地址高位是物理内存的块号。
5、逻辑地址 和 物理地址 的结构 示例
假设页大小为 4KB = 4096 Byte,也就是212 = 40962^{12} = 4096212=4096字节。4096个存储单元(Byte)如果使用二进制表示,需要使用04095闭区间来表示。4095对应的二进制数字就是0b 1111 1111 1111,该二进制数字是12个1。4096个存储单元的取值范围是0b 0000 0000 00000b 1111 1111 1111。页内地址/页内偏移必须要12位二进制数才能表示,如果页大小是8KB,则需要13位二进制数才能作为该页的页内地址/页内偏移。
给定4KB的页大小的逻辑地址,低位12位是其页内地址或页内偏移,高位就是页号。给定一个逻辑地址,计算物理地址:页大小4 KB,逻辑地址为0b 10 1100 1101 1110,参考下面的页表,计算出其物理地址。
逻辑地址是0b 10 1100 1101 1110,
- 低12位是0b 1100 1101 1110,这是页内地址/页内偏移
- 高2位是0b 10,这是页号,对应十进制数为2,参考页表,页号为2的内存页对应块号为6;
则物理地址的高位是0b 110,低位是页内地址0b 1100 1101 1110,拼接物理地址为0b 110 1100 1101 1110。
6、页式存储 优缺点
页式存储优缺点:
- 优点:
- 利用率高:页式存储页面大小比较小,一般都是4KB/8KB等,内存的空间利用率较高;
- 内存碎片小:内存页很小,因此造成的碎片也很小;
- 分配管理简单:通过页表实现内存管理,该结构比较简单;
- 缺点:
- 系统开销大:内存页小,过于零碎,导致操作系统每次都需要查表根据页号找块号,造成很多系统开销;
- 性能抖动:内存调度时,可能产生性能抖动的现象,如:由于系统开销问题导致的分配更多的内存导致系统性能下降的情况;
下面的表格中整理的页式存储优缺点更加全面:
方面 | 优点 | 缺点 |
---|---|---|
内存利用率 | 减少外部碎片,提高内存利用率 | 可能导致内部碎片 |
管理复杂度 | 简化内存分配和回收 | 页表和多级页表增加了复杂性 |
虚拟内存 | 支持虚拟内存,运行比物理内存更大的程序 | 页面置换引入I/O开销 |
内存保护 | 提供内存保护和进程隔离 | 需要额外的硬件和软件支持 |
多任务并发 | 支持多任务并发运行 | 页表切换可能引入额外开销 |
硬件支持 | 现代硬件(如MMU、TLB)提供高效支持 | TLB未命中时性能下降 |
地址分配 | 进程地址空间可以非连续存放 | 地址转换开销大,依赖TLB加速 |
共享机制 | 方便进程共享内存,减少重复存储 | 共享页可能导致数据同步问题 |
二、逻辑地址 与 物理地址
物理地址 与 逻辑地址:
- 物理地址是内存的实际地址;
- 逻辑地址是应用程序的逻辑内存地址,每个逻辑地址都有与之对应的内存条中的物理地址,由CPU生成;
1、逻辑地址
逻辑地址定义:逻辑地址是由应用程序生成的地址,也称为"虚拟地址",是程序在执行时使用的地址,应用程序通过逻辑地址来访问数据或指令,而不需要直接操作物理内存。
逻辑地址来源:逻辑地址是在用户应用程序运行过程中由CPU生成的地址,开发者或编译器并不直接关心物理内存的具体位置,只关注逻辑地址的空间。
逻辑地址到物理地址的映射:操作系统通过虚拟内存管理机制将逻辑地址映射到物理地址,CPU发出的逻辑地址需要通过页表、段表等映射机制转换成物理地址。
2、物理地址
物理地址定义:物理地址是计算机内存中实际的地址,指向系统物理内存中的具体位置,所有实际的存储操作最终都会转化为物理地址。
物理地址来源:物理地址对应的是计算机硬件层面内存的真实位置,通常由操作系统和内存管理单元(MMU,Memory Management Unit)来管理。物理地址被内存控制器用来访问实际的内存单元,程序虽然使用逻辑地址,但内存访问最终都依赖物理地址。
3、逻辑地址 与 物理地址 区别
比较项 | 逻辑地址(虚拟地址) | 物理地址 |
---|---|---|
定义 | 由CPU生成的程序地址,独立于物理内存 | 计算机物理内存中的实际地址 |
别名 | 虚拟地址(Virtual Address) | 真实地址(Real Address) |
访问方式 | 程序访问的地址,由CPU生成 | 经过地址映射后访问的最终内存地址 |
地址空间 | 每个进程有自己的逻辑地址空间 | 由计算机硬件决定的物理内存空间 |
管理方式 | 由操作系统和MMU(内存管理单元)映射到物理地址 | 由内存控制器直接管理 |
转换方式 | 需要通过页表、段表或MMU转换 | 无需转换,直接用于访问内存 |
可变性 | 在程序运行时可变化,由操作系统动态管理 | 由硬件固定分配,通常不会改变 |
示例 | 进程访问地址0x12345 | 物理内存地址0xABCD345 |
4、逻辑地址 与 物理地址 的转换
在应用程序中,如果要查询内存中的数据,首先要找到数据在用户程序中的逻辑地址,然后去页表中查询该逻辑地址对应的物理内存中的物理地址。逻辑地址与物理地址之间的转换由内存管理单元(MMU,Memory Management Unit)完成的,转换过程如下:
- CPU生成逻辑地址:用户应用程序给出要访问的逻辑地址,并将其传递到CPU,逻辑地址由页号和页内偏移组成,页号用于查找对应的物理页框,页内偏移在页框中保持不变。
逻辑地址 = [页号] + [页内偏移]
查找页表:CPU根据当前进程的页表将逻辑地址转换为物理地址,操作系统维护一个页表,用于记录逻辑页号与物理页框号的映射关系,CPU取出逻辑地址中的页号,然后查找页表,找到对应的物理页框号。
生成物理地址:物理地址由页框号加上页内偏移组成,上个步骤得到了页框号,直接与页内偏移组
合成物理地址。
物理地址 = [物理页框号] + [页内偏移]
- 访问物理内存:
- 如果所需的内存页在内存中,则直接访问该物理地址即可;
- 如果所需的内存页不在内存中,操作系统会触发一个缺页中断(Page Fault),并将该页面从磁盘加载到内存中,最终得到的物理地址指向实际的内存位置。
三、页表结构 和 物理内存淘汰机制
1、页表的结构简介
页表(Page Table)是页式存储管理中的关键数据结构,用于管理逻辑地址到物理地址的映射。每个进程都有自己的页表,页表存储在内存中,由MMU(Memory Management Unit,内存管理单元)负责查询和转换地址。
页表结构字段如下:
- 页号(Page Number):逻辑地址中的索引,用于查找页表项;
- 页帧号(Page Frame Number, PFN):物理内存中的页框号,指向数据所在的物理页;
- 状态位(Valid/Invalid Bit):指示该页是否有效(有效页 = 1,不在内存 = 0),记录该内存页是否从磁盘(外存)中加载到了内存中;
- 如果为0,表示内存页面没有在内存中;
- 如果为1,表示内存页面在内存中;
- 访问位(Accessed Bit):记录该页最近是否被访问过,操作系统可用它进行页面置换;
- 如果为1,表示内存页面最近有被访问过;
- 如果为0,表示内存页面最近没有被访问过;
- 时间限制:如果之前有被访问过,值为1,但是经过一段时间内没有被访问,则会被置为0;
- 修改位(Dirty Bit):记录该页是否被修改过(1 = 已修改,需要写回磁盘);
- 如果为1,表示内存页面最近有被修改过;
- 如果为0,表示内存页面最近没有被修改过;
页表是逻辑地址到物理地址转换的核心,利用状态位、访问位、修改位进行内存管理和页面置换。在现代计算机中,通常采用多级页表或反向页表优化存储和访问性能。
2、物理内存 的 淘汰机制
下图中,操作系统只为该进程分配了4个物理内存页。
对上述表格的状态位进行分析:
系统为该进程的1/1/2/5页号逻辑内存页,分配了2/3/5/6页帧号对应的物理内存页,
3/4页号的逻辑内存页对应的物理内存页对应的数据没有被加载到物理内存中,这部分数据在外存(磁盘)中。
要访问的数据没有加载到物理内存的情况:
如果想要访问3号页逻辑内存中的数据,但是其对应的数据不在物理内存中,
想要将3号页对应的数据从磁盘加载到内存中,需要淘汰掉当前的一个物理内存页,然后再加载对应的磁盘数据。
淘汰物理内存页有一定的规则标准:
已分配的物理内存页的淘汰原则:
要淘汰的是状态位为1的物理内存页,状态位为0说明没有为该逻辑内存分配,
之后根据访问位和修改位来决定要淘汰哪个物理内存页。
优先淘汰访问位为0的物理页;
如果有多个物理页访问位为0,则继续看修改位,优先淘汰修改位为0的物理页;
因为修改位为1,系统开销更大,将内存数据进行修改,会消耗更多的资源和性能,消耗了这么多修改数据,将其直接淘汰不划算。
3、物理内存 的 淘汰机制 总结
物理页面淘汰原则总结:
- 状态位为1:这是前提条件;
- 访问位为0:访问位为0的页面优先淘汰;
- 修改位为0:如果出现多个访问位为0的页面,考虑优先淘汰修改位为0的页面;
- 因为修改位为1,系统开销更大,将内存数据进行修改,会消耗更多的资源和性能,消耗了这么多修改数据,将其直接淘汰不划算。
4、案例分析
某个用户进程有8个逻辑页面,页号为0~7,每个内存页大小为4KB;操作系统为该用户进程分配了4个物理内存存储块,进程的当前页表数据如下:
逻辑地址 转 物理地址 案例计算
计算进程的逻辑地址0x 5148对应的物理地址:
页大小为4KB = 4096 Byte,也就是212 = 40962^{12} = 4096212=4096字节,4096个存储单元的取值范围是0b 0000 0000 0000~0b 1111 1111 1111。页内地址/页内偏移必须要12位二进制数才能表示,
给定4KB的页大小的逻辑地址,低位12位是其页内地址或页内偏移,高位就是页号。
0x 5148对应的二进制数为0b 0101 0001 0100 1000,
- 低12位为0b 0001 0100 1000,这是页内偏移;
- 高4位为0b 0101,这是页号,对应十进制为5,逻辑页号为5;
查询页表,逻辑页号5对应的物理页帧号为3,对应的二进制为0b 0011页帧号,与低12位的页内偏移0b 0001 0100 1000组合,
得到的物理地址为0b 0011 0001 0100 1000,转为16进制为0x 3148。
物理地址 页面淘汰 案例计算
计算如果要访问逻辑页面6,需要淘汰的页面:
从状态位为1的内存页中查找要淘汰的页面,逻辑页号1/2/5/7对应的页面是已经分配物理内存的页面。
上述四个页面中,逻辑页2的访问位为0,说明最近没有访问,淘汰掉逻辑页2。